diff --git a/spec/unit/room-state.spec.ts b/spec/unit/room-state.spec.ts index 2d986104bc..0a5334cb24 100644 --- a/spec/unit/room-state.spec.ts +++ b/spec/unit/room-state.spec.ts @@ -39,10 +39,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, @@ -67,6 +67,11 @@ describe("RoomState", function () { name: "Room name goes here", }, }), + ]; + + state = new RoomState(roomId); + state.setStateEvents([ + ...commonEvents, utils.mkEvent({ // Room creation type: "m.room.create", @@ -76,6 +81,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 () { @@ -1002,6 +1020,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 445f83920c..25057a20af 100644 --- a/src/models/room-state.ts +++ b/src/models/room-state.ts @@ -939,7 +939,6 @@ export class RoomState extends TypedEventEmitter let stateDefault = 0; let eventsDefault = 0; - let powerLevel = 0; if (powerLevelsEvent) { powerLevels = powerLevelsEvent.getContent(); eventsLevels = powerLevels.events || {}; @@ -950,13 +949,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!; } @@ -966,7 +958,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; } /**