mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-06-20 02:54:08 -04:00
Ensure we use a copy of the event content dict before modifying it in serialize_event (#9585)
This bug was discovered by DINUM. We were modifying `serialized_event["content"]`, which - if you've got `USE_FROZEN_DICTS` turned on or are [using a third party rules module](17cd48fe51/synapse/events/third_party_rules.py (L73-L76)
) - will raise a 500 if you try to a edit a reply to a message.
`serialized_event["content"]` could be set to the edit event's content, instead of a copy of it, which is bad as we attempt to modify it. Instead, we also end up modifying the original event's content. DINUM uses a third party rules module, which meant the event's content got frozen and thus an exception was raised.
To be clear, the problem is not that the event's content was frozen. In fact doing so helped us uncover the fact we weren't copying event content correctly.
This commit is contained in:
parent
cc324d53fe
commit
7b06f85c0e
5 changed files with 147 additions and 2 deletions
|
@ -161,6 +161,68 @@ class ThirdPartyRulesTestCase(unittest.HomeserverTestCase):
|
|||
ev = channel.json_body
|
||||
self.assertEqual(ev["content"]["x"], "y")
|
||||
|
||||
def test_message_edit(self):
|
||||
"""Ensure that the module doesn't cause issues with edited messages."""
|
||||
# first patch the event checker so that it will modify the event
|
||||
async def check(ev: EventBase, state):
|
||||
d = ev.get_dict()
|
||||
d["content"] = {
|
||||
"msgtype": "m.text",
|
||||
"body": d["content"]["body"].upper(),
|
||||
}
|
||||
return d
|
||||
|
||||
current_rules_module().check_event_allowed = check
|
||||
|
||||
# Send an event, then edit it.
|
||||
channel = self.make_request(
|
||||
"PUT",
|
||||
"/_matrix/client/r0/rooms/%s/send/modifyme/1" % self.room_id,
|
||||
{
|
||||
"msgtype": "m.text",
|
||||
"body": "Original body",
|
||||
},
|
||||
access_token=self.tok,
|
||||
)
|
||||
self.assertEqual(channel.result["code"], b"200", channel.result)
|
||||
orig_event_id = channel.json_body["event_id"]
|
||||
|
||||
channel = self.make_request(
|
||||
"PUT",
|
||||
"/_matrix/client/r0/rooms/%s/send/m.room.message/2" % self.room_id,
|
||||
{
|
||||
"m.new_content": {"msgtype": "m.text", "body": "Edited body"},
|
||||
"m.relates_to": {
|
||||
"rel_type": "m.replace",
|
||||
"event_id": orig_event_id,
|
||||
},
|
||||
"msgtype": "m.text",
|
||||
"body": "Edited body",
|
||||
},
|
||||
access_token=self.tok,
|
||||
)
|
||||
self.assertEqual(channel.result["code"], b"200", channel.result)
|
||||
edited_event_id = channel.json_body["event_id"]
|
||||
|
||||
# ... and check that they both got modified
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
"/_matrix/client/r0/rooms/%s/event/%s" % (self.room_id, orig_event_id),
|
||||
access_token=self.tok,
|
||||
)
|
||||
self.assertEqual(channel.result["code"], b"200", channel.result)
|
||||
ev = channel.json_body
|
||||
self.assertEqual(ev["content"]["body"], "ORIGINAL BODY")
|
||||
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
"/_matrix/client/r0/rooms/%s/event/%s" % (self.room_id, edited_event_id),
|
||||
access_token=self.tok,
|
||||
)
|
||||
self.assertEqual(channel.result["code"], b"200", channel.result)
|
||||
ev = channel.json_body
|
||||
self.assertEqual(ev["content"]["body"], "EDITED BODY")
|
||||
|
||||
def test_send_event(self):
|
||||
"""Tests that the module can send an event into a room via the module api"""
|
||||
content = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue