Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/19340.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Transform events with client metadata before serialising in /event response.
4 changes: 2 additions & 2 deletions synapse/handlers/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
UserInfo,
create_requester,
)
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -251,7 +251,7 @@ async def export_user_data(self, user_id: str, writer: "ExfiltrationWriter") ->
topological=last_event.depth,
)

events = await filter_events_for_client(
events = await filter_and_transform_events_for_client(
self._storage_controllers,
user_id,
events,
Expand Down
10 changes: 6 additions & 4 deletions synapse/handlers/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
from synapse.storage.databases.main.events_worker import EventRedactBehaviour
from synapse.streams.config import PaginationConfig
from synapse.types import JsonDict, Requester, UserID
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -156,7 +156,9 @@ async def get_event(
event_id: str,
show_redacted: bool = False,
) -> EventBase | None:
"""Retrieve a single specified event.
"""Retrieve a single specified event on behalf of a user.
The event will be transformed in a user-specific and time-specific way,
e.g. having unsigned metadata added or being erased depending on who is accessing.

Args:
user: The local user requesting the event
Expand Down Expand Up @@ -188,7 +190,7 @@ async def get_event(
# The user is peeking if they aren't in the room already
is_peeking = not is_user_in_room

filtered = await filter_events_for_client(
filtered = await filter_and_transform_events_for_client(
self._storage_controllers,
user.to_string(),
[event],
Expand All @@ -198,4 +200,4 @@ async def get_event(
if not filtered:
raise AuthError(403, "You don't have permission to access that event.")

return event
return filtered[0]
8 changes: 4 additions & 4 deletions synapse/handlers/initial_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
from synapse.util import unwrapFirstError
from synapse.util.async_helpers import concurrently_execute, gather_results
from synapse.util.caches.response_cache import ResponseCache
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -225,7 +225,7 @@ async def handle_room(event: RoomsForUser) -> None:
)
).addErrback(unwrapFirstError)

messages = await filter_events_for_client(
messages = await filter_and_transform_events_for_client(
self._storage_controllers,
user_id,
messages,
Expand Down Expand Up @@ -382,7 +382,7 @@ async def _room_initial_sync_parted(
room_id, limit=pagin_config.limit, end_token=stream_token
)

messages = await filter_events_for_client(
messages = await filter_and_transform_events_for_client(
self._storage_controllers,
requester.user.to_string(),
messages,
Expand Down Expand Up @@ -496,7 +496,7 @@ async def get_receipts() -> list[JsonMapping]:
).addErrback(unwrapFirstError)
)

messages = await filter_events_for_client(
messages = await filter_and_transform_events_for_client(
self._storage_controllers,
requester.user.to_string(),
messages,
Expand Down
4 changes: 2 additions & 2 deletions synapse/handlers/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
from synapse.types.state import StateFilter
from synapse.util.async_helpers import ReadWriteLock
from synapse.util.duration import Duration
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -684,7 +684,7 @@ async def get_messages(
events = await event_filter.filter(events)

if not use_admin_priviledge:
events = await filter_events_for_client(
events = await filter_and_transform_events_for_client(
self._storage_controllers,
user_id,
events,
Expand Down
6 changes: 3 additions & 3 deletions synapse/handlers/relations.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
from synapse.streams.config import PaginationConfig
from synapse.types import JsonDict, Requester, UserID
from synapse.util.async_helpers import gather_results
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -154,7 +154,7 @@ async def get_relations(
[e.event_id for e in related_events]
)

events = await filter_events_for_client(
events = await filter_and_transform_events_for_client(
self._storage_controllers,
user_id,
events,
Expand Down Expand Up @@ -599,7 +599,7 @@ async def get_threads(
# Limit the returned threads to those the user has participated in.
events = [event for event in events if participated[event.event_id]]

events = await filter_events_for_client(
events = await filter_and_transform_events_for_client(
self._storage_controllers,
user_id,
events,
Expand Down
4 changes: 2 additions & 2 deletions synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@
from synapse.util.duration import Duration
from synapse.util.iterutils import batch_iter
from synapse.util.stringutils import parse_and_validate_server_name
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -1919,7 +1919,7 @@ async def get_event_context(
async def filter_evts(events: list[EventBase]) -> list[EventBase]:
if use_admin_priviledge:
return events
return await filter_events_for_client(
return await filter_and_transform_events_for_client(
self._storage_controllers,
user.to_string(),
events,
Expand Down
10 changes: 5 additions & 5 deletions synapse/handlers/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
from synapse.events.utils import SerializeEventConfig
from synapse.types import JsonDict, Requester, StrCollection, StreamKeyType, UserID
from synapse.types.state import StateFilter
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -479,7 +479,7 @@ async def _search_by_rank(

filtered_events = await search_filter.filter([r["event"] for r in results])

events = await filter_events_for_client(
events = await filter_and_transform_events_for_client(
self._storage_controllers,
user.to_string(),
filtered_events,
Expand Down Expand Up @@ -580,7 +580,7 @@ async def _search_by_recent(

filtered_events = await search_filter.filter([r["event"] for r in results])

events = await filter_events_for_client(
events = await filter_and_transform_events_for_client(
self._storage_controllers,
user.to_string(),
filtered_events,
Expand Down Expand Up @@ -667,13 +667,13 @@ async def _calculate_event_contexts(
len(res.events_after),
)

events_before = await filter_events_for_client(
events_before = await filter_and_transform_events_for_client(
self._storage_controllers,
user.to_string(),
res.events_before,
)

events_after = await filter_events_for_client(
events_after = await filter_and_transform_events_for_client(
self._storage_controllers,
user.to_string(),
res.events_after,
Expand Down
4 changes: 2 additions & 2 deletions synapse/handlers/sliding_sync/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
)
from synapse.types.state import StateFilter
from synapse.util.async_helpers import concurrently_execute
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -753,7 +753,7 @@ async def get_room_sync_data(
timeline_events.reverse()

# Make sure we don't expose any events that the client shouldn't see
timeline_events = await filter_events_for_client(
timeline_events = await filter_and_transform_events_for_client(
self.storage_controllers,
user.to_string(),
timeline_events,
Expand Down
6 changes: 3 additions & 3 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
from synapse.util.caches.lrucache import LruCache
from synapse.util.caches.response_cache import ResponseCache, ResponseCacheContext
from synapse.util.metrics import Measure
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -679,7 +679,7 @@ async def _load_filtered_recents(
)
)

recents = await filter_events_for_client(
recents = await filter_and_transform_events_for_client(
self._storage_controllers,
sync_config.user.to_string(),
recents,
Expand Down Expand Up @@ -789,7 +789,7 @@ async def _load_filtered_recents(
)
)

loaded_recents = await filter_events_for_client(
loaded_recents = await filter_and_transform_events_for_client(
self._storage_controllers,
sync_config.user.to_string(),
loaded_recents,
Expand Down
4 changes: 2 additions & 2 deletions synapse/notifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
)
from synapse.util.duration import Duration
from synapse.util.stringutils import shortstr
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -783,7 +783,7 @@ async def check_for_updates(
)

if keyname == StreamKeyType.ROOM:
new_events = await filter_events_for_client(
new_events = await filter_and_transform_events_for_client(
self._storage_controllers,
user.to_string(),
new_events,
Expand Down
7 changes: 3 additions & 4 deletions synapse/push/mailer.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
from synapse.types import StateMap, UserID
from synapse.types.state import StateFilter
from synapse.util.async_helpers import concurrently_execute
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

if TYPE_CHECKING:
from synapse.server import HomeServer
Expand Down Expand Up @@ -537,12 +537,11 @@ async def _get_notif_vars(
"messages": [],
}

the_events = await filter_events_for_client(
the_events = await filter_and_transform_events_for_client(
self._storage_controllers,
user_id,
results.events_before,
results.events_before + [notif_event],
)
the_events.append(notif_event)

for event in the_events:
messagevars = await self._get_message_vars(notif, event, room_state_ids)
Expand Down
2 changes: 1 addition & 1 deletion synapse/visibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@


@trace
async def filter_events_for_client(
async def filter_and_transform_events_for_client(
storage: StorageControllers,
user_id: str,
events: list[EventBase],
Expand Down
4 changes: 2 additions & 2 deletions tests/rest/client/test_retention.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
from synapse.server import HomeServer
from synapse.types import JsonDict, create_requester
from synapse.util.clock import Clock
from synapse.visibility import filter_events_for_client
from synapse.visibility import filter_and_transform_events_for_client

from tests import unittest
from tests.unittest import override_config
Expand Down Expand Up @@ -163,7 +163,7 @@ def test_visibility(self) -> None:
)
self.assertEqual(2, len(events), "events retrieved from database")
filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
storage_controllers,
self.user_id,
events,
Expand Down
21 changes: 12 additions & 9 deletions tests/test_visibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@
from synapse.server import HomeServer
from synapse.types import create_requester
from synapse.util.clock import Clock
from synapse.visibility import filter_events_for_client, filter_events_for_server
from synapse.visibility import (
filter_and_transform_events_for_client,
filter_events_for_server,
)

from tests import unittest
from tests.test_utils.event_injection import inject_event, inject_member_event
Expand Down Expand Up @@ -330,7 +333,7 @@ def test_normal_operation_as_admin(self) -> None:

# Do filter & assert
filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@admin:test",
events_to_filter,
Expand Down Expand Up @@ -369,7 +372,7 @@ def test_see_soft_failed_events(self) -> None:

# Do filter & assert
filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@admin:test",
events_to_filter,
Expand Down Expand Up @@ -416,7 +419,7 @@ def test_see_policy_server_spammy_events(self) -> None:

# Do filter & assert
filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@admin:test",
events_to_filter,
Expand Down Expand Up @@ -463,7 +466,7 @@ def test_see_soft_failed_and_policy_server_spammy_events(self) -> None:

# Do filter & assert
filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@admin:test",
events_to_filter,
Expand Down Expand Up @@ -538,14 +541,14 @@ def test_joined_history_visibility(self) -> None:
# accidentally serving the same event object (with the same unsigned.membership
# property) to both users.
joiner_filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@joiner:test",
events_to_filter,
)
)
resident_filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@resident:test",
events_to_filter,
Expand Down Expand Up @@ -641,7 +644,7 @@ def test_out_of_band_invite_rejection(self) -> None:

# the invited user should be able to see both the invite and the rejection
filtered_events = self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@user:test",
[invite_event, reject_event],
Expand All @@ -662,7 +665,7 @@ def test_out_of_band_invite_rejection(self) -> None:
# other users should see neither
self.assertEqual(
self.get_success(
filter_events_for_client(
filter_and_transform_events_for_client(
self.hs.get_storage_controllers(),
"@other:test",
[invite_event, reject_event],
Expand Down
Loading