Refactor to include inviter_user_id as part of stripped state

See:

 - https://github.com/element-hq/synapse/pull/19723#discussion_r3318830203
 - https://github.com/matrix-org/sytest/pull/1425#discussion_r3319446010
This commit is contained in:
Eric Eastwood
2026-07-09 17:41:17 -05:00
parent 4e7f3fc61c
commit bf9ab2f2e0
4 changed files with 47 additions and 28 deletions
+2 -2
View File
@@ -144,7 +144,6 @@ class FederationClient(FederationBase):
self.server_name = hs.hostname
self.signing_key = hs.signing_key
self._room_prejoin_state_types = hs.config.api.room_prejoin_state
# Cache mapping `event_id` to a tuple of the event itself and the `pull_origin`
# (which server we pulled the event from)
@@ -1367,7 +1366,8 @@ class FederationClient(FederationBase):
#
# Find the full events based on the state at the time of the invite
state_ids = await self.store.get_stripped_room_state_ids_from_event_context(
context, self._room_prejoin_state_types
context,
self.store.calculate_stripped_state_filter(inviter_user_id=pdu.sender),
)
state_events = await self.store.get_events(state_ids)
assert set(state_ids) == set(state_events.keys()), (
+5 -3
View File
@@ -194,8 +194,6 @@ class FederationServer(FederationBase):
hs.config.federation.federation_metrics_domains
)
self._room_prejoin_state_types = hs.config.api.room_prejoin_state
# Whether we have started handling old events in the staging area.
self._started_handling_of_staged_events = False
@@ -1031,7 +1029,11 @@ class FederationServer(FederationBase):
#
# Find the full events based on the state at the time of the knock
state_ids = await self.store.get_stripped_room_state_ids_from_event_context(
context, self._room_prejoin_state_types
context,
self.store.calculate_stripped_state_filter(
# None as this is a knock, not an invite
inviter_user_id=None
),
)
state_events = await self.store.get_events(state_ids)
assert set(state_ids) == set(state_events.keys()), (
+7 -5
View File
@@ -509,8 +509,6 @@ class EventCreationHandler:
self._worker_lock_handler = hs.get_worker_locks_handler()
self._policy_handler = hs.get_room_policy_handler()
self.room_prejoin_state_types = self.hs.config.api.room_prejoin_state
self.send_events = ReplicationSendEventsRestServlet.make_client(hs)
self.request_ratelimiter = hs.get_request_ratelimiter()
@@ -2079,8 +2077,9 @@ class EventCreationHandler:
"invite_room_state",
await self.store.get_stripped_room_state_from_event_context(
context,
self.room_prejoin_state_types,
membership_user_id=event.sender,
self.store.calculate_stripped_state_filter(
inviter_user_id=event.sender
),
),
)
@@ -2104,7 +2103,10 @@ class EventCreationHandler:
"knock_room_state",
await self.store.get_stripped_room_state_from_event_context(
context,
self.room_prejoin_state_types,
self.store.calculate_stripped_state_filter(
# None as this is a knock, not an invite
inviter_user_id=None
),
),
)
+33 -18
View File
@@ -385,6 +385,8 @@ class EventsWorkerStore(SQLBaseStore):
finished (so we don't have to keep querying it every time)
"""
self._room_prejoin_state_types = hs.config.api.room_prejoin_state
def get_un_partial_stated_events_token(self, instance_name: str) -> int:
return (
self._un_partial_stated_events_stream_id_gen.get_current_token_for_writer(
@@ -1125,16 +1127,42 @@ class EventsWorkerStore(SQLBaseStore):
return event_map
def calculate_stripped_state_filter(
self,
*,
inviter_user_id: str | None = None,
) -> StateFilter:
"""
Calculate the stripped state filter necessary for an event
Args:
inviter_user_id: An optional user ID to include the stripped membership state
events of. This is useful when generating the stripped state of a room for
invites. We want to send membership events of the inviter, so that the
invitee can display the inviter's profile information if the room lacks any.
"""
state_filter = self._room_prejoin_state_types
# Include the state for `inviter_user_id` if specified
#
# FIXME: Doesn't seem to be in the spec
if inviter_user_id:
types = chain(
self._room_prejoin_state_types.to_types(),
[(EventTypes.Member, inviter_user_id)],
)
state_filter = StateFilter.from_types(types)
return state_filter
async def get_stripped_room_state_from_event_context(
self,
context: EventContext,
state_keys_to_include: StateFilter,
membership_user_id: str | None = None,
) -> list[JsonDict]:
"""
Retrieve the stripped state from a room, given an event context to retrieve state
from as well as the state types to include. Optionally, include the membership
events from a specific user.
from as well as the state types to include.
"Stripped" state means that only the `type`, `state_key`, `content` and `sender` keys
are included from each state event.
@@ -1142,25 +1170,13 @@ class EventsWorkerStore(SQLBaseStore):
Args:
context: The event context to retrieve state of the room from.
state_keys_to_include: The state events to include, for each event type.
membership_user_id: An optional user ID to include the stripped membership state
events of. This is useful when generating the stripped state of a room for
invites. We want to send membership events of the inviter, so that the
invitee can display the inviter's profile information if the room lacks any.
Returns:
A list of dictionaries, each representing a stripped state event from the room.
"""
if membership_user_id:
types = chain(
state_keys_to_include.to_types(),
[(EventTypes.Member, membership_user_id)],
)
filter = StateFilter.from_types(types)
else:
filter = state_keys_to_include
selected_state_ids = await self.get_stripped_room_state_ids_from_event_context(
context, filter
context, state_keys_to_include
)
state_to_include = await self.get_events(selected_state_ids)
@@ -1174,8 +1190,7 @@ class EventsWorkerStore(SQLBaseStore):
) -> list[str]:
"""
Retrieve the stripped state IDs for an event, given an event context to retrieve state
from as well as the state types to include. Optionally, include the membership
events from a specific user.
from as well as the state types to include.
"Stripped" state means that only the `type`, `state_key`, `content` and `sender` keys
are included from each state event.