|
|
|
@ -781,15 +781,27 @@ class FederationHandler: |
|
|
|
|
|
|
|
|
|
# Send the signed event back to the room, and potentially receive some |
|
|
|
|
# further information about the room in the form of partial state events |
|
|
|
|
stripped_room_state = await self.federation_client.send_knock( |
|
|
|
|
target_hosts, event |
|
|
|
|
) |
|
|
|
|
knock_response = await self.federation_client.send_knock(target_hosts, event) |
|
|
|
|
|
|
|
|
|
# Store any stripped room state events in the "unsigned" key of the event. |
|
|
|
|
# This is a bit of a hack and is cribbing off of invites. Basically we |
|
|
|
|
# store the room state here and retrieve it again when this event appears |
|
|
|
|
# in the invitee's sync stream. It is stripped out for all other local users. |
|
|
|
|
event.unsigned["knock_room_state"] = stripped_room_state["knock_state_events"] |
|
|
|
|
stripped_room_state = ( |
|
|
|
|
knock_response.get("knock_room_state") |
|
|
|
|
# Since v1.37, Synapse incorrectly used "knock_state_events" for this field. |
|
|
|
|
# Thus, we also check for a 'knock_state_events' to support old instances. |
|
|
|
|
# See https://github.com/matrix-org/synapse/issues/14088. |
|
|
|
|
or knock_response.get("knock_state_events") |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
if stripped_room_state is None: |
|
|
|
|
raise KeyError( |
|
|
|
|
"Missing 'knock_room_state' (or legacy 'knock_state_events') field in " |
|
|
|
|
"send_knock response" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
event.unsigned["knock_room_state"] = stripped_room_state |
|
|
|
|
|
|
|
|
|
context = EventContext.for_outlier(self._storage_controllers) |
|
|
|
|
stream_id = await self._federation_event_handler.persist_events_and_notify( |
|
|
|
|