diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2024-03-14 17:34:19 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-14 17:34:19 +0000 |
commit | 52f456a8228eaf4d6cc75c0514788e8507975035 (patch) | |
tree | bf65113e0e40a76e355c5fb7be738af621bffdfb /synapse/handlers | |
parent | Split up `SyncHandler.compute_state_delta` (#16929) (diff) | |
download | synapse-52f456a8228eaf4d6cc75c0514788e8507975035.tar.xz |
`/sync`: Fix edge-case in calculating the "device_lists" response (#16949)
Fixes https://github.com/element-hq/synapse/issues/16948. If the `join` and the `leave` are in the same sync response, we need to count them as a "left" user.
Diffstat (limited to 'synapse/handlers')
-rw-r--r-- | synapse/handlers/sync.py | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py index 08fe4eb3b3..0aedb37f16 100644 --- a/synapse/handlers/sync.py +++ b/synapse/handlers/sync.py @@ -2837,7 +2837,7 @@ class SyncResultBuilder: if self.since_token: for joined_sync in self.joined: it = itertools.chain( - joined_sync.timeline.events, joined_sync.state.values() + joined_sync.state.values(), joined_sync.timeline.events ) for event in it: if event.type == EventTypes.Member: @@ -2849,13 +2849,20 @@ class SyncResultBuilder: newly_joined_or_invited_or_knocked_users.add( event.state_key ) + # If the user left and rejoined in the same batch, they + # count as a newly-joined user, *not* a newly-left user. + newly_left_users.discard(event.state_key) else: prev_content = event.unsigned.get("prev_content", {}) prev_membership = prev_content.get("membership", None) if prev_membership == Membership.JOIN: newly_left_users.add(event.state_key) + # If the user joined and left in the same batch, they + # count as a newly-left user, not a newly-joined user. + newly_joined_or_invited_or_knocked_users.discard( + event.state_key + ) - newly_left_users -= newly_joined_or_invited_or_knocked_users return newly_joined_or_invited_or_knocked_users, newly_left_users |