mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-04 07:54:53 -04:00
Faster joins: don't stall when a user joins during a fast join (#14606)
Fixes #12801. Complement tests are at https://github.com/matrix-org/complement/pull/567. Avoid blocking on full state when handling a subsequent join into a partial state room. Also always perform a remote join into partial state rooms, since we do not know whether the joining user has been banned and want to avoid leaking history to banned users. Signed-off-by: Mathieu Velten <mathieuv@matrix.org> Co-authored-by: Sean Quah <seanq@matrix.org> Co-authored-by: David Robertson <davidr@element.io>
This commit is contained in:
parent
d0c713cc85
commit
6cddf24e36
12 changed files with 196 additions and 94 deletions
|
@ -202,7 +202,7 @@ class EventAuthHandler:
|
|||
state_ids: StateMap[str],
|
||||
room_version: RoomVersion,
|
||||
user_id: str,
|
||||
prev_member_event: Optional[EventBase],
|
||||
prev_membership: Optional[str],
|
||||
) -> None:
|
||||
"""
|
||||
Check whether a user can join a room without an invite due to restricted join rules.
|
||||
|
@ -214,15 +214,14 @@ class EventAuthHandler:
|
|||
state_ids: The state of the room as it currently is.
|
||||
room_version: The room version of the room being joined.
|
||||
user_id: The user joining the room.
|
||||
prev_member_event: The current membership event for this user.
|
||||
prev_membership: The current membership state for this user. `None` if the
|
||||
user has never joined the room (equivalent to "leave").
|
||||
|
||||
Raises:
|
||||
AuthError if the user cannot join the room.
|
||||
"""
|
||||
# If the member is invited or currently joined, then nothing to do.
|
||||
if prev_member_event and (
|
||||
prev_member_event.membership in (Membership.JOIN, Membership.INVITE)
|
||||
):
|
||||
if prev_membership in (Membership.JOIN, Membership.INVITE):
|
||||
return
|
||||
|
||||
# This is not a room with a restricted join rule, so we don't need to do the
|
||||
|
@ -255,13 +254,14 @@ class EventAuthHandler:
|
|||
)
|
||||
|
||||
async def has_restricted_join_rules(
|
||||
self, state_ids: StateMap[str], room_version: RoomVersion
|
||||
self, partial_state_ids: StateMap[str], room_version: RoomVersion
|
||||
) -> bool:
|
||||
"""
|
||||
Return if the room has the proper join rules set for access via rooms.
|
||||
|
||||
Args:
|
||||
state_ids: The state of the room as it currently is.
|
||||
state_ids: The state of the room as it currently is. May be full or partial
|
||||
state.
|
||||
room_version: The room version of the room to query.
|
||||
|
||||
Returns:
|
||||
|
@ -272,7 +272,7 @@ class EventAuthHandler:
|
|||
return False
|
||||
|
||||
# If there's no join rule, then it defaults to invite (so this doesn't apply).
|
||||
join_rules_event_id = state_ids.get((EventTypes.JoinRules, ""), None)
|
||||
join_rules_event_id = partial_state_ids.get((EventTypes.JoinRules, ""), None)
|
||||
if not join_rules_event_id:
|
||||
return False
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue