diff --git a/changelog.d/19768.misc b/changelog.d/19768.misc new file mode 100644 index 00000000000..8314491ced0 --- /dev/null +++ b/changelog.d/19768.misc @@ -0,0 +1 @@ +Allow the Third Party Rules `check_event_allowed()` callback to work with [MSC4291](https://github.com/matrix-org/matrix-spec-proposals/pull/4291) rooms. Contributed by @famedly. diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index 0687c9fa790..17d6c49ce3d 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -2376,7 +2376,7 @@ async def _rebuild_event_after_third_party_rules( original_event.room_version, third_party_result ) self.validator.validate_builder(builder) - assert builder.room_id is not None + except SynapseError as e: raise Exception( "Third party rules module created an invalid event: " + e.msg, @@ -2411,12 +2411,20 @@ async def _rebuild_event_after_third_party_rules( for k, v in original_event.internal_metadata.get_dict().items(): setattr(builder.internal_metadata, k, v) - # modules can send new state events, so we re-calculate the auth events just in - # case. - prev_event_ids = await self.store.get_prev_events_for_room(builder.room_id) + # Creation events using msc4291 rooms will not have a room_id, and will + # also not have prev_events nor prev_state_events(below). This makes mypy happy. + prev_event_ids = [] + if builder.room_id is not None: + prev_event_ids = await self.store.get_prev_events_for_room(builder.room_id) prev_state_events = None - if original_event.room_version.msc4242_state_dags: + if ( + original_event.room_version.msc4242_state_dags + and builder.type != EventTypes.Create + and builder.room_id is not None + ): + # modules can send new state events, so we re-calculate the auth events just + # in case. prev_state_events = list( await self.store.get_state_dag_extremities(builder.room_id) ) diff --git a/tests/rest/client/test_third_party_rules.py b/tests/rest/client/test_third_party_rules.py index 1709b27f67c..95afc5e82b6 100644 --- a/tests/rest/client/test_third_party_rules.py +++ b/tests/rest/client/test_third_party_rules.py @@ -382,7 +382,8 @@ def test_send_event(self) -> None: "third_party_event_rules": { "module": __name__ + ".LegacyChangeEvents", "config": {}, - } + }, + "default_room_version": "12", } ) def test_legacy_check_event_allowed(self) -> None: