mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2024-12-12 11:04:18 -05:00
Stop get_joined_users
corruption from custom statuses (#7376)
Fix a bug where the `get_joined_users` cache could be corrupted by custom status events (or other state events with a state_key matching the user ID). The bug was introduced by #2229, but has largely gone unnoticed since then. Fixes #7099, #7373.
This commit is contained in:
parent
5d64fefd6c
commit
a0e063387d
1
changelog.d/7376.bugfix
Normal file
1
changelog.d/7376.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
Fix a bug which could cause messages not to be sent over federation, when state events with state keys matching user IDs (such as custom user statuses) were received.
|
@ -576,6 +576,7 @@ class RoomMemberWorkerStore(EventsWorkerStore):
|
|||||||
if key[0] == EventTypes.Member
|
if key[0] == EventTypes.Member
|
||||||
]
|
]
|
||||||
for etype, state_key in context.delta_ids:
|
for etype, state_key in context.delta_ids:
|
||||||
|
if etype == EventTypes.Member:
|
||||||
users_in_room.pop(state_key, None)
|
users_in_room.pop(state_key, None)
|
||||||
|
|
||||||
# We check if we have any of the member event ids in the event cache
|
# We check if we have any of the member event ids in the event cache
|
||||||
|
@ -22,6 +22,8 @@ from synapse.rest.client.v1 import login, room
|
|||||||
from synapse.types import Requester, UserID
|
from synapse.types import Requester, UserID
|
||||||
|
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
|
from tests.test_utils import event_injection
|
||||||
|
from tests.utils import TestHomeServer
|
||||||
|
|
||||||
|
|
||||||
class RoomMemberStoreTestCase(unittest.HomeserverTestCase):
|
class RoomMemberStoreTestCase(unittest.HomeserverTestCase):
|
||||||
@ -38,7 +40,7 @@ class RoomMemberStoreTestCase(unittest.HomeserverTestCase):
|
|||||||
)
|
)
|
||||||
return hs
|
return hs
|
||||||
|
|
||||||
def prepare(self, reactor, clock, hs):
|
def prepare(self, reactor, clock, hs: TestHomeServer):
|
||||||
|
|
||||||
# We can't test the RoomMemberStore on its own without the other event
|
# We can't test the RoomMemberStore on its own without the other event
|
||||||
# storage logic
|
# storage logic
|
||||||
@ -114,6 +116,52 @@ class RoomMemberStoreTestCase(unittest.HomeserverTestCase):
|
|||||||
# It now knows about Charlie's server.
|
# It now knows about Charlie's server.
|
||||||
self.assertEqual(self.store._known_servers_count, 2)
|
self.assertEqual(self.store._known_servers_count, 2)
|
||||||
|
|
||||||
|
def test_get_joined_users_from_context(self):
|
||||||
|
room = self.helper.create_room_as(self.u_alice, tok=self.t_alice)
|
||||||
|
bob_event = event_injection.inject_member_event(
|
||||||
|
self.hs, room, self.u_bob, Membership.JOIN
|
||||||
|
)
|
||||||
|
|
||||||
|
# first, create a regular event
|
||||||
|
event, context = event_injection.create_event(
|
||||||
|
self.hs,
|
||||||
|
room_id=room,
|
||||||
|
sender=self.u_alice,
|
||||||
|
prev_event_ids=[bob_event.event_id],
|
||||||
|
type="m.test.1",
|
||||||
|
content={},
|
||||||
|
)
|
||||||
|
|
||||||
|
users = self.get_success(
|
||||||
|
self.store.get_joined_users_from_context(event, context)
|
||||||
|
)
|
||||||
|
self.assertEqual(users.keys(), {self.u_alice, self.u_bob})
|
||||||
|
|
||||||
|
# Regression test for #7376: create a state event whose key matches bob's
|
||||||
|
# user_id, but which is *not* a membership event, and persist that; then check
|
||||||
|
# that `get_joined_users_from_context` returns the correct users for the next event.
|
||||||
|
non_member_event = event_injection.inject_event(
|
||||||
|
self.hs,
|
||||||
|
room_id=room,
|
||||||
|
sender=self.u_bob,
|
||||||
|
prev_event_ids=[bob_event.event_id],
|
||||||
|
type="m.test.2",
|
||||||
|
state_key=self.u_bob,
|
||||||
|
content={},
|
||||||
|
)
|
||||||
|
event, context = event_injection.create_event(
|
||||||
|
self.hs,
|
||||||
|
room_id=room,
|
||||||
|
sender=self.u_alice,
|
||||||
|
prev_event_ids=[non_member_event.event_id],
|
||||||
|
type="m.test.3",
|
||||||
|
content={},
|
||||||
|
)
|
||||||
|
users = self.get_success(
|
||||||
|
self.store.get_joined_users_from_context(event, context)
|
||||||
|
)
|
||||||
|
self.assertEqual(users.keys(), {self.u_alice, self.u_bob})
|
||||||
|
|
||||||
|
|
||||||
class CurrentStateMembershipUpdateTestCase(unittest.HomeserverTestCase):
|
class CurrentStateMembershipUpdateTestCase(unittest.HomeserverTestCase):
|
||||||
def prepare(self, reactor, clock, homeserver):
|
def prepare(self, reactor, clock, homeserver):
|
||||||
|
Loading…
Reference in New Issue
Block a user