From 04ce3e3ec9a95b898c2a87234307c23b77dddad1 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 11:24:19 -0400 Subject: [PATCH 01/12] Implement MSC2175 to stop adding the creator field. --- synapse/api/room_versions.py | 16 ++++++++++++++++ synapse/handlers/room.py | 9 ++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index c397920fe54e..783a2896aea3 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -78,6 +78,8 @@ class RoomVersion: # MSC2209: Check 'notifications' key while verifying # m.room.power_levels auth rules. limit_notifications_power_levels: bool + # MSC2175: No longer include the creator in m.room.create events. + msc2175_create_events: bool # MSC2174/MSC2176: Apply updated redaction rules algorithm. msc2176_redaction_rules: bool # MSC3083: Support the 'restricted' join_rule. @@ -116,6 +118,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -135,6 +138,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -154,6 +158,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -173,6 +178,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -192,6 +198,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -211,6 +218,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -230,6 +238,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=True, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -249,6 +258,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -268,6 +278,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=False, @@ -287,6 +298,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, @@ -306,6 +318,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, @@ -325,6 +338,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, @@ -344,6 +358,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -364,6 +379,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, + msc2175_create_events=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index be120cb12f36..98b004a95767 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -567,6 +567,7 @@ async def clone_existing_room( await self._send_events_for_new_room( requester, new_room_id, + new_room_version, # we expect to override all the presets with initial_state, so this is # somewhat arbitrary. room_config={"preset": RoomCreationPreset.PRIVATE_CHAT}, @@ -922,6 +923,7 @@ async def create_room( ) = await self._send_events_for_new_room( requester, room_id, + room_version, room_config=config, invite_list=invite_list, initial_state=initial_state, @@ -998,6 +1000,7 @@ async def _send_events_for_new_room( self, creator: Requester, room_id: str, + room_version: RoomVersion, room_config: JsonDict, invite_list: List[str], initial_state: MutableStateMap, @@ -1020,6 +1023,8 @@ async def _send_events_for_new_room( the user requesting the room creation room_id: room id for the room being created + room_version: + The room version of the new room. room_config: A dict of configuration options. This will be the body of a /createRoom request; see @@ -1120,7 +1125,9 @@ async def create_event( 400, f"'{preset_config}' is not a valid preset", errcode=Codes.BAD_JSON ) - creation_content.update({"creator": creator_id}) + # MSC2175 removes the creator field from the create event. + if not room_version.msc2175_create_events: + creation_content.update({"creator": creator_id}) creation_event, unpersisted_creation_context = await create_event( EventTypes.Create, creation_content, False ) From f5c325bb1475a05b9e2378da1907ea3d3aabc34d Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 11:25:56 -0400 Subject: [PATCH 02/12] Inline confusing function which doesn't have to do with the create event. --- synapse/handlers/room.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 98b004a95767..66aba241579a 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -1058,14 +1058,6 @@ async def _send_events_for_new_room( # (as this info can't be pulled from the db) state_map: MutableStateMap[str] = {} - def create_event_dict(etype: str, content: JsonDict, **kwargs: Any) -> JsonDict: - e = {"type": etype, "content": content} - - e.update(event_keys) - e.update(kwargs) - - return e - async def create_event( etype: str, content: JsonDict, @@ -1088,7 +1080,10 @@ async def create_event( nonlocal depth nonlocal prev_event - event_dict = create_event_dict(etype, content, **kwargs) + # Create the event dictionary. + event_dict = {"type": etype, "content": content} + event_dict.update(event_keys) + event_dict.update(kwargs) ( new_event, From fd8f45ac19d66b7e85ed2d10bd118977782a2210 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 11:32:29 -0400 Subject: [PATCH 03/12] Newsfragment --- changelog.d/15394.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/15394.misc diff --git a/changelog.d/15394.misc b/changelog.d/15394.misc new file mode 100644 index 000000000000..91e6540438a6 --- /dev/null +++ b/changelog.d/15394.misc @@ -0,0 +1 @@ +Implement [MSC2175](https://github.com/matrix-org/matrix-doc/pull/2175) to stop adding `creator` to create events. From 811df3995b23aa556f214e53a0718a8381f39208 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 12:36:23 -0400 Subject: [PATCH 04/12] Tweak event auth rules to use sender in most places. --- synapse/event_auth.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/synapse/event_auth.py b/synapse/event_auth.py index af55874b5c47..def039d2cc6e 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -455,8 +455,11 @@ def _check_create(event: "EventBase") -> None: "room appears to have unsupported version %s" % (room_version_prop,), ) - # 1.4 If content has no creator field, reject. - if EventContentFields.ROOM_CREATOR not in event.content: + # 1.4 If content has no creator field, reject if the room version requires it. + if ( + not event.room_version.msc2175_create_events + and EventContentFields.ROOM_CREATOR not in event.content + ): raise AuthError(403, "Create event lacks a 'creator' property") @@ -491,7 +494,7 @@ def _is_membership_change_allowed( key = (EventTypes.Create, "") create = auth_events.get(key) if create and event.prev_event_ids()[0] == create.event_id: - if create.content["creator"] == event.state_key: + if create.sender == event.state_key: return target_user_id = event.state_key @@ -1004,7 +1007,7 @@ def get_user_power_level(user_id: str, auth_events: StateMap["EventBase"]) -> in # that. key = (EventTypes.Create, "") create_event = auth_events.get(key) - if create_event is not None and create_event.content["creator"] == user_id: + if create_event is not None and create_event.sender == user_id: return 100 else: return 0 From 48ef4f9f29412fd1e528e924a25a417d1b2e16aa Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 12:36:35 -0400 Subject: [PATCH 05/12] Update other references to the room creator. --- synapse/handlers/federation_event.py | 3 +-- synapse/handlers/message.py | 3 +-- synapse/storage/databases/main/room.py | 12 ++++-------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py index 982c8d3b2ff1..b2a37b9f5a8d 100644 --- a/synapse/handlers/federation_event.py +++ b/synapse/handlers/federation_event.py @@ -1515,10 +1515,9 @@ async def _handle_marker_event(self, origin: str, marker_event: EventBase) -> No # support it or the event is not from the room creator. room_version = await self._store.get_room_version(marker_event.room_id) create_event = await self._store.get_create_event_for_room(marker_event.room_id) - room_creator = create_event.content.get(EventContentFields.ROOM_CREATOR) if not room_version.msc2716_historical and ( not self._config.experimental.msc2716_enabled - or marker_event.sender != room_creator + or marker_event.sender != create_event.sender ): return diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index 4c75433a635f..af75d7618126 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -1909,13 +1909,12 @@ async def persist_and_notify_client_events( room_version_obj = KNOWN_ROOM_VERSIONS[room_version] create_event = await self.store.get_create_event_for_room(event.room_id) - room_creator = create_event.content.get(EventContentFields.ROOM_CREATOR) # Only check an insertion event if the room version # supports it or the event is from the room creator. if room_version_obj.msc2716_historical or ( self.config.experimental.msc2716_enabled - and event.sender == room_creator + and event.sender == create_event.sender ): next_batch_id = event.content.get( EventContentFields.MSC2716_NEXT_BATCH_ID diff --git a/synapse/storage/databases/main/room.py b/synapse/storage/databases/main/room.py index 3825bd60797c..3dfb405093d2 100644 --- a/synapse/storage/databases/main/room.py +++ b/synapse/storage/databases/main/room.py @@ -1998,6 +1998,9 @@ def _background_populate_rooms_creator_column_txn( for room_id, event_json in room_id_to_create_event_results: event_dict = db_to_json(event_json) + # The creator property might not exist in newer room versions, but + # for those versions the creator column should be properly populate + # during room creation. creator = event_dict.get("content").get(EventContentFields.ROOM_CREATOR) self.db_pool.simple_update_txn( @@ -2132,13 +2135,6 @@ async def upsert_room_on_join( # invalid, and it would fail auth checks anyway. raise StoreError(400, "No create event in state") - room_creator = create_event.content.get(EventContentFields.ROOM_CREATOR) - - if not isinstance(room_creator, str): - # If the create event does not have a creator then the room is - # invalid, and it would fail auth checks anyway. - raise StoreError(400, "No creator defined on the create event") - await self.db_pool.simple_upsert( desc="upsert_room_on_join", table="rooms", @@ -2146,7 +2142,7 @@ async def upsert_room_on_join( values={"room_version": room_version.identifier}, insertion_values={ "is_public": False, - "creator": room_creator, + "creator": create_event.sender, "has_auth_chain_index": has_auth_chain_index, }, ) From 06b6fd86b5a933ed69e5145d05eef940bef6ee62 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 15:02:48 -0400 Subject: [PATCH 06/12] Review comments. --- synapse/api/constants.py | 2 ++ synapse/api/room_versions.py | 30 +++++++++++++++--------------- synapse/event_auth.py | 2 +- synapse/handlers/room.py | 2 +- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/synapse/api/constants.py b/synapse/api/constants.py index 0f224b34cd95..c56b2f256150 100644 --- a/synapse/api/constants.py +++ b/synapse/api/constants.py @@ -215,6 +215,8 @@ class EventContentFields: FEDERATE: Final = "m.federate" # The creator of the room, as used in `m.room.create` events. + # + # This is deprecated in MSC2175. ROOM_CREATOR: Final = "creator" # Used in m.room.guest_access events. diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index 783a2896aea3..628b6c7aae6d 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -79,7 +79,7 @@ class RoomVersion: # m.room.power_levels auth rules. limit_notifications_power_levels: bool # MSC2175: No longer include the creator in m.room.create events. - msc2175_create_events: bool + msc2175_implicit_room_creator: bool # MSC2174/MSC2176: Apply updated redaction rules algorithm. msc2176_redaction_rules: bool # MSC3083: Support the 'restricted' join_rule. @@ -118,7 +118,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -138,7 +138,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -158,7 +158,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -178,7 +178,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -198,7 +198,7 @@ class RoomVersions: special_case_aliases_auth=True, strict_canonicaljson=False, limit_notifications_power_levels=False, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -218,7 +218,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -238,7 +238,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=True, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -258,7 +258,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -278,7 +278,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=False, @@ -298,7 +298,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, @@ -318,7 +318,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, @@ -338,7 +338,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, @@ -358,7 +358,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=False, msc3375_redaction_rules=False, @@ -379,7 +379,7 @@ class RoomVersions: special_case_aliases_auth=False, strict_canonicaljson=True, limit_notifications_power_levels=True, - msc2175_create_events=False, + msc2175_implicit_room_creator=False, msc2176_redaction_rules=False, msc3083_join_rules=True, msc3375_redaction_rules=True, diff --git a/synapse/event_auth.py b/synapse/event_auth.py index def039d2cc6e..6fad259b2484 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -457,7 +457,7 @@ def _check_create(event: "EventBase") -> None: # 1.4 If content has no creator field, reject if the room version requires it. if ( - not event.room_version.msc2175_create_events + not event.room_version.msc2175_implicit_room_creator and EventContentFields.ROOM_CREATOR not in event.content ): raise AuthError(403, "Create event lacks a 'creator' property") diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 66aba241579a..7b43efda16cc 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -1121,7 +1121,7 @@ async def create_event( ) # MSC2175 removes the creator field from the create event. - if not room_version.msc2175_create_events: + if not room_version.msc2175_implicit_room_creator: creation_content.update({"creator": creator_id}) creation_event, unpersisted_creation_context = await create_event( EventTypes.Create, creation_content, False From a353870852b7bbfbc151ad0ecb21741ef04c92ab Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 15:20:37 -0400 Subject: [PATCH 07/12] Update check against creator. --- synapse/event_auth.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/synapse/event_auth.py b/synapse/event_auth.py index 6fad259b2484..a24341190a6d 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -494,7 +494,11 @@ def _is_membership_change_allowed( key = (EventTypes.Create, "") create = auth_events.get(key) if create and event.prev_event_ids()[0] == create.event_id: - if create.sender == event.state_key: + if room_version.msc2175_implicit_room_creator: + creator = create.sender + else: + creator = create.content[EventContentFields.ROOM_CREATOR] + if creator == event.state_key: return target_user_id = event.state_key From c66df213f34b525d0ae88e52ec826a4bc97d10cd Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Wed, 5 Apr 2023 15:22:18 -0400 Subject: [PATCH 08/12] Also update power level check. --- synapse/event_auth.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/synapse/event_auth.py b/synapse/event_auth.py index a24341190a6d..1041957c7536 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -1011,7 +1011,11 @@ def get_user_power_level(user_id: str, auth_events: StateMap["EventBase"]) -> in # that. key = (EventTypes.Create, "") create_event = auth_events.get(key) - if create_event is not None and create_event.sender == user_id: + if create_event.room_version.msc2175_implicit_room_creator: + creator = create_event.sender + else: + creator = create_event.content[EventContentFields.ROOM_CREATOR] + if create_event is not None and creator == user_id: return 100 else: return 0 From b18ab181235a993359d3580f73dc25cd14d55fa4 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 6 Apr 2023 12:04:52 -0400 Subject: [PATCH 09/12] Add back logic to use creator field. --- synapse/handlers/federation_event.py | 6 +++++- synapse/storage/databases/main/room.py | 13 ++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py index b2a37b9f5a8d..5690a7b83712 100644 --- a/synapse/handlers/federation_event.py +++ b/synapse/handlers/federation_event.py @@ -1515,9 +1515,13 @@ async def _handle_marker_event(self, origin: str, marker_event: EventBase) -> No # support it or the event is not from the room creator. room_version = await self._store.get_room_version(marker_event.room_id) create_event = await self._store.get_create_event_for_room(marker_event.room_id) + if room_version.msc2175_implicit_room_creator: + room_creator = create_event.sender + else: + room_creator = create_event.content.get(EventContentFields.ROOM_CREATOR) if not room_version.msc2716_historical and ( not self._config.experimental.msc2716_enabled - or marker_event.sender != create_event.sender + or marker_event.sender != room_creator ): return diff --git a/synapse/storage/databases/main/room.py b/synapse/storage/databases/main/room.py index 3dfb405093d2..dd7dbb6901c8 100644 --- a/synapse/storage/databases/main/room.py +++ b/synapse/storage/databases/main/room.py @@ -2135,6 +2135,17 @@ async def upsert_room_on_join( # invalid, and it would fail auth checks anyway. raise StoreError(400, "No create event in state") + # Before MSC2175, the room creator was a separate field. + if not room_version.msc2175_implicit_room_creator: + room_creator = create_event.content.get(EventContentFields.ROOM_CREATOR) + + if not isinstance(room_creator, str): + # If the create event does not have a creator then the room is + # invalid, and it would fail auth checks anyway. + raise StoreError(400, "No creator defined on the create event") + else: + room_creator = create_event.sender + await self.db_pool.simple_upsert( desc="upsert_room_on_join", table="rooms", @@ -2142,7 +2153,7 @@ async def upsert_room_on_join( values={"room_version": room_version.identifier}, insertion_values={ "is_public": False, - "creator": create_event.sender, + "creator": room_creator, "has_auth_chain_index": has_auth_chain_index, }, ) From b682443d2414658f56f30030c406fb6a05659f08 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 6 Apr 2023 12:07:00 -0400 Subject: [PATCH 10/12] Fix-up one more spot. --- synapse/handlers/message.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index af75d7618126..6adcc98f0c35 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -1909,12 +1909,18 @@ async def persist_and_notify_client_events( room_version_obj = KNOWN_ROOM_VERSIONS[room_version] create_event = await self.store.get_create_event_for_room(event.room_id) + if room_version_obj.msc2175_implicit_room_creator: + room_creator = create_event.sender + else: + room_creator = create_event.content.get( + EventContentFields.ROOM_CREATOR + ) # Only check an insertion event if the room version # supports it or the event is from the room creator. if room_version_obj.msc2716_historical or ( self.config.experimental.msc2716_enabled - and event.sender == create_event.sender + and event.sender == room_creator ): next_batch_id = event.content.get( EventContentFields.MSC2716_NEXT_BATCH_ID From 96598a5c167ea9740523e3e83d777a288e91499c Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 6 Apr 2023 12:33:54 -0400 Subject: [PATCH 11/12] Lint --- synapse/event_auth.py | 16 ++++++++-------- synapse/handlers/federation_event.py | 6 +++--- synapse/handlers/message.py | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/synapse/event_auth.py b/synapse/event_auth.py index 1041957c7536..f95d00d4729b 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -1011,14 +1011,14 @@ def get_user_power_level(user_id: str, auth_events: StateMap["EventBase"]) -> in # that. key = (EventTypes.Create, "") create_event = auth_events.get(key) - if create_event.room_version.msc2175_implicit_room_creator: - creator = create_event.sender - else: - creator = create_event.content[EventContentFields.ROOM_CREATOR] - if create_event is not None and creator == user_id: - return 100 - else: - return 0 + if create_event is not None: + if create_event.room_version.msc2175_implicit_room_creator: + creator = create_event.sender + else: + creator = create_event.content[EventContentFields.ROOM_CREATOR] + if creator == user_id: + return 100 + return 0 def get_named_level(auth_events: StateMap["EventBase"], name: str, default: int) -> int: diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py index 5690a7b83712..8d5be81a9207 100644 --- a/synapse/handlers/federation_event.py +++ b/synapse/handlers/federation_event.py @@ -1515,10 +1515,10 @@ async def _handle_marker_event(self, origin: str, marker_event: EventBase) -> No # support it or the event is not from the room creator. room_version = await self._store.get_room_version(marker_event.room_id) create_event = await self._store.get_create_event_for_room(marker_event.room_id) - if room_version.msc2175_implicit_room_creator: - room_creator = create_event.sender - else: + if not room_version.msc2175_implicit_room_creator: room_creator = create_event.content.get(EventContentFields.ROOM_CREATOR) + else: + room_creator = create_event.sender if not room_version.msc2716_historical and ( not self._config.experimental.msc2716_enabled or marker_event.sender != room_creator diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index 6adcc98f0c35..a17fe3bf530b 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -1909,12 +1909,12 @@ async def persist_and_notify_client_events( room_version_obj = KNOWN_ROOM_VERSIONS[room_version] create_event = await self.store.get_create_event_for_room(event.room_id) - if room_version_obj.msc2175_implicit_room_creator: - room_creator = create_event.sender - else: + if not room_version_obj.msc2175_implicit_room_creator: room_creator = create_event.content.get( EventContentFields.ROOM_CREATOR ) + else: + room_creator = create_event.sender # Only check an insertion event if the room version # supports it or the event is from the room creator. From 22a71da19cec1efe8164ce7ddc2b489d587729d1 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Thu, 6 Apr 2023 14:45:53 -0400 Subject: [PATCH 12/12] Avoid allocating a dict. --- synapse/handlers/room.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 7b43efda16cc..2d69cabf43d0 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -1122,7 +1122,7 @@ async def create_event( # MSC2175 removes the creator field from the create event. if not room_version.msc2175_implicit_room_creator: - creation_content.update({"creator": creator_id}) + creation_content["creator"] = creator_id creation_event, unpersisted_creation_context = await create_event( EventTypes.Create, creation_content, False )