From 579efd9e1edc2517d428d9cd6ea1a30370a260e5 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 8 Aug 2025 14:19:51 +0100 Subject: [PATCH] Support v12 rooms in maySendEvent (#4955) Follows on from https://github.com/matrix-org/matrix-js-sdk/pull/4937 (cherry picked from commit dea184e9ec3888d0b6d17108262b94abb7275c4d) --- spec/unit/room-state.spec.ts | 40 ++++++++++++++++++++++++++++++++++-- src/models/room-state.ts | 14 +++++-------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/spec/unit/room-state.spec.ts b/spec/unit/room-state.spec.ts index da3f5de6ca1..481833ee5f5 100644 --- a/spec/unit/room-state.spec.ts +++ b/spec/unit/room-state.spec.ts @@ -38,10 +38,10 @@ describe("RoomState", function () { const userLazy = "@lazy:bar"; let state = new RoomState(roomId); + let statev12 = new RoomState(roomId); beforeEach(function () { - state = new RoomState(roomId); - state.setStateEvents([ + const commonEvents = [ utils.mkMembership({ // userA joined event: true, @@ -66,6 +66,11 @@ describe("RoomState", function () { name: "Room name goes here", }, }), + ]; + + state = new RoomState(roomId); + state.setStateEvents([ + ...commonEvents, utils.mkEvent({ // Room creation type: "m.room.create", @@ -75,6 +80,19 @@ describe("RoomState", function () { content: {}, }), ]); + + statev12 = new RoomState(roomId); + statev12.setStateEvents([ + ...commonEvents, + utils.mkEvent({ + // Room creation (v12 version) + type: "m.room.create", + user: userA, + room: roomId, + event: true, + content: { room_version: "12" }, + }), + ]); }); describe("getMembers", function () { @@ -851,6 +869,24 @@ describe("RoomState", function () { expect(state.maySendEvent("m.room.other_thing", userA)).toEqual(true); expect(state.maySendEvent("m.room.other_thing", userB)).toEqual(false); }); + + it("should recognise power level of room creators in v12 rooms", function () { + const powerLevelEvent = new MatrixEvent({ + type: "m.room.power_levels", + room_id: roomId, + sender: userA, + state_key: "", + content: { + users_default: 0, + state_default: 100, + events_default: 100, + users: {}, + }, + }); + statev12.setStateEvents([powerLevelEvent]); + + expect(statev12.maySendEvent("m.room.name", userA)).toEqual(true); + }); }); describe("processBeaconEvents", () => { diff --git a/src/models/room-state.ts b/src/models/room-state.ts index a2f97bf9759..8dee3bc4d4d 100644 --- a/src/models/room-state.ts +++ b/src/models/room-state.ts @@ -904,7 +904,6 @@ export class RoomState extends TypedEventEmitter let stateDefault = 0; let eventsDefault = 0; - let powerLevel = 0; if (powerLevelsEvent) { powerLevels = powerLevelsEvent.getContent(); eventsLevels = powerLevels.events || {}; @@ -915,13 +914,6 @@ export class RoomState extends TypedEventEmitter stateDefault = 50; } - const userPowerLevel = powerLevels.users && powerLevels.users[userId]; - if (Number.isSafeInteger(userPowerLevel)) { - powerLevel = userPowerLevel!; - } else if (Number.isSafeInteger(powerLevels.users_default)) { - powerLevel = powerLevels.users_default!; - } - if (Number.isSafeInteger(powerLevels.events_default)) { eventsDefault = powerLevels.events_default!; } @@ -931,7 +923,11 @@ export class RoomState extends TypedEventEmitter if (Number.isSafeInteger(eventsLevels[eventType])) { requiredLevel = eventsLevels[eventType]; } - return powerLevel >= requiredLevel; + + const roomMember = this.getMember(userId); + const userPowerLevel = roomMember?.powerLevel ?? 0; + + return userPowerLevel >= requiredLevel; } /**