From 93074c03405e1df834152fdc33c07f4205c67789 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Thu, 12 Nov 2020 17:33:19 +0000 Subject: [PATCH 1/4] Generalise _locally_reject_invite _locally_reject_invite generates an out-of-band membership event which can be passed to clients but not other homeservers. This is used when we fail to reject an invite over federation, so instead just generate a leave event locally and send it down /sync, allowing clients to reject invites even if we can't reach the remote homeserver. A similar flow needs to be put in place for rescinding knocks. If we're unable to contact any remote server from the room we've tried to knock on, we'd still like to generate and store the leave event locally. Hence the need to reuse, and thus generalise, this method. --- synapse/handlers/room_member.py | 38 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py index 7cd858b7db47..76ed80d4dc92 100644 --- a/synapse/handlers/room_member.py +++ b/synapse/handlers/room_member.py @@ -1104,32 +1104,34 @@ async def remote_reject_invite( # logger.warning("Failed to reject invite: %s", e) - return await self._locally_reject_invite( + return await self._generate_local_out_of_band_membership( invite_event, txn_id, requester, content ) - async def _locally_reject_invite( + async def _generate_local_out_of_band_membership( self, - invite_event: EventBase, + previous_membership_event: EventBase, txn_id: Optional[str], requester: Requester, content: JsonDict, - ) -> Tuple[str, int]: - """Generate a local invite rejection + ): + """Generate a local leave event for a room - This is called after we fail to reject an invite via a remote server. It - generates an out-of-band membership event locally. + This can be called after we e.g fail to reject an invite via a remote server. + It generates an out-of-band membership event locally. Args: - invite_event: the invite to be rejected + previous_membership_event: the previous membership event for this user txn_id: optional transaction ID supplied by the client - requester: user making the rejection request, according to the access token - content: additional content to include in the rejection event. + requester: user making the request, according to the access token + content: additional content to include in the leave event. Normally an empty dict. - """ - room_id = invite_event.room_id - target_user = invite_event.state_key + Returns: + A tuple containing (event_id, stream_id of the leave event) + """ + room_id = previous_membership_event.room_id + target_user = previous_membership_event.state_key content["membership"] = Membership.LEAVE @@ -1141,12 +1143,12 @@ async def _locally_reject_invite( "state_key": target_user, } - # the auth events for the new event are the same as that of the invite, plus - # the invite itself. + # the auth events for the new event are the same as that of the previous event, plus + # the event itself. # - # the prev_events are just the invite. - prev_event_ids = [invite_event.event_id] - auth_event_ids = invite_event.auth_event_ids() + prev_event_ids + # the prev_events consist solely of the previous membership event. + prev_event_ids = [previous_membership_event.event_id] + auth_event_ids = previous_membership_event.auth_event_ids() + prev_event_ids event, context = await self.event_creation_handler.create_event( requester, From 86bd86418e8358ce27105de35ce42f4bafc0213a Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Thu, 12 Nov 2020 17:45:11 +0000 Subject: [PATCH 2/4] Changelog --- changelog.d/8751.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8751.misc diff --git a/changelog.d/8751.misc b/changelog.d/8751.misc new file mode 100644 index 000000000000..6ca9521f4ef7 --- /dev/null +++ b/changelog.d/8751.misc @@ -0,0 +1 @@ +Generalise `RoomMemberHandler._locally_reject_invite` for any membership type. \ No newline at end of file From 19e33041e99f3e3de54b14ccebc15a24bc9d69f7 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Fri, 13 Nov 2020 16:26:42 +0000 Subject: [PATCH 3/4] any membership -> leave --- changelog.d/8751.misc | 2 +- synapse/handlers/room_member.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog.d/8751.misc b/changelog.d/8751.misc index 6ca9521f4ef7..204c280c0e7b 100644 --- a/changelog.d/8751.misc +++ b/changelog.d/8751.misc @@ -1 +1 @@ -Generalise `RoomMemberHandler._locally_reject_invite` for any membership type. \ No newline at end of file +Generalise `RoomMemberHandler._locally_reject_invite` to apply to more flows than just invite. \ No newline at end of file diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py index 76ed80d4dc92..70f98048d7d0 100644 --- a/synapse/handlers/room_member.py +++ b/synapse/handlers/room_member.py @@ -1104,11 +1104,11 @@ async def remote_reject_invite( # logger.warning("Failed to reject invite: %s", e) - return await self._generate_local_out_of_band_membership( + return await self._generate_local_out_of_band_leave( invite_event, txn_id, requester, content ) - async def _generate_local_out_of_band_membership( + async def _generate_local_out_of_band_leave( self, previous_membership_event: EventBase, txn_id: Optional[str], From acc1899786c8d045ad7c6e7d9cbdfab8b22eaca4 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Fri, 13 Nov 2020 16:27:42 +0000 Subject: [PATCH 4/4] Yes, we are still returning things --- synapse/handlers/room_member.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py index 70f98048d7d0..fd85e08973b4 100644 --- a/synapse/handlers/room_member.py +++ b/synapse/handlers/room_member.py @@ -1114,7 +1114,7 @@ async def _generate_local_out_of_band_leave( txn_id: Optional[str], requester: Requester, content: JsonDict, - ): + ) -> Tuple[str, int]: """Generate a local leave event for a room This can be called after we e.g fail to reject an invite via a remote server.