Skip to content

Commit dea184e

Browse files
authored
Support v12 rooms in maySendEvent (#4955)
Follows on from #4937
1 parent e119bf9 commit dea184e

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

spec/unit/room-state.spec.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ describe("RoomState", function () {
3939
const userLazy = "@lazy:bar";
4040

4141
let state = new RoomState(roomId);
42+
let statev12 = new RoomState(roomId);
4243

4344
beforeEach(function () {
44-
state = new RoomState(roomId);
45-
state.setStateEvents([
45+
const commonEvents = [
4646
utils.mkMembership({
4747
// userA joined
4848
event: true,
@@ -67,6 +67,11 @@ describe("RoomState", function () {
6767
name: "Room name goes here",
6868
},
6969
}),
70+
];
71+
72+
state = new RoomState(roomId);
73+
state.setStateEvents([
74+
...commonEvents,
7075
utils.mkEvent({
7176
// Room creation
7277
type: "m.room.create",
@@ -76,6 +81,19 @@ describe("RoomState", function () {
7681
content: {},
7782
}),
7883
]);
84+
85+
statev12 = new RoomState(roomId);
86+
statev12.setStateEvents([
87+
...commonEvents,
88+
utils.mkEvent({
89+
// Room creation (v12 version)
90+
type: "m.room.create",
91+
user: userA,
92+
room: roomId,
93+
event: true,
94+
content: { room_version: "12" },
95+
}),
96+
]);
7997
});
8098

8199
describe("getMembers", function () {
@@ -1002,6 +1020,24 @@ describe("RoomState", function () {
10021020
expect(state.maySendEvent("m.room.other_thing", userA)).toEqual(true);
10031021
expect(state.maySendEvent("m.room.other_thing", userB)).toEqual(false);
10041022
});
1023+
1024+
it("should recognise power level of room creators in v12 rooms", function () {
1025+
const powerLevelEvent = new MatrixEvent({
1026+
type: "m.room.power_levels",
1027+
room_id: roomId,
1028+
sender: userA,
1029+
state_key: "",
1030+
content: {
1031+
users_default: 0,
1032+
state_default: 100,
1033+
events_default: 100,
1034+
users: {},
1035+
},
1036+
});
1037+
statev12.setStateEvents([powerLevelEvent]);
1038+
1039+
expect(statev12.maySendEvent("m.room.name", userA)).toEqual(true);
1040+
});
10051041
});
10061042

10071043
describe("processBeaconEvents", () => {

src/models/room-state.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,6 @@ export class RoomState extends TypedEventEmitter<EmittedEvents, EventHandlerMap>
939939

940940
let stateDefault = 0;
941941
let eventsDefault = 0;
942-
let powerLevel = 0;
943942
if (powerLevelsEvent) {
944943
powerLevels = powerLevelsEvent.getContent();
945944
eventsLevels = powerLevels.events || {};
@@ -950,13 +949,6 @@ export class RoomState extends TypedEventEmitter<EmittedEvents, EventHandlerMap>
950949
stateDefault = 50;
951950
}
952951

953-
const userPowerLevel = powerLevels.users && powerLevels.users[userId];
954-
if (Number.isSafeInteger(userPowerLevel)) {
955-
powerLevel = userPowerLevel!;
956-
} else if (Number.isSafeInteger(powerLevels.users_default)) {
957-
powerLevel = powerLevels.users_default!;
958-
}
959-
960952
if (Number.isSafeInteger(powerLevels.events_default)) {
961953
eventsDefault = powerLevels.events_default!;
962954
}
@@ -966,7 +958,11 @@ export class RoomState extends TypedEventEmitter<EmittedEvents, EventHandlerMap>
966958
if (Number.isSafeInteger(eventsLevels[eventType])) {
967959
requiredLevel = eventsLevels[eventType];
968960
}
969-
return powerLevel >= requiredLevel;
961+
962+
const roomMember = this.getMember(userId);
963+
const userPowerLevel = roomMember?.powerLevel ?? 0;
964+
965+
return userPowerLevel >= requiredLevel;
970966
}
971967

972968
/**

0 commit comments

Comments
 (0)