diff --git a/changelog.d/18547.bugfix b/changelog.d/18547.bugfix new file mode 100644 index 0000000000..ee1bfc8f27 --- /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 11e80df425..69df9eb770 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 968c1ff64c..3e8f9a4358 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")