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

Commit 6ef6c4a

Browse files
committed
Apply additional validation to edits.
1 parent 0c1c6a1 commit 6ef6c4a

File tree

4 files changed

+32
-6
lines changed

4 files changed

+32
-6
lines changed

synapse/events/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ async def _injected_bundled_aggregations(
473473

474474
edit = None
475475
if event.type == EventTypes.Message:
476-
edit = await self.store.get_applicable_edit(event_id)
476+
edit = await self.store.get_applicable_edit(event_id, room_id)
477477

478478
if edit:
479479
# If there is an edit replace the content, preserving existing

synapse/storage/databases/main/events.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1780,7 +1780,9 @@ def _handle_event_relations(
17801780
)
17811781

17821782
if rel_type == RelationTypes.REPLACE:
1783-
txn.call_after(self.store.get_applicable_edit.invalidate, (parent_id,))
1783+
txn.call_after(
1784+
self.store.get_applicable_edit.invalidate, (parent_id, event.room_id)
1785+
)
17841786

17851787
if rel_type == RelationTypes.THREAD:
17861788
txn.call_after(

synapse/storage/databases/main/relations.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,17 @@ def _get_aggregation_groups_for_event_txn(
296296
)
297297

298298
@cached()
299-
async def get_applicable_edit(self, event_id: str) -> Optional[EventBase]:
299+
async def get_applicable_edit(
300+
self, event_id: str, room_id: str
301+
) -> Optional[EventBase]:
300302
"""Get the most recent edit (if any) that has happened for the given
301303
event.
302304
303305
Correctly handles checking whether edits were allowed to happen.
304306
305307
Args:
306308
event_id: The original event ID
309+
room_id: The original event's room ID
307310
308311
Returns:
309312
The most recent edit, if any.
@@ -325,13 +328,14 @@ async def get_applicable_edit(self, event_id: str) -> Optional[EventBase]:
325328
WHERE
326329
relates_to_id = ?
327330
AND relation_type = ?
331+
AND edit.room_id = ?
328332
AND edit.type = 'm.room.message'
329333
ORDER by edit.origin_server_ts DESC, edit.event_id DESC
330334
LIMIT 1
331335
"""
332336

333337
def _get_applicable_edit_txn(txn: LoggingTransaction) -> Optional[str]:
334-
txn.execute(sql, (event_id, RelationTypes.REPLACE))
338+
txn.execute(sql, (event_id, RelationTypes.REPLACE, room_id))
335339
row = txn.fetchone()
336340
if row:
337341
return row[0]

tests/rest/client/test_relations.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,7 @@ def test_ignore_invalid_room(self):
665665
with patch(
666666
"synapse.handlers.message.EventCreationHandler._validate_event_relation"
667667
):
668-
# Generate a reaction, reference, and thread relations from a
669-
# different room.
668+
# Generate a various relations from a different room.
670669
self.get_success(
671670
inject_event(
672671
self.hs,
@@ -717,6 +716,27 @@ def test_ignore_invalid_room(self):
717716
)
718717
)
719718

719+
self.get_success(
720+
inject_event(
721+
self.hs,
722+
room_id=self.room,
723+
type="m.room.message",
724+
sender=self.user_id,
725+
content={
726+
"body": "foo",
727+
"msgtype": "m.text",
728+
"new_content": {
729+
"body": "new content",
730+
"msgtype": "m.text",
731+
},
732+
"m.relates_to": {
733+
"rel_type": RelationTypes.REPLACE,
734+
"event_id": parent_id,
735+
},
736+
},
737+
)
738+
)
739+
720740
# They should be ignored when fetching relations.
721741
channel = self.make_request(
722742
"GET",

0 commit comments

Comments
 (0)