Fix power levels being incorrectly set in old and new rooms after a room upgrade (#6633)

Modify a copy of an upgraded room's PL before sending to the new room
pull/6642/head
Andrew Morgan 2020-01-06 04:53:07 -05:00 committed by Richard van der Hoff
parent 08815566bc
commit 01c3c6c929
2 changed files with 11 additions and 7 deletions

1
changelog.d/6633.bugfix Normal file
View File

@ -0,0 +1 @@
Fix bug where a moderator upgraded a room and became an admin in the new room.

View File

@ -16,6 +16,7 @@
# limitations under the License. # limitations under the License.
"""Contains functions for performing events on rooms.""" """Contains functions for performing events on rooms."""
import copy
import itertools import itertools
import logging import logging
import math import math
@ -271,7 +272,7 @@ class RoomCreationHandler(BaseHandler):
except AuthError as e: except AuthError as e:
logger.warning("Unable to update PLs in old room: %s", e) logger.warning("Unable to update PLs in old room: %s", e)
logger.info("Setting correct PLs in new room") logger.info("Setting correct PLs in new room to %s", old_room_pl_state.content)
yield self.event_creation_handler.create_and_send_nonmember_event( yield self.event_creation_handler.create_and_send_nonmember_event(
requester, requester,
{ {
@ -365,13 +366,15 @@ class RoomCreationHandler(BaseHandler):
needed_power_level = max(state_default, ban, max(event_power_levels.values())) needed_power_level = max(state_default, ban, max(event_power_levels.values()))
# Raise the requester's power level in the new room if necessary # Raise the requester's power level in the new room if necessary
current_power_level = power_levels["users"][requester.user.to_string()] current_power_level = power_levels["users"][user_id]
if current_power_level < needed_power_level: if current_power_level < needed_power_level:
# Assign this power level to the requester # Perform a deepcopy in order to not modify the original power levels in a
power_levels["users"][requester.user.to_string()] = needed_power_level # room, as its contents are preserved as the state for the old room later on
new_power_levels = copy.deepcopy(power_levels)
initial_state[(EventTypes.PowerLevels, "")] = new_power_levels
# Set the power levels to the modified state # Assign this power level to the requester
initial_state[(EventTypes.PowerLevels, "")] = power_levels new_power_levels["users"][user_id] = needed_power_level
yield self._send_events_for_new_room( yield self._send_events_for_new_room(
requester, requester,
@ -733,7 +736,7 @@ class RoomCreationHandler(BaseHandler):
initial_state, initial_state,
creation_content, creation_content,
room_alias=None, room_alias=None,
power_level_content_override=None, power_level_content_override=None, # Doesn't apply when initial state has power level state event content
creator_join_profile=None, creator_join_profile=None,
): ):
def create(etype, content, **kwargs): def create(etype, content, **kwargs):