Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Transfer power level state events on room upgrade #6237

Merged
merged 12 commits into from
Dec 2, 2019
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/6237.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Transfer non-standard power levels on room upgrade.
31 changes: 29 additions & 2 deletions synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,8 @@ def _update_upgraded_room_pls(

Args:
requester (synapse.types.Requester): the user requesting the upgrade
old_room_id (unicode): the id of the room to be replaced
new_room_id (unicode): the id of the replacement room
old_room_id (str): the id of the room to be replaced
new_room_id (str): the id of the replacement room
old_room_state (dict[tuple[str, str], str]): the state map for the old room

Returns:
Expand Down Expand Up @@ -333,6 +333,7 @@ def clone_existing_room(
(EventTypes.Encryption, ""),
(EventTypes.ServerACL, ""),
(EventTypes.RelatedGroups, ""),
(EventTypes.PowerLevels, ""), # Removed before sending in the new room
)

old_room_state_ids = yield self.store.get_filtered_current_state_ids(
Expand All @@ -346,6 +347,31 @@ def clone_existing_room(
if old_event:
initial_state[k] = old_event.content

# Copy over user power levels now as this will not be possible with >100PL users once
# the room has been created
old_user_power_levels = initial_state[(EventTypes.PowerLevels, "")].get("users")
new_user_power_levels = None
if old_user_power_levels:
user_level_dict = {}

# Track the maximum power level in the old room, and temporarily make the
# upgrading user this power level so that they can replicate all state events over
# They will be returned to their original power level later
max_power_level = 100
for user, power_level in old_user_power_levels.items():
power_level = int(power_level)
user_level_dict[user] = power_level
max_power_level = max(max_power_level, power_level)

# Upgrade the requester to the max known room power level so that
# they're allowed to send any state event in the new room
user_level_dict[requester.user.to_string()] = max_power_level
new_user_power_levels = {"users": user_level_dict}

# Prevent the rest of the power level events from being transferred now. They will
# be transferred later after the room state has been established
del initial_state[(EventTypes.PowerLevels, "")]
anoadragon453 marked this conversation as resolved.
Show resolved Hide resolved

yield self._send_events_for_new_room(
requester,
new_room_id,
Expand All @@ -355,6 +381,7 @@ def clone_existing_room(
invite_list=[],
initial_state=initial_state,
creation_content=creation_content,
power_level_content_override=new_user_power_levels,
)

# Transfer membership events
Expand Down