mirror of
https://mau.dev/maunium/synapse.git
synced 2024-10-01 01:36:05 -04:00
Transfer power level state events on room upgrade (#6237)
This commit is contained in:
parent
0ad75fd98e
commit
72078e4be5
1
changelog.d/6237.bugfix
Normal file
1
changelog.d/6237.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
Transfer non-standard power levels on room upgrade.
|
@ -198,21 +198,21 @@ class RoomCreationHandler(BaseHandler):
|
|||||||
# finally, shut down the PLs in the old room, and update them in the new
|
# finally, shut down the PLs in the old room, and update them in the new
|
||||||
# room.
|
# room.
|
||||||
yield self._update_upgraded_room_pls(
|
yield self._update_upgraded_room_pls(
|
||||||
requester, old_room_id, new_room_id, old_room_state
|
requester, old_room_id, new_room_id, old_room_state,
|
||||||
)
|
)
|
||||||
|
|
||||||
return new_room_id
|
return new_room_id
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _update_upgraded_room_pls(
|
def _update_upgraded_room_pls(
|
||||||
self, requester, old_room_id, new_room_id, old_room_state
|
self, requester, old_room_id, new_room_id, old_room_state,
|
||||||
):
|
):
|
||||||
"""Send updated power levels in both rooms after an upgrade
|
"""Send updated power levels in both rooms after an upgrade
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
requester (synapse.types.Requester): the user requesting the upgrade
|
requester (synapse.types.Requester): the user requesting the upgrade
|
||||||
old_room_id (unicode): the id of the room to be replaced
|
old_room_id (str): the id of the room to be replaced
|
||||||
new_room_id (unicode): the id of the replacement room
|
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
|
old_room_state (dict[tuple[str, str], str]): the state map for the old room
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -298,7 +298,7 @@ class RoomCreationHandler(BaseHandler):
|
|||||||
tombstone_event_id (unicode|str): the ID of the tombstone event in the old
|
tombstone_event_id (unicode|str): the ID of the tombstone event in the old
|
||||||
room.
|
room.
|
||||||
Returns:
|
Returns:
|
||||||
Deferred[None]
|
Deferred
|
||||||
"""
|
"""
|
||||||
user_id = requester.user.to_string()
|
user_id = requester.user.to_string()
|
||||||
|
|
||||||
@ -333,6 +333,7 @@ class RoomCreationHandler(BaseHandler):
|
|||||||
(EventTypes.Encryption, ""),
|
(EventTypes.Encryption, ""),
|
||||||
(EventTypes.ServerACL, ""),
|
(EventTypes.ServerACL, ""),
|
||||||
(EventTypes.RelatedGroups, ""),
|
(EventTypes.RelatedGroups, ""),
|
||||||
|
(EventTypes.PowerLevels, ""),
|
||||||
)
|
)
|
||||||
|
|
||||||
old_room_state_ids = yield self.store.get_filtered_current_state_ids(
|
old_room_state_ids = yield self.store.get_filtered_current_state_ids(
|
||||||
@ -346,6 +347,31 @@ class RoomCreationHandler(BaseHandler):
|
|||||||
if old_event:
|
if old_event:
|
||||||
initial_state[k] = old_event.content
|
initial_state[k] = old_event.content
|
||||||
|
|
||||||
|
# Resolve the minimum power level required to send any state event
|
||||||
|
# We will give the upgrading user this power level temporarily (if necessary) such that
|
||||||
|
# they are able to copy all of the state events over, then revert them back to their
|
||||||
|
# original power level afterwards in _update_upgraded_room_pls
|
||||||
|
|
||||||
|
# Copy over user power levels now as this will not be possible with >100PL users once
|
||||||
|
# the room has been created
|
||||||
|
|
||||||
|
power_levels = initial_state[(EventTypes.PowerLevels, "")]
|
||||||
|
|
||||||
|
# Calculate the minimum power level needed to clone the room
|
||||||
|
event_power_levels = power_levels.get("events", {})
|
||||||
|
state_default = power_levels.get("state_default", 0)
|
||||||
|
ban = power_levels.get("ban")
|
||||||
|
needed_power_level = max(state_default, ban, max(event_power_levels.values()))
|
||||||
|
|
||||||
|
# Raise the requester's power level in the new room if necessary
|
||||||
|
current_power_level = power_levels["users"][requester.user.to_string()]
|
||||||
|
if current_power_level < needed_power_level:
|
||||||
|
# Assign this power level to the requester
|
||||||
|
power_levels["users"][requester.user.to_string()] = needed_power_level
|
||||||
|
|
||||||
|
# Set the power levels to the modified state
|
||||||
|
initial_state[(EventTypes.PowerLevels, "")] = power_levels
|
||||||
|
|
||||||
yield self._send_events_for_new_room(
|
yield self._send_events_for_new_room(
|
||||||
requester,
|
requester,
|
||||||
new_room_id,
|
new_room_id,
|
||||||
|
Loading…
Reference in New Issue
Block a user