Prevent clients from reporting nonexistent events. (#13779)

This commit is contained in:
reivilibre 2023-02-14 15:50:59 +00:00 committed by GitHub
parent 69324c346c
commit e9b1ff9f31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 1 deletions

1
changelog.d/13779.bugfix Normal file
View File

@ -0,0 +1 @@
Prevent clients from reporting nonexistent events.

View File

@ -16,7 +16,7 @@ import logging
from http import HTTPStatus from http import HTTPStatus
from typing import TYPE_CHECKING, Tuple from typing import TYPE_CHECKING, Tuple
from synapse.api.errors import Codes, SynapseError from synapse.api.errors import Codes, NotFoundError, SynapseError
from synapse.http.server import HttpServer from synapse.http.server import HttpServer
from synapse.http.servlet import RestServlet, parse_json_object_from_request from synapse.http.servlet import RestServlet, parse_json_object_from_request
from synapse.http.site import SynapseRequest from synapse.http.site import SynapseRequest
@ -39,6 +39,7 @@ class ReportEventRestServlet(RestServlet):
self.auth = hs.get_auth() self.auth = hs.get_auth()
self.clock = hs.get_clock() self.clock = hs.get_clock()
self.store = hs.get_datastores().main self.store = hs.get_datastores().main
self._event_handler = self.hs.get_event_handler()
async def on_POST( async def on_POST(
self, request: SynapseRequest, room_id: str, event_id: str self, request: SynapseRequest, room_id: str, event_id: str
@ -61,6 +62,14 @@ class ReportEventRestServlet(RestServlet):
Codes.BAD_JSON, Codes.BAD_JSON,
) )
event = await self._event_handler.get_event(
requester.user, room_id, event_id, show_redacted=False
)
if event is None:
raise NotFoundError(
"Unable to report event: it does not exist or you aren't able to see it."
)
await self.store.add_event_report( await self.store.add_event_report(
room_id=room_id, room_id=room_id,
event_id=event_id, event_id=event_id,

View File

@ -73,6 +73,18 @@ class ReportEventTestCase(unittest.HomeserverTestCase):
data = {"reason": None, "score": None} data = {"reason": None, "score": None}
self._assert_status(400, data) self._assert_status(400, data)
def test_cannot_report_nonexistent_event(self) -> None:
"""
Tests that we don't accept event reports for events which do not exist.
"""
channel = self.make_request(
"POST",
f"rooms/{self.room_id}/report/$nonsenseeventid:test",
{"reason": "i am very sad"},
access_token=self.other_user_tok,
)
self.assertEqual(404, channel.code, msg=channel.result["body"])
def _assert_status(self, response_status: int, data: JsonDict) -> None: def _assert_status(self, response_status: int, data: JsonDict) -> None:
channel = self.make_request( channel = self.make_request(
"POST", self.report_path, data, access_token=self.other_user_tok "POST", self.report_path, data, access_token=self.other_user_tok