From 5d7218476ab4f1d75aeafae9109511846ee194f7 Mon Sep 17 00:00:00 2001 From: Timo <16718859+toger5@users.noreply.github.com> Date: Wed, 14 Feb 2024 12:25:43 +0100 Subject: [PATCH 1/2] Await encrypted messages (#4063) * await encrypted messages + fix comments Signed-off-by: Timo K * fix Tests Signed-off-by: Timo K * fix test Signed-off-by: Timo K * make sonar happy Signed-off-by: Timo K --------- Signed-off-by: Timo K --- spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts | 5 +++-- src/matrixrtc/MatrixRTCSession.ts | 4 ++-- src/matrixrtc/MatrixRTCSessionManager.ts | 10 +++++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts b/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts index 8784ab48b48..f5ffc13e05b 100644 --- a/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts +++ b/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts @@ -87,7 +87,7 @@ describe("MatrixRTCSessionManager", () => { expect(onEnded).toHaveBeenCalledWith(room1.roomId, client.matrixRTC.getActiveRoomSession(room1)); }); - it("Calls onCallEncryption on encryption keys event", () => { + it("Calls onCallEncryption on encryption keys event", async () => { const room1 = makeMockRoom([membershipTemplate]); jest.spyOn(client, "getRooms").mockReturnValue([room1]); jest.spyOn(client, "getRoom").mockReturnValue(room1); @@ -95,7 +95,7 @@ describe("MatrixRTCSessionManager", () => { client.emit(ClientEvent.Room, room1); const onCallEncryptionMock = jest.fn(); client.matrixRTC.getRoomSession(room1).onCallEncryption = onCallEncryptionMock; - + client.decryptEventIfNeeded = () => Promise.resolve(); const timelineEvent = { getType: jest.fn().mockReturnValue(EventType.CallEncryptionKeysPrefix), getContent: jest.fn().mockReturnValue({}), @@ -106,6 +106,7 @@ describe("MatrixRTCSessionManager", () => { }, } as unknown as MatrixEvent; client.emit(RoomEvent.Timeline, timelineEvent, undefined, undefined, false, {} as IRoomTimelineData); + await new Promise(process.nextTick); expect(onCallEncryptionMock).toHaveBeenCalled(); }); }); diff --git a/src/matrixrtc/MatrixRTCSession.ts b/src/matrixrtc/MatrixRTCSession.ts index b8ee6626fd0..403fd248f65 100644 --- a/src/matrixrtc/MatrixRTCSession.ts +++ b/src/matrixrtc/MatrixRTCSession.ts @@ -176,7 +176,7 @@ export class MatrixRTCSession extends TypedEventEmitter { - if (event.getType() !== EventType.CallEncryptionKeysPrefix) return; + private async consumeCallEncryptionEvent(event: MatrixEvent): Promise { + await this.client.decryptEventIfNeeded(event); + if (event.getType() !== EventType.CallEncryptionKeysPrefix) return Promise.resolve(); const room = this.client.getRoom(event.getRoomId()); if (!room) { logger.error(`Got room state event for unknown room ${event.getRoomId()}!`); - return; + return Promise.resolve(); } this.getRoomSession(room).onCallEncryption(event); + } + private onTimeline = (event: MatrixEvent): void => { + this.consumeCallEncryptionEvent(event); }; private onRoom = (room: Room): void => { From 74c109adacd4d9ab8bf832aea9faeff55598de27 Mon Sep 17 00:00:00 2001 From: Timo <16718859+toger5@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:04:40 +0100 Subject: [PATCH 2/2] Ignore memberships of users that are not in the call (#4065) * ignore memberships of users that are not in the call Signed-off-by: Timo K * recompute memberships on room member change. Signed-off-by: Timo K * fix Tests and add test for left member Signed-off-by: Timo K * fix event type Signed-off-by: Timo K * fix import desaster Signed-off-by: Timo K * fix mocks Signed-off-by: Timo K --------- Signed-off-by: Timo K --- spec/unit/matrixrtc/MatrixRTCSession.spec.ts | 13 +++++++++++++ spec/unit/matrixrtc/mocks.ts | 3 +++ src/matrixrtc/MatrixRTCSession.ts | 13 ++++++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts index c1faa5ac0c3..2c40e9a2230 100644 --- a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts +++ b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts @@ -74,6 +74,13 @@ describe("MatrixRTCSession", () => { expect(sess?.memberships[0].deviceId).toEqual("AAAAAAA"); }); + it("ignores memberships events of members not in the room", () => { + const mockRoom = makeMockRoom([membershipTemplate]); + mockRoom.hasMembershipState = (state) => state === "join"; + sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); + expect(sess?.memberships.length).toEqual(0); + }); + it("honours created_ts", () => { const expiredMembership = Object.assign({}, membershipTemplate); expiredMembership.created_ts = 500; @@ -91,9 +98,12 @@ describe("MatrixRTCSession", () => { it("safely ignores events with no memberships section", () => { const mockRoom = { + ...makeMockRoom([]), roomId: randomString(8), getLiveTimeline: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue({ + on: jest.fn(), + off: jest.fn(), getStateEvents: (_type: string, _stateKey: string) => [ { getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix), @@ -112,9 +122,12 @@ describe("MatrixRTCSession", () => { it("safely ignores events with junk memberships section", () => { const mockRoom = { + ...makeMockRoom([]), roomId: randomString(8), getLiveTimeline: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue({ + on: jest.fn(), + off: jest.fn(), getStateEvents: (_type: string, _stateKey: string) => [ { getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix), diff --git a/spec/unit/matrixrtc/mocks.ts b/spec/unit/matrixrtc/mocks.ts index e342eb2dc63..84496e657da 100644 --- a/spec/unit/matrixrtc/mocks.ts +++ b/spec/unit/matrixrtc/mocks.ts @@ -24,6 +24,7 @@ export function makeMockRoom(memberships: CallMembershipData[], localAge: number const roomState = makeMockRoomState(memberships, roomId, localAge); return { roomId: roomId, + hasMembershipState: jest.fn().mockReturnValue(true), getLiveTimeline: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue(roomState), }), @@ -33,6 +34,8 @@ export function makeMockRoom(memberships: CallMembershipData[], localAge: number export function makeMockRoomState(memberships: CallMembershipData[], roomId: string, localAge: number | null = null) { const event = mockRTCEvent(memberships, roomId, localAge); return { + on: jest.fn(), + off: jest.fn(), getStateEvents: (_: string, stateKey: string) => { if (stateKey !== undefined) return event; return [event]; diff --git a/src/matrixrtc/MatrixRTCSession.ts b/src/matrixrtc/MatrixRTCSession.ts index 403fd248f65..03871bb90e8 100644 --- a/src/matrixrtc/MatrixRTCSession.ts +++ b/src/matrixrtc/MatrixRTCSession.ts @@ -21,6 +21,7 @@ import { Room } from "../models/room"; import { MatrixClient } from "../client"; import { EventType } from "../@types/event"; import { CallMembership, CallMembershipData } from "./CallMembership"; +import { RoomStateEvent } from "../models/room-state"; import { Focus } from "./focus"; import { MatrixError, MatrixEvent } from "../matrix"; import { randomString, secureRandomBase64Url } from "../randomstring"; @@ -152,9 +153,11 @@ export class MatrixRTCSession extends TypedEventEmitter