From ac771446a61b2fbf1944d747e8dc944f8421b451 Mon Sep 17 00:00:00 2001 From: Jason Little Date: Tue, 15 Sep 2026 06:15:23 -0500 Subject: [PATCH] Allow 3rd party rules `check_event_allowed` callback to function for room version "12" creation events (#19768) --- changelog.d/19768.bugfix | 1 + synapse/handlers/message.py | 35 ++++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 changelog.d/19768.bugfix diff --git a/changelog.d/19768.bugfix b/changelog.d/19768.bugfix new file mode 100644 index 0000000000..8314491ced --- /dev/null +++ b/changelog.d/19768.bugfix @@ -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 c61fccb5f2..5230772e49 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -2449,11 +2449,15 @@ class EventCreationHandler: 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, - ) + # Prepend the error message with some context. This will be raised as a + # `400` since assumption of the validator is that it came directly from a + # client. Change this to a `500`, as the module will have changed something + # and that is a fault of the server + e.msg = "Third party rules module created an invalid event: " + e.msg + e.code = HTTPStatus.INTERNAL_SERVER_ERROR + raise immutable_fields = [ # changing the room is going to break things: we've already checked that the @@ -2484,12 +2488,25 @@ class EventCreationHandler: 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 msc4242 and msc4291 rooms will not have a room_id, and + # will also not have prev_events nor prev_state_events(below). + prev_event_ids = [] + if builder.room_id is not None and not ( + builder.type == EventTypes.Create + and original_event.room_version.msc4291_room_ids_as_hashes + ): + 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: + prev_state_events: list[str] | None = ( + [] if original_event.room_version.msc4242_state_dags else None + ) + 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) )