diff options
author | Patrick Cloke <clokep@users.noreply.github.com> | 2021-09-10 07:30:05 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-10 07:30:05 -0400 |
commit | 63f28e4a0c22c8133a6da175c7986e389fc781e2 (patch) | |
tree | c25ff6dab53962277a127e6c4e07614f8113209d /synapse | |
parent | Easy refactors of the user directory (#10789) (diff) | |
download | synapse-63f28e4a0c22c8133a6da175c7986e389fc781e2.tar.xz |
Handle room upgrades for spaces (#10774)
By copying the `room_type` field of the create event and migrating any non-empty `m.space.child` events to the new room that is created.
Diffstat (limited to 'synapse')
-rw-r--r-- | synapse/handlers/room.py | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 2932ed8a94..9345ae02e0 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -33,6 +33,7 @@ from synapse.api.constants import ( Membership, RoomCreationPreset, RoomEncryptionAlgorithms, + RoomTypes, ) from synapse.api.errors import ( AuthError, @@ -397,7 +398,7 @@ class RoomCreationHandler(BaseHandler): initial_state = {} # Replicate relevant room events - types_to_copy = ( + types_to_copy: List[Tuple[str, Optional[str]]] = [ (EventTypes.JoinRules, ""), (EventTypes.Name, ""), (EventTypes.Topic, ""), @@ -408,7 +409,16 @@ class RoomCreationHandler(BaseHandler): (EventTypes.ServerACL, ""), (EventTypes.RelatedGroups, ""), (EventTypes.PowerLevels, ""), - ) + ] + + # If the old room was a space, copy over the room type and the rooms in + # the space. + if ( + old_room_create_event.content.get(EventContentFields.ROOM_TYPE) + == RoomTypes.SPACE + ): + creation_content[EventContentFields.ROOM_TYPE] = RoomTypes.SPACE + types_to_copy.append((EventTypes.SpaceChild, None)) old_room_state_ids = await self.store.get_filtered_current_state_ids( old_room_id, StateFilter.from_types(types_to_copy) @@ -419,6 +429,11 @@ class RoomCreationHandler(BaseHandler): for k, old_event_id in old_room_state_ids.items(): old_event = old_room_state_events.get(old_event_id) if old_event: + # If the event is an space child event with empty content, it was + # removed from the space and should be ignored. + if k[0] == EventTypes.SpaceChild and not old_event.content: + continue + initial_state[k] = old_event.content # deep-copy the power-levels event before we start modifying it |