mirror of
https://mau.dev/maunium/synapse.git
synced 2024-11-10 20:11:32 +01: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
2 changed files with 22 additions and 8 deletions
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 a new issue