mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2024-12-22 16:54:57 -05:00
Fix invite rejection when we have no forward-extremeties (#7980)
Thanks to some slightly overzealous cleanup in the `delete_old_current_state_events`, it's possible to end up with no `event_forward_extremities` in a room where we have outstanding local invites. The user would then get a "no create event in auth events" when trying to reject the invite. We can hack around it by using the dangling invite as the prev event.
This commit is contained in:
parent
606805bf06
commit
0a7fb24716
1
changelog.d/7980.bugfix
Normal file
1
changelog.d/7980.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
Fix "no create event in auth events" when trying to reject invitation after inviter leaves. Bug introduced in Synapse v1.10.0.
|
@ -469,26 +469,39 @@ class RoomMemberHandler(object):
|
|||||||
user_id=target.to_string(), room_id=room_id
|
user_id=target.to_string(), room_id=room_id
|
||||||
) # type: Optional[RoomsForUser]
|
) # type: Optional[RoomsForUser]
|
||||||
if not invite:
|
if not invite:
|
||||||
|
logger.info(
|
||||||
|
"%s sent a leave request to %s, but that is not an active room "
|
||||||
|
"on this server, and there is no pending invite",
|
||||||
|
target,
|
||||||
|
room_id,
|
||||||
|
)
|
||||||
|
|
||||||
raise SynapseError(404, "Not a known room")
|
raise SynapseError(404, "Not a known room")
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
"%s rejects invite to %s from %s", target, room_id, invite.sender
|
"%s rejects invite to %s from %s", target, room_id, invite.sender
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.hs.is_mine_id(invite.sender):
|
if not self.hs.is_mine_id(invite.sender):
|
||||||
# the inviter was on our server, but has now left. Carry on
|
|
||||||
# with the normal rejection codepath.
|
|
||||||
#
|
|
||||||
# This is a bit of a hack, because the room might still be
|
|
||||||
# active on other servers.
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
# send the rejection to the inviter's HS (with fallback to
|
# send the rejection to the inviter's HS (with fallback to
|
||||||
# local event)
|
# local event)
|
||||||
return await self.remote_reject_invite(
|
return await self.remote_reject_invite(
|
||||||
invite.event_id, txn_id, requester, content,
|
invite.event_id, txn_id, requester, content,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# the inviter was on our server, but has now left. Carry on
|
||||||
|
# with the normal rejection codepath, which will also send the
|
||||||
|
# rejection out to any other servers we believe are still in the room.
|
||||||
|
|
||||||
|
# thanks to overzealous cleaning up of event_forward_extremities in
|
||||||
|
# `delete_old_current_state_events`, it's possible to end up with no
|
||||||
|
# forward extremities here. If that happens, let's just hang the
|
||||||
|
# rejection off the invite event.
|
||||||
|
#
|
||||||
|
# see: https://github.com/matrix-org/synapse/issues/7139
|
||||||
|
if len(latest_event_ids) == 0:
|
||||||
|
latest_event_ids = [invite.event_id]
|
||||||
|
|
||||||
return await self._local_membership_update(
|
return await self._local_membership_update(
|
||||||
requester=requester,
|
requester=requester,
|
||||||
target=target,
|
target=target,
|
||||||
|
Loading…
Reference in New Issue
Block a user