From 65cbbaaf016571a6db4b6f4f124d0c3b2cba63a7 Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Thu, 24 Aug 2023 13:58:04 +0200 Subject: [PATCH] Use sender instead of content.creator field on m.room.create events (#3675) * Use sender instead of content.creator field on m.room.create events * Restore room_version fields in fixtures * Add test case for undefined sender scenario --- .../integ/matrix-client-event-emitter.spec.ts | 4 +-- .../matrix-client-event-timeline.spec.ts | 4 +-- spec/integ/matrix-client-methods.spec.ts | 1 - spec/integ/matrix-client-opts.spec.ts | 4 +-- .../integ/matrix-client-room-timeline.spec.ts | 4 +-- spec/integ/matrix-client-syncing.spec.ts | 26 +++++-------------- ...matrix-client-unread-notifications.spec.ts | 1 - spec/integ/sliding-sync-sdk.spec.ts | 24 ++++++++--------- spec/unit/matrix-client.spec.ts | 1 - spec/unit/room-state.spec.ts | 4 +-- spec/unit/room.spec.ts | 24 ++++++++++++++--- src/models/event.ts | 1 - src/models/room.ts | 2 +- 13 files changed, 44 insertions(+), 56 deletions(-) diff --git a/spec/integ/matrix-client-event-emitter.spec.ts b/spec/integ/matrix-client-event-emitter.spec.ts index 397ebd824..c9cd069d1 100644 --- a/spec/integ/matrix-client-event-emitter.spec.ts +++ b/spec/integ/matrix-client-event-emitter.spec.ts @@ -92,9 +92,7 @@ describe("MatrixClient events", function () { type: "m.room.create", room: "!erufh:bar", user: "@foo:bar", - content: { - creator: "@foo:bar", - }, + content: {}, }), ], }, diff --git a/spec/integ/matrix-client-event-timeline.spec.ts b/spec/integ/matrix-client-event-timeline.spec.ts index 0d519cbc5..89cfdb486 100644 --- a/spec/integ/matrix-client-event-timeline.spec.ts +++ b/spec/integ/matrix-client-event-timeline.spec.ts @@ -107,9 +107,7 @@ const INITIAL_SYNC_DATA = { utils.mkEvent({ type: "m.room.create", user: userId, - content: { - creator: userId, - }, + content: {}, event: false, }), ], diff --git a/spec/integ/matrix-client-methods.spec.ts b/spec/integ/matrix-client-methods.spec.ts index 977190abd..c22894a18 100644 --- a/spec/integ/matrix-client-methods.spec.ts +++ b/spec/integ/matrix-client-methods.spec.ts @@ -1989,7 +1989,6 @@ const buildEventCreate = () => new MatrixEvent({ age: 80126105, content: { - creator: "@andybalaam-test1:matrix.org", room_version: "6", }, event_id: "$e7j2Gt37k5NPwB6lz2N3V9lO5pUdNK8Ai7i2FPEK-oI", diff --git a/spec/integ/matrix-client-opts.spec.ts b/spec/integ/matrix-client-opts.spec.ts index 5a851ff02..15ef324cb 100644 --- a/spec/integ/matrix-client-opts.spec.ts +++ b/spec/integ/matrix-client-opts.spec.ts @@ -57,9 +57,7 @@ describe("MatrixClient opts", function () { type: "m.room.create", room: roomId, user: userId, - content: { - creator: userId, - }, + content: {}, }), ], }, diff --git a/spec/integ/matrix-client-room-timeline.spec.ts b/spec/integ/matrix-client-room-timeline.spec.ts index e3f62457c..1eb7a0362 100644 --- a/spec/integ/matrix-client-room-timeline.spec.ts +++ b/spec/integ/matrix-client-room-timeline.spec.ts @@ -85,9 +85,7 @@ describe("MatrixClient room timelines", function () { type: "m.room.create", room: roomId, user: userId, - content: { - creator: userId, - }, + content: {}, }), ], }, diff --git a/spec/integ/matrix-client-syncing.spec.ts b/spec/integ/matrix-client-syncing.spec.ts index cea06d10d..10bb7fc3e 100644 --- a/spec/integ/matrix-client-syncing.spec.ts +++ b/spec/integ/matrix-client-syncing.spec.ts @@ -389,9 +389,7 @@ describe("MatrixClient syncing", () => { type: "m.room.create", room: roomOne, user: selfUserId, - content: { - creator: selfUserId, - }, + content: {}, }), ], }, @@ -577,9 +575,7 @@ describe("MatrixClient syncing", () => { type: "m.room.create", room: roomOne, user: selfUserId, - content: { - creator: selfUserId, - }, + content: {}, }), ], }, @@ -611,9 +607,7 @@ describe("MatrixClient syncing", () => { type: "m.room.create", room: roomTwo, user: selfUserId, - content: { - creator: selfUserId, - }, + content: {}, }), ], }, @@ -758,7 +752,6 @@ describe("MatrixClient syncing", () => { room: roomOne, user: otherUserId, content: { - creator: otherUserId, room_version: "9", }, }); @@ -844,7 +837,6 @@ describe("MatrixClient syncing", () => { room: roomOne, user: otherUserId, content: { - creator: otherUserId, room_version: testMeta.roomVersion, }, }); @@ -1372,9 +1364,7 @@ describe("MatrixClient syncing", () => { type: "m.room.create", room: roomOne, user: selfUserId, - content: { - creator: selfUserId, - }, + content: {}, }), ], } as Partial, @@ -1471,9 +1461,7 @@ describe("MatrixClient syncing", () => { type: "m.room.create", room: roomOne, user: selfUserId, - content: { - creator: selfUserId, - }, + content: {}, }), ], }, @@ -1629,9 +1617,7 @@ describe("MatrixClient syncing", () => { type: "m.room.create", room: roomId, user: selfUserId, - content: { - creator: selfUserId, - }, + content: {}, }), ], }, diff --git a/spec/integ/matrix-client-unread-notifications.spec.ts b/spec/integ/matrix-client-unread-notifications.spec.ts index a4d3c2b89..884b897ed 100644 --- a/spec/integ/matrix-client-unread-notifications.spec.ts +++ b/spec/integ/matrix-client-unread-notifications.spec.ts @@ -179,7 +179,6 @@ describe("MatrixClient syncing", () => { events: [ { content: { - creator: userB, room_version: "9", }, origin_server_ts: 1, diff --git a/spec/integ/sliding-sync-sdk.spec.ts b/spec/integ/sliding-sync-sdk.spec.ts index 4785ca73b..d67e66852 100644 --- a/spec/integ/sliding-sync-sdk.spec.ts +++ b/spec/integ/sliding-sync-sdk.spec.ts @@ -188,7 +188,7 @@ describe("SlidingSyncSdk", () => { [roomA]: { name: "A", required_state: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnStateEvent(EventType.RoomName, { name: "A" }, ""), @@ -203,7 +203,7 @@ describe("SlidingSyncSdk", () => { name: "B", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnEvent(EventType.RoomMessage, { body: "hello B" }), @@ -215,7 +215,7 @@ describe("SlidingSyncSdk", () => { name: "C", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnEvent(EventType.RoomMessage, { body: "hello C" }), @@ -228,7 +228,7 @@ describe("SlidingSyncSdk", () => { name: "D", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnEvent(EventType.RoomMessage, { body: "hello D" }), @@ -264,7 +264,7 @@ describe("SlidingSyncSdk", () => { [roomF]: { name: "#foo:localhost", required_state: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnStateEvent(EventType.RoomCanonicalAlias, { alias: "#foo:localhost" }, ""), @@ -280,7 +280,7 @@ describe("SlidingSyncSdk", () => { name: "G", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), ], @@ -292,7 +292,7 @@ describe("SlidingSyncSdk", () => { name: "H", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnEvent(EventType.RoomMessage, { body: "live event" }), @@ -602,7 +602,7 @@ describe("SlidingSyncSdk", () => { name: "Room with Invite", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "invite" }, invitee), @@ -718,7 +718,7 @@ describe("SlidingSyncSdk", () => { name: "Room with account data", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnEvent(EventType.RoomMessage, { body: "hello" }), @@ -922,7 +922,7 @@ describe("SlidingSyncSdk", () => { name: "Room with typing", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnEvent(EventType.RoomMessage, { body: "hello" }), @@ -963,7 +963,7 @@ describe("SlidingSyncSdk", () => { name: "Room with typing", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), mkOwnEvent(EventType.RoomMessage, { body: "hello" }), @@ -1049,7 +1049,7 @@ describe("SlidingSyncSdk", () => { name: "Room with receipts", required_state: [], timeline: [ - mkOwnStateEvent(EventType.RoomCreate, { creator: selfUserId }, ""), + mkOwnStateEvent(EventType.RoomCreate, {}, ""), mkOwnStateEvent(EventType.RoomMember, { membership: "join" }, selfUserId), mkOwnStateEvent(EventType.RoomPowerLevels, { users: { [selfUserId]: 100 } }, ""), { diff --git a/spec/unit/matrix-client.spec.ts b/spec/unit/matrix-client.spec.ts index d90d3c9ed..1d08c8ca5 100644 --- a/spec/unit/matrix-client.spec.ts +++ b/spec/unit/matrix-client.spec.ts @@ -2266,7 +2266,6 @@ describe("MatrixClient", function () { function roomCreateEvent(newRoomId: string, predecessorRoomId: string): MatrixEvent { return new MatrixEvent({ content: { - "creator": "@daryl:alexandria.example.com", "m.federate": true, "predecessor": { event_id: "id_of_last_event", diff --git a/spec/unit/room-state.spec.ts b/spec/unit/room-state.spec.ts index c8d249870..435d2e33d 100644 --- a/spec/unit/room-state.spec.ts +++ b/spec/unit/room-state.spec.ts @@ -70,9 +70,7 @@ describe("RoomState", function () { user: userA, room: roomId, event: true, - content: { - creator: userA, - }, + content: {}, }), ]); }); diff --git a/spec/unit/room.spec.ts b/spec/unit/room.spec.ts index 5dee47445..22dc5a349 100644 --- a/spec/unit/room.spec.ts +++ b/spec/unit/room.spec.ts @@ -228,7 +228,7 @@ describe("Room", function () { }); describe("getCreator", () => { - it("should return the creator from m.room.create", function () { + it("should return the sender from m.room.create", function () { // @ts-ignore - mocked doesn't handle overloads sanely mocked(room.currentState.getStateEvents).mockImplementation(function (type, key) { if (type === EventType.RoomCreate && key === "") { @@ -239,7 +239,7 @@ describe("Room", function () { room: roomId, user: userA, content: { - creator: userA, + creator: userB, // The creator field was dropped in room version 11 but a malicious client might still send it }, }); } @@ -247,6 +247,24 @@ describe("Room", function () { const roomCreator = room.getCreator(); expect(roomCreator).toStrictEqual(userA); }); + + it("should return null if the sender is undefined", function () { + // @ts-ignore - mocked doesn't handle overloads sanely + mocked(room.currentState.getStateEvents).mockImplementation(function (type, key) { + if (type === EventType.RoomCreate && key === "") { + return utils.mkEvent({ + event: true, + type: EventType.RoomCreate, + skey: "", + room: roomId, + user: undefined, + content: {}, + }); + } + }); + const roomCreator = room.getCreator(); + expect(roomCreator).toBeNull(); + }); }); describe("getAvatarUrl", function () { @@ -3471,12 +3489,10 @@ describe("Room", function () { function roomCreateEvent(newRoomId: string, predecessorRoomId: string | null): MatrixEvent { const content: { - creator: string; ["m.federate"]: boolean; room_version: string; predecessor: { event_id: string; room_id: string } | undefined; } = { - "creator": "@daryl:alexandria.example.com", "predecessor": undefined, "m.federate": true, "room_version": "9", diff --git a/src/models/event.ts b/src/models/event.ts index 72c6212db..2767f3c54 100644 --- a/src/models/event.ts +++ b/src/models/event.ts @@ -1684,7 +1684,6 @@ const REDACT_KEEP_KEYS = new Set([ // a map from state event type to the .content keys we keep when an event is redacted const REDACT_KEEP_CONTENT_MAP: Record> = { [EventType.RoomMember]: { membership: 1 }, - [EventType.RoomCreate]: { creator: 1 }, [EventType.RoomJoinRules]: { join_rule: 1 }, [EventType.RoomPowerLevels]: { ban: 1, diff --git a/src/models/room.ts b/src/models/room.ts index 6ee4b070f..3f71f2e8b 100644 --- a/src/models/room.ts +++ b/src/models/room.ts @@ -569,7 +569,7 @@ export class Room extends ReadReceipt { */ public getCreator(): string | null { const createEvent = this.currentState.getStateEvents(EventType.RoomCreate, ""); - return createEvent?.getContent()["creator"] ?? null; + return createEvent?.getSender() ?? null; } /**