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")