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

Commit d427f64

Browse files
authored
Do not include signatures/hashes in make_{join,leave,knock} responses. (#10404)
These signatures would end up invalid since the joining/leaving/knocking server would modify the response before calling send_{join,leave,knock}.
1 parent bdfde6d commit d427f64

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

changelog.d/10404.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Responses from `/make_{join,leave,knock}` no longer include signatures, which will turn out to be invalid after events are returned to `/send_{join,leave,knock}`.

synapse/events/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,20 @@ def get_pdu_json(self, time_now=None) -> JsonDict:
291291

292292
return pdu_json
293293

294+
def get_templated_pdu_json(self) -> JsonDict:
295+
"""
296+
Return a JSON object suitable for a templated event, as used in the
297+
make_{join,leave,knock} workflow.
298+
"""
299+
# By using _dict directly we don't pull in signatures/unsigned.
300+
template_json = dict(self._dict)
301+
# The hashes (similar to the signature) need to be recalculated by the
302+
# joining/leaving/knocking server after (potentially) modifying the
303+
# event.
304+
template_json.pop("hashes")
305+
306+
return template_json
307+
294308
def __set__(self, instance, value):
295309
raise AttributeError("Unrecognized attribute %s" % (instance,))
296310

synapse/federation/federation_server.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -562,8 +562,7 @@ async def on_make_join_request(
562562
raise IncompatibleRoomVersionError(room_version=room_version)
563563

564564
pdu = await self.handler.on_make_join_request(origin, room_id, user_id)
565-
time_now = self._clock.time_msec()
566-
return {"event": pdu.get_pdu_json(time_now), "room_version": room_version}
565+
return {"event": pdu.get_templated_pdu_json(), "room_version": room_version}
567566

568567
async def on_invite_request(
569568
self, origin: str, content: JsonDict, room_version_id: str
@@ -611,8 +610,7 @@ async def on_make_leave_request(
611610

612611
room_version = await self.store.get_room_version_id(room_id)
613612

614-
time_now = self._clock.time_msec()
615-
return {"event": pdu.get_pdu_json(time_now), "room_version": room_version}
613+
return {"event": pdu.get_templated_pdu_json(), "room_version": room_version}
616614

617615
async def on_send_leave_request(
618616
self, origin: str, content: JsonDict, room_id: str
@@ -659,9 +657,8 @@ async def on_make_knock_request(
659657
)
660658

661659
pdu = await self.handler.on_make_knock_request(origin, room_id, user_id)
662-
time_now = self._clock.time_msec()
663660
return {
664-
"event": pdu.get_pdu_json(time_now),
661+
"event": pdu.get_templated_pdu_json(),
665662
"room_version": room_version.identifier,
666663
}
667664

0 commit comments

Comments
 (0)