Fix bug when rejecting withdrew invite with a third_party_rules module (#17930)

When rejecting a withdrew invite through federation, an out of band
event needs to be created.

When doing so with a third_party_rules module installed,
`get_prev_state_ids` [is
called](e0fdb862cb/synapse/module_api/callbacks/third_party_event_rules_callbacks.py (L285))
on the context to calculate the state to pass at `check_event_allowed`
callbacks.

The context for outliers is defined
[here](e0fdb862cb/synapse/events/snapshot.py (L168)),
and `state_group_before_event` is None.

This change makes the behavior of `get_prev_state_ids` and
`get_current_state_ids` match the one presented in the docstring
regarding null state_group.
This commit is contained in:
Mathieu Velten 2024-12-10 14:26:38 +00:00 committed by GitHub
parent adce8a0111
commit 5cf74c2da0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 6 additions and 5 deletions

1
changelog.d/17930.bugfix Normal file
View file

@ -0,0 +1 @@
Fix bug when rejecting withdrew invite with a third_party_rules module, where the invite would be stuck for the client.

View file

@ -248,7 +248,7 @@ class EventContext(UnpersistedEventContextBase):
@tag_args @tag_args
async def get_current_state_ids( async def get_current_state_ids(
self, state_filter: Optional["StateFilter"] = None self, state_filter: Optional["StateFilter"] = None
) -> Optional[StateMap[str]]: ) -> StateMap[str]:
""" """
Gets the room state map, including this event - ie, the state in ``state_group`` Gets the room state map, including this event - ie, the state in ``state_group``
@ -256,13 +256,12 @@ class EventContext(UnpersistedEventContextBase):
not make it into the room state. This method will raise an exception if not make it into the room state. This method will raise an exception if
``rejected`` is set. ``rejected`` is set.
It is also an error to access this for an outlier event.
Arg: Arg:
state_filter: specifies the type of state event to fetch from DB, example: EventTypes.JoinRules state_filter: specifies the type of state event to fetch from DB, example: EventTypes.JoinRules
Returns: Returns:
Returns None if state_group is None, which happens when the associated
event is an outlier.
Maps a (type, state_key) to the event ID of the state event matching Maps a (type, state_key) to the event ID of the state event matching
this tuple. this tuple.
""" """
@ -300,7 +299,8 @@ class EventContext(UnpersistedEventContextBase):
this tuple. this tuple.
""" """
assert self.state_group_before_event is not None if self.state_group_before_event is None:
return {}
return await self._storage.state.get_state_ids_for_group( return await self._storage.state.get_state_ids_for_group(
self.state_group_before_event, state_filter self.state_group_before_event, state_filter
) )