diff options
author | Mathieu Velten <mathieuv@matrix.org> | 2022-09-26 17:33:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-26 17:33:32 +0200 |
commit | 41461fd4d63e55d1812f0688ca58a88e7200a1d7 (patch) | |
tree | b7e9300d08b8725a05aad841822e354ba3a562fb | |
parent | Simplify cache invalidation after event persist txn (#13796) (diff) | |
download | synapse-41461fd4d63e55d1812f0688ca58a88e7200a1d7.tar.xz |
typing: check origin server of typing event against room's servers (#13830)
This is also using the partial state approximation if needed so we do not block here during a fast join. Signed-off-by: Mathieu Velten <mathieuv@matrix.org> Co-authored-by: Sean Quah <8349537+squahtx@users.noreply.github.com>
-rw-r--r-- | changelog.d/13830.bugfix | 1 | ||||
-rw-r--r-- | synapse/handlers/typing.py | 7 | ||||
-rw-r--r-- | tests/handlers/test_typing.py | 4 |
3 files changed, 10 insertions, 2 deletions
diff --git a/changelog.d/13830.bugfix b/changelog.d/13830.bugfix new file mode 100644 index 0000000000..e6215806cd --- /dev/null +++ b/changelog.d/13830.bugfix @@ -0,0 +1 @@ +Fix a long-standing bug where typing events would be accepted from remote servers not present in a room. Also fix a bug where incoming typing events would cause other incoming events to get stuck during a fast join. diff --git a/synapse/handlers/typing.py b/synapse/handlers/typing.py index 0d8466af11..f953691669 100644 --- a/synapse/handlers/typing.py +++ b/synapse/handlers/typing.py @@ -362,11 +362,14 @@ class TypingWriterHandler(FollowerTypingHandler): ) return - domains = await self._storage_controllers.state.get_current_hosts_in_room( + # Let's check that the origin server is in the room before accepting the typing + # event. We don't want to block waiting on a partial state so take an + # approximation if needed. + domains = await self._storage_controllers.state.get_current_hosts_in_room_or_partial_state_approximation( room_id ) - if self.server_name in domains: + if user.domain in domains: logger.info("Got typing update from %s: %r", user_id, content) now = self.clock.time_msec() self._member_typing_until[member] = now + FEDERATION_TIMEOUT diff --git a/tests/handlers/test_typing.py b/tests/handlers/test_typing.py index 1a247f12e8..9c821b3042 100644 --- a/tests/handlers/test_typing.py +++ b/tests/handlers/test_typing.py @@ -138,6 +138,10 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase): get_current_hosts_in_room ) + hs.get_storage_controllers().state.get_current_hosts_in_room_or_partial_state_approximation = ( + get_current_hosts_in_room + ) + async def get_users_in_room(room_id: str): return {str(u) for u in self.room_members} |