Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit e9b1ff9

Browse files
authored
Prevent clients from reporting nonexistent events. (#13779)
1 parent 69324c3 commit e9b1ff9

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

changelog.d/13779.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Prevent clients from reporting nonexistent events.

synapse/rest/client/report_event.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from http import HTTPStatus
1717
from typing import TYPE_CHECKING, Tuple
1818

19-
from synapse.api.errors import Codes, SynapseError
19+
from synapse.api.errors import Codes, NotFoundError, SynapseError
2020
from synapse.http.server import HttpServer
2121
from synapse.http.servlet import RestServlet, parse_json_object_from_request
2222
from synapse.http.site import SynapseRequest
@@ -39,6 +39,7 @@ def __init__(self, hs: "HomeServer"):
3939
self.auth = hs.get_auth()
4040
self.clock = hs.get_clock()
4141
self.store = hs.get_datastores().main
42+
self._event_handler = self.hs.get_event_handler()
4243

4344
async def on_POST(
4445
self, request: SynapseRequest, room_id: str, event_id: str
@@ -61,6 +62,14 @@ async def on_POST(
6162
Codes.BAD_JSON,
6263
)
6364

65+
event = await self._event_handler.get_event(
66+
requester.user, room_id, event_id, show_redacted=False
67+
)
68+
if event is None:
69+
raise NotFoundError(
70+
"Unable to report event: it does not exist or you aren't able to see it."
71+
)
72+
6473
await self.store.add_event_report(
6574
room_id=room_id,
6675
event_id=event_id,

tests/rest/client/test_report_event.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ def test_reason_and_score_null(self) -> None:
7373
data = {"reason": None, "score": None}
7474
self._assert_status(400, data)
7575

76+
def test_cannot_report_nonexistent_event(self) -> None:
77+
"""
78+
Tests that we don't accept event reports for events which do not exist.
79+
"""
80+
channel = self.make_request(
81+
"POST",
82+
f"rooms/{self.room_id}/report/$nonsenseeventid:test",
83+
{"reason": "i am very sad"},
84+
access_token=self.other_user_tok,
85+
)
86+
self.assertEqual(404, channel.code, msg=channel.result["body"])
87+
7688
def _assert_status(self, response_status: int, data: JsonDict) -> None:
7789
channel = self.make_request(
7890
"POST", self.report_path, data, access_token=self.other_user_tok

0 commit comments

Comments
 (0)