Skip to content
Snippets Groups Projects
Unverified Commit 56ca578f authored by Richard van der Hoff's avatar Richard van der Hoff Committed by GitHub
Browse files

Merge pull request #4099 from matrix-org/rav/upgrade_odd_pls

Better handling of odd PLs during room upgrades
parents bf33eed6 db24d7f1
No related branches found
No related tags found
No related merge requests found
Support for replacing rooms with new ones
...@@ -136,53 +136,91 @@ class RoomCreationHandler(BaseHandler): ...@@ -136,53 +136,91 @@ class RoomCreationHandler(BaseHandler):
requester, tombstone_event, tombstone_context, requester, tombstone_event, tombstone_context,
) )
# and finally, shut down the PLs in the old room, and update them in the new
# room.
old_room_state = yield tombstone_context.get_current_state_ids(self.store) old_room_state = yield tombstone_context.get_current_state_ids(self.store)
old_room_pl_event_id = old_room_state.get((EventTypes.PowerLevels, ""))
if old_room_pl_event_id is None: yield self._update_upgraded_room_pls(
logger.warning( requester, old_room_id, new_room_id, old_room_state,
"Not supported: upgrading a room with no PL event. Not setting PLs " )
"in old room.",
defer.returnValue(new_room_id)
@defer.inlineCallbacks
def _update_upgraded_room_pls(
self, requester, old_room_id, new_room_id, old_room_state,
):
"""Send updated power levels in both rooms after an upgrade
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_state (dict[tuple[str, str], str]): the state map for the old room
Returns:
Deferred
"""
old_room_pl_event_id = old_room_state.get((EventTypes.PowerLevels, ""))
if old_room_pl_event_id is None:
logger.warning(
"Not supported: upgrading a room with no PL event. Not setting PLs "
"in old room.",
)
return
old_room_pl_state = yield self.store.get_event(old_room_pl_event_id)
# we try to stop regular users from speaking by setting the PL required
# to send regular events and invites to 'Moderator' level. That's normally
# 50, but if the default PL in a room is 50 or more, then we set the
# required PL above that.
pl_content = dict(old_room_pl_state.content)
users_default = int(pl_content.get("users_default", 0))
restricted_level = max(users_default + 1, 50)
updated = False
for v in ("invite", "events_default"):
current = int(pl_content.get(v, 0))
if current < restricted_level:
logger.info(
"Setting level for %s in %s to %i (was %i)",
v, old_room_id, restricted_level, current,
) )
pl_content[v] = restricted_level
updated = True
else: else:
# we try to stop regular users from speaking by setting the PL required logger.info(
# to send regular events and invites to 'Moderator' level. That's normally "Not setting level for %s (already %i)",
# 50, but if the default PL in a room is 50 or more, then we set the v, current,
# required PL above that. )
old_room_pl_state = yield self.store.get_event(old_room_pl_event_id) if updated:
pl_content = dict(old_room_pl_state.content) try:
users_default = int(pl_content.get("users_default", 0)) yield self.event_creation_handler.create_and_send_nonmember_event(
restricted_level = max(users_default + 1, 50) requester, {
"type": EventTypes.PowerLevels,
updated = False "state_key": '',
for v in ("invite", "events_default"): "room_id": old_room_id,
current = int(pl_content.get(v, 0)) "sender": requester.user.to_string(),
if current < restricted_level: "content": pl_content,
logger.debug( }, ratelimit=False,
"Setting level for %s in %s to %i (was %i)", )
v, old_room_id, restricted_level, current, except AuthError as e:
) logger.warning("Unable to update PLs in old room: %s", e)
pl_content[v] = restricted_level
updated = True logger.info("Setting correct PLs in new room")
else: yield self.event_creation_handler.create_and_send_nonmember_event(
logger.debug( requester, {
"Not setting level for %s (already %i)", "type": EventTypes.PowerLevels,
v, current, "state_key": '',
) "room_id": new_room_id,
"sender": requester.user.to_string(),
if updated: "content": old_room_pl_state.content,
yield self.event_creation_handler.create_and_send_nonmember_event( }, ratelimit=False,
requester, { )
"type": EventTypes.PowerLevels,
"state_key": '',
"room_id": old_room_id,
"sender": user_id,
"content": pl_content,
}, ratelimit=False,
)
defer.returnValue(new_room_id)
@defer.inlineCallbacks @defer.inlineCallbacks
def clone_exiting_room( def clone_exiting_room(
...@@ -223,7 +261,6 @@ class RoomCreationHandler(BaseHandler): ...@@ -223,7 +261,6 @@ class RoomCreationHandler(BaseHandler):
initial_state = dict() initial_state = dict()
types_to_copy = ( types_to_copy = (
(EventTypes.PowerLevels, ""),
(EventTypes.JoinRules, ""), (EventTypes.JoinRules, ""),
(EventTypes.Name, ""), (EventTypes.Name, ""),
(EventTypes.Topic, ""), (EventTypes.Topic, ""),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment