From db8a8d33fec3d4104de100a2360033ce9676d2d1 Mon Sep 17 00:00:00 2001 From: Kegan Dougal <7190048+kegsay@users.noreply.github.com> Date: Fri, 13 Jun 2025 12:56:39 +0100 Subject: [PATCH] bugfix: calculate the PL for non-creators correctly in v11 rooms (#18547) Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com> --- changelog.d/18547.bugfix | 1 + synapse/state/v2.py | 2 +- tests/state/test_v2.py | 56 ++++++++++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 changelog.d/18547.bugfix diff --git a/changelog.d/18547.bugfix b/changelog.d/18547.bugfix new file mode 100644 index 000000000..ee1bfc8f2 --- /dev/null +++ b/changelog.d/18547.bugfix @@ -0,0 +1 @@ +Fix an issue where during state resolution for v11 rooms Synapse would incorrectly calculate the power level of the creator when there was no power levels event in the room. diff --git a/synapse/state/v2.py b/synapse/state/v2.py index 11e80df42..69df9eb77 100644 --- a/synapse/state/v2.py +++ b/synapse/state/v2.py @@ -255,7 +255,7 @@ async def _get_power_level_for_sender( ) if aev and (aev.type, aev.state_key) == (EventTypes.Create, ""): creator = ( - event.sender + aev.sender if event.room_version.implicit_room_creator else aev.content.get("creator") ) diff --git a/tests/state/test_v2.py b/tests/state/test_v2.py index 968c1ff64..3e8f9a435 100644 --- a/tests/state/test_v2.py +++ b/tests/state/test_v2.py @@ -961,25 +961,47 @@ class AuthChainDifferenceTestCase(unittest.TestCase): f"wrong pl for {user_id} on v{room_version.identifier}", ) - # the creator alone without PL is 100 - got_creator_pl = self.successResultOf( - defer.ensureDeferred( - _get_power_level_for_sender( - ROOM_ID, - member_event.event_id, - { - member_event.event_id: member_event, - create_event.event_id: create_event, - }, - store, + # the creator alone without PL is 100, everyone else is 0 + want_pls = { + ALICE: 100, + BOB: 0, + CHARLIE: 0, + } + for user_id, want_pl in want_pls.items(): + test_event = make_event_from_dict( + { + "room_id": ROOM_ID, + "sender": user_id, + "type": EventTypes.Topic, + "state_key": "", + "content": {"topic": "Test"}, + "auth_events": [ + create_event.event_id, + member_event.event_id, + pl_event.event_id, + ], + "prev_events": [pl_event.event_id], + }, + room_version, + ) + got_pl = self.successResultOf( + defer.ensureDeferred( + _get_power_level_for_sender( + ROOM_ID, + test_event.event_id, + { + test_event.event_id: test_event, + create_event.event_id: create_event, + }, + store, + ) ) ) - ) - self.assertEqual( - got_creator_pl, - 100, - f"wrong pl for creator with no PL event on v{room_version.identifier}", - ) + self.assertEqual( + got_pl, + want_pl, + f"wrong pl for {user_id} with no PL event on v{room_version.identifier}", + ) T = TypeVar("T")