bugfix: calculate the PL for non-creators correctly in v11 rooms (#18547)

Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com>
This commit is contained in:
Kegan Dougal 2025-06-13 12:56:39 +01:00 committed by GitHub
parent 3b94e40cc8
commit db8a8d33fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 41 additions and 18 deletions

1
changelog.d/18547.bugfix Normal file
View File

@ -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.

View File

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

View File

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