Skip to content
This repository was 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 1 commit
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
Prev Previous commit
Next Next commit
Transfer power levels on room create, instead of afterwards
  • Loading branch information
anoadragon453 committed Nov 18, 2019
commit 64a9b8fd18397025e8566a28d17bd0c731b21989
2 changes: 1 addition & 1 deletion changelog.d/6237.bugfix
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Transfer power levels on room upgrade.
Transfer non-standard power levels on room upgrade.
4 changes: 4 additions & 0 deletions synapse/handlers/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,8 @@ def send_nonmember_event(self, requester, event, context, ratelimit=True):
)
return prev_state

logger.info("Really sending new event: %s", event)

yield self.handle_new_client_event(
requester=requester, event=event, context=context, ratelimit=ratelimit
)
Expand Down Expand Up @@ -580,6 +582,8 @@ def create_and_send_nonmember_event(
requester, event_dict, token_id=requester.access_token_id, txn_id=txn_id
)

logger.info("Created new event: %s", event)

spam_error = self.spam_checker.check_event_for_spam(event)
if spam_error:
if not isinstance(spam_error, string_types):
Expand Down
42 changes: 12 additions & 30 deletions synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,39 +195,34 @@ def _upgrade_room(self, requester, old_room_id, new_version):
old_room_id, new_room_id
)

# finally, shut down the PLs in the old room, and update them in the new
# room.
yield self._update_upgraded_room_pls(
requester, old_room_id, new_room_id, old_room_state
)
# finally, shut down the PLs in the old room
# PLs are transferred in clone_existing_room
yield self._update_upgraded_room_pls(requester, old_room_id, old_room_state)

return 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
def _update_upgraded_room_pls(self, requester, room_id, room_state):
"""Send updated power levels in a room 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
room_id (unicode): the id of the room to be replaced
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, ""))
room_pl_event_id = room_state.get((EventTypes.PowerLevels, ""))

if old_room_pl_event_id is None:
if 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)
old_room_pl_state = yield self.store.get_event(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
Expand All @@ -245,7 +240,7 @@ def _update_upgraded_room_pls(
logger.info(
"Setting level for %s in %s to %i (was %i)",
v,
old_room_id,
room_id,
restricted_level,
current,
)
Expand All @@ -261,7 +256,7 @@ def _update_upgraded_room_pls(
{
"type": EventTypes.PowerLevels,
"state_key": "",
"room_id": old_room_id,
"room_id": room_id,
"sender": requester.user.to_string(),
"content": pl_content,
},
Expand All @@ -270,19 +265,6 @@ def _update_upgraded_room_pls(
except AuthError as e:
logger.warning("Unable to update PLs in old room: %s", e)

logger.info("Setting correct PLs in new room")
yield self.event_creation_handler.create_and_send_nonmember_event(
requester,
{
"type": EventTypes.PowerLevels,
"state_key": "",
"room_id": new_room_id,
"sender": requester.user.to_string(),
"content": old_room_pl_state.content,
},
ratelimit=False,
)

@defer.inlineCallbacks
def clone_existing_room(
self, requester, old_room_id, new_room_id, new_room_version, tombstone_event_id
Expand Down