From 4a12304cf77f88f66d494b8f6e93023bd44bc318 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Thu, 28 Oct 2021 01:42:46 -0500 Subject: [PATCH] Put empty prev_events behind new room version See https://github.com/matrix-org/synapse/pull/11114#discussion_r733475645 --- synapse/api/room_versions.py | 31 +++++++++++++++++++++++++++++++ synapse/handlers/message.py | 26 ++++++++++++++++---------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index 0a895bba480a..7ef4701b137a 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -81,6 +81,8 @@ class RoomVersion: msc2716_historical = attr.ib(type=bool) # MSC2716: Adds support for redacting "insertion", "chunk", and "marker" events msc2716_redactions = attr.ib(type=bool) + # MSC2716: Adds support for events with no `prev_events` but with some `auth_events` + msc2716_empty_prev_events = attr.ib(type=bool) class RoomVersions: @@ -99,6 +101,7 @@ class RoomVersions: msc2403_knocking=False, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V2 = RoomVersion( "2", @@ -115,6 +118,7 @@ class RoomVersions: msc2403_knocking=False, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V3 = RoomVersion( "3", @@ -131,6 +135,7 @@ class RoomVersions: msc2403_knocking=False, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V4 = RoomVersion( "4", @@ -147,6 +152,7 @@ class RoomVersions: msc2403_knocking=False, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V5 = RoomVersion( "5", @@ -163,6 +169,7 @@ class RoomVersions: msc2403_knocking=False, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V6 = RoomVersion( "6", @@ -179,6 +186,7 @@ class RoomVersions: msc2403_knocking=False, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) MSC2176 = RoomVersion( "org.matrix.msc2176", @@ -195,6 +203,7 @@ class RoomVersions: msc2403_knocking=False, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V7 = RoomVersion( "7", @@ -211,6 +220,7 @@ class RoomVersions: msc2403_knocking=True, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V8 = RoomVersion( "8", @@ -227,6 +237,7 @@ class RoomVersions: msc2403_knocking=True, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) V9 = RoomVersion( "9", @@ -243,6 +254,7 @@ class RoomVersions: msc2403_knocking=True, msc2716_historical=False, msc2716_redactions=False, + msc2716_empty_prev_events=False, ) MSC2716v3 = RoomVersion( "org.matrix.msc2716v3", @@ -259,6 +271,24 @@ class RoomVersions: msc2403_knocking=True, msc2716_historical=True, msc2716_redactions=True, + msc2716_empty_prev_events=False, + ) + MSC2716v4 = RoomVersion( + "org.matrix.msc2716v4", + RoomDisposition.UNSTABLE, + EventFormatVersions.V3, + StateResolutionVersions.V2, + enforce_key_validity=True, + special_case_aliases_auth=False, + strict_canonicaljson=True, + limit_notifications_power_levels=True, + msc2176_redaction_rules=False, + msc3083_join_rules=False, + msc3375_redaction_rules=False, + msc2403_knocking=True, + msc2716_historical=True, + msc2716_redactions=True, + msc2716_empty_prev_events=True, ) @@ -276,6 +306,7 @@ class RoomVersions: RoomVersions.V8, RoomVersions.V9, RoomVersions.MSC2716v3, + RoomVersions.MSC2716v4, ) } diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index 1b872281f633..d6f0b99f5887 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -949,18 +949,24 @@ async def create_new_client_event( else: prev_event_ids = await self.store.get_prev_events_for_room(builder.room_id) - # we now ought to have some prev_events (unless it's a create event). - # - # do a quick sanity check here, rather than waiting until we've created the + # Do a quick sanity check here, rather than waiting until we've created the # event and then try to auth it (which fails with a somewhat confusing "No # create event in auth events") - assert ( - builder.type == EventTypes.Create - or len(prev_event_ids) > 0 - # Allow an event to have empty list of prev_event_ids - # only if it has auth_event_ids. - or (auth_event_ids and len(auth_event_ids) > 0) - ), "Attempting to create an event with no prev_events or auth_event_ids" + room_version_obj = await self.store.get_room_version(builder.room_id) + if room_version_obj.msc2716_empty_prev_events: + # We allow events with no `prev_events` but it better have some `auth_events` + assert ( + builder.type == EventTypes.Create + or len(prev_event_ids) > 0 + # Allow an event to have empty list of prev_event_ids + # only if it has auth_event_ids. + or (auth_event_ids and len(auth_event_ids) > 0) + ), "Attempting to create an event with no prev_events or auth_event_ids" + else: + # we now ought to have some prev_events (unless it's a create event). + assert ( + builder.type == EventTypes.Create or len(prev_event_ids) > 0 + ), "Attempting to create an event with no prev_events" event = await builder.build( prev_event_ids=prev_event_ids,