Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 491c1f7

Browse files
author
Mathieu Velten
committed
Filter out non local events when a room doesn't have its full state
1 parent d85cba1 commit 491c1f7

File tree

4 files changed

+23
-11
lines changed

4 files changed

+23
-11
lines changed

synapse/federation/sender/per_destination_queue.py

+1
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ async def _catch_up_transmission_loop(self) -> None:
505505
new_pdus = await filter_events_for_server(
506506
self._storage_controllers,
507507
self._destination,
508+
self._server_name,
508509
new_pdus,
509510
redact=False,
510511
)

synapse/handlers/federation.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ async def _maybe_backfill_inner(
379379
filtered_extremities = await filter_events_for_server(
380380
self._storage_controllers,
381381
self.server_name,
382+
self.server_name,
382383
events_to_check,
383384
redact=False,
384385
check_history_visibility_only=True,
@@ -1252,7 +1253,7 @@ async def on_backfill_request(
12521253
)
12531254

12541255
events = await filter_events_for_server(
1255-
self._storage_controllers, origin, events
1256+
self._storage_controllers, origin, self.server_name, events
12561257
)
12571258

12581259
return events
@@ -1283,7 +1284,7 @@ async def get_persisted_pdu(
12831284
await self._event_auth_handler.assert_host_in_room(event.room_id, origin)
12841285

12851286
events = await filter_events_for_server(
1286-
self._storage_controllers, origin, [event]
1287+
self._storage_controllers, origin, self.server_name, [event]
12871288
)
12881289
event = events[0]
12891290
return event
@@ -1309,7 +1310,7 @@ async def on_get_missing_events(
13091310
)
13101311

13111312
missing_events = await filter_events_for_server(
1312-
self._storage_controllers, origin, missing_events
1313+
self._storage_controllers, origin, self.server_name, missing_events
13131314
)
13141315

13151316
return missing_events

synapse/visibility.py

+13-3
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,8 @@ def get_effective_room_visibility_from_state(state: StateMap[EventBase]) -> str:
563563

564564
async def filter_events_for_server(
565565
storage: StorageControllers,
566-
server_name: str,
566+
target_server_name: str,
567+
local_server_name: str,
567568
events: List[EventBase],
568569
redact: bool = True,
569570
check_history_visibility_only: bool = False,
@@ -603,7 +604,7 @@ def check_event_is_visible(
603604
# if the server is either in the room or has been invited
604605
# into the room.
605606
for ev in memberships.values():
606-
assert get_domain_from_id(ev.state_key) == server_name
607+
assert get_domain_from_id(ev.state_key) == target_server_name
607608

608609
memtype = ev.membership
609610
if memtype == Membership.JOIN:
@@ -636,7 +637,7 @@ def check_event_is_visible(
636637
if event_to_history_vis[e.event_id]
637638
not in (HistoryVisibility.SHARED, HistoryVisibility.WORLD_READABLE)
638639
],
639-
server_name,
640+
target_server_name,
640641
)
641642

642643
to_return = []
@@ -645,6 +646,15 @@ def check_event_is_visible(
645646
visible = check_event_is_visible(
646647
event_to_history_vis[e.event_id], event_to_memberships.get(e.event_id, {})
647648
)
649+
650+
# Filter out non-local events when we are in the middle of a partial join,
651+
# since our servers list can be out of date and we could leak events
652+
# to servers not in the room anymore.
653+
# This can also be true for local events but we consider it to be
654+
# an acceptable risk in this case.
655+
if e.origin != local_server_name and await storage.main.is_partial_state_room(e.room_id):
656+
visible = False
657+
648658
if visible and not erased:
649659
to_return.append(e)
650660
elif redact:

tests/test_visibility.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_filtering(self) -> None:
6161

6262
filtered = self.get_success(
6363
filter_events_for_server(
64-
self._storage_controllers, "test_server", events_to_filter
64+
self._storage_controllers, "test_server", "hs", events_to_filter
6565
)
6666
)
6767

@@ -83,7 +83,7 @@ def test_filter_outlier(self) -> None:
8383
self.assertEqual(
8484
self.get_success(
8585
filter_events_for_server(
86-
self._storage_controllers, "remote_hs", [outlier]
86+
self._storage_controllers, "remote_hs", "hs", [outlier]
8787
)
8888
),
8989
[outlier],
@@ -94,7 +94,7 @@ def test_filter_outlier(self) -> None:
9494

9595
filtered = self.get_success(
9696
filter_events_for_server(
97-
self._storage_controllers, "remote_hs", [outlier, evt]
97+
self._storage_controllers, "remote_hs", "local_hs", [outlier, evt]
9898
)
9999
)
100100
self.assertEqual(len(filtered), 2, f"expected 2 results, got: {filtered}")
@@ -106,7 +106,7 @@ def test_filter_outlier(self) -> None:
106106
# be redacted)
107107
filtered = self.get_success(
108108
filter_events_for_server(
109-
self._storage_controllers, "other_server", [outlier, evt]
109+
self._storage_controllers, "other_server", "local_hs", [outlier, evt]
110110
)
111111
)
112112
self.assertEqual(filtered[0], outlier)
@@ -141,7 +141,7 @@ def test_erased_user(self) -> None:
141141
# ... and the filtering happens.
142142
filtered = self.get_success(
143143
filter_events_for_server(
144-
self._storage_controllers, "test_server", events_to_filter
144+
self._storage_controllers, "test_server", "local_hs", events_to_filter
145145
)
146146
)
147147

0 commit comments

Comments
 (0)