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

Commit

Permalink
Fix upgrading a room without events field in power levels (#16725)
Browse files Browse the repository at this point in the history
  • Loading branch information
David Robertson authored Dec 5, 2023
1 parent e87499b commit 0a00c99
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
1 change: 1 addition & 0 deletions changelog.d/16725.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a bug introduced in Synapse 1.7.2 where rooms whose power levels lacked an `events` field could not be upgraded.
2 changes: 1 addition & 1 deletion synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ async def clone_existing_room(
except (TypeError, ValueError):
ban = 50
needed_power_level = max(
state_default_int, ban, max(event_power_levels.values())
state_default_int, ban, max(event_power_levels.values(), default=0)
)

# Get the user's current power level, this matches the logic in get_user_power_level,
Expand Down
28 changes: 28 additions & 0 deletions tests/rest/client/test_upgrade_room.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,34 @@ def test_stringy_power_levels(self) -> None:
# We should now have an integer power level.
self.assertEqual(new_power_levels["users"][self.creator], 100, new_power_levels)

def test_events_field_missing(self) -> None:
"""Regression test for https://github.com/matrix-org/synapse/issues/16715."""
# Create a new room.
room_id = self.helper.create_room_as(
self.creator, tok=self.creator_token, room_version="10"
)
self.helper.join(room_id, self.other, tok=self.other_token)

# Retrieve the room's current power levels.
power_levels = self.helper.get_state(
room_id,
"m.room.power_levels",
tok=self.creator_token,
)

# Remove the events field and re-set the power levels.
del power_levels["events"]
self.helper.send_state(
room_id,
"m.room.power_levels",
body=power_levels,
tok=self.creator_token,
)

# Upgrade the room. Check the homeserver reports success.
channel = self._upgrade_room(room_id=room_id)
self.assertEqual(200, channel.code, channel.result)

def test_space(self) -> None:
"""Test upgrading a space."""

Expand Down

0 comments on commit 0a00c99

Please sign in to comment.