diff options
author | Patrick Cloke <clokep@users.noreply.github.com> | 2023-10-27 12:50:50 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-27 12:50:50 -0400 |
commit | 2bf934140625e91e1e27ffc9f717f6f2d277b2b9 (patch) | |
tree | 3f305b0eb8728414fe4603f4575bea30ae25be67 /synapse | |
parent | Reduce amount of caches POSITIONS we send (#16561) (diff) | |
download | synapse-2bf934140625e91e1e27ffc9f717f6f2d277b2b9.tar.xz |
Ensure local invited & knocking users leave before purge. (#16559)
This is mostly useful for federated rooms where some users would get stuck in the invite or knock state when the room was purged from their homeserver.
Diffstat (limited to 'synapse')
-rw-r--r-- | synapse/handlers/room.py | 7 | ||||
-rw-r--r-- | synapse/storage/databases/main/roommember.py | 16 |
2 files changed, 20 insertions, 3 deletions
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 97c9f01245..6d680b0795 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -1939,9 +1939,10 @@ class RoomShutdownHandler: else: logger.info("Shutting down room %r", room_id) - users = await self.store.get_users_in_room(room_id) - for user_id in users: - if not self.hs.is_mine_id(user_id): + users = await self.store.get_local_users_related_to_room(room_id) + for user_id, membership in users: + # If the user is not in the room (or is banned), nothing to do. + if membership not in (Membership.JOIN, Membership.INVITE, Membership.KNOCK): continue logger.info("Kicking %r from %r...", user_id, room_id) diff --git a/synapse/storage/databases/main/roommember.py b/synapse/storage/databases/main/roommember.py index 67e149b586..1ed7f2d0ef 100644 --- a/synapse/storage/databases/main/roommember.py +++ b/synapse/storage/databases/main/roommember.py @@ -482,6 +482,22 @@ class RoomMemberWorkerStore(EventsWorkerStore, CacheInvalidationWorkerStore): desc="get_local_users_in_room", ) + async def get_local_users_related_to_room( + self, room_id: str + ) -> List[Tuple[str, str]]: + """ + Retrieves a list of the current roommembers who are local to the server and their membership status. + """ + return cast( + List[Tuple[str, str]], + await self.db_pool.simple_select_list( + table="local_current_membership", + keyvalues={"room_id": room_id}, + retcols=("user_id", "membership"), + desc="get_local_users_in_room", + ), + ) + async def check_local_user_in_room(self, user_id: str, room_id: str) -> bool: """ Check whether a given local user is currently joined to the given room. |