Skip to content

Commit 8703acb

Browse files
MatrixRTC: Disable room transport fallback for keys (#4929)
* matrixRTC: Disable room transport fallback for keys * post rebase fix * post merge fix --------- Co-authored-by: Will Hunt <[email protected]>
1 parent b59603d commit 8703acb

File tree

6 files changed

+9
-464
lines changed

6 files changed

+9
-464
lines changed

spec/unit/matrixrtc/RTCEncryptionManager.spec.ts

Lines changed: 1 addition & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ import { type ToDeviceKeyTransport } from "../../../src/matrixrtc/ToDeviceKeyTra
2222
import { KeyTransportEvents, type KeyTransportEventsHandlerMap } from "../../../src/matrixrtc/IKeyTransport.ts";
2323
import { membershipTemplate, mockCallMembership } from "./mocks.ts";
2424
import { decodeBase64, TypedEventEmitter } from "../../../src";
25-
import { RoomAndToDeviceTransport } from "../../../src/matrixrtc/RoomAndToDeviceKeyTransport.ts";
26-
import { type RoomKeyTransport } from "../../../src/matrixrtc/RoomKeyTransport.ts";
27-
import { logger, type Logger } from "../../../src/logger.ts";
25+
import { logger } from "../../../src/logger.ts";
2826
import { getParticipantId } from "../../../src/matrixrtc/utils.ts";
2927

3028
describe("RTCEncryptionManager", () => {
@@ -782,86 +780,6 @@ describe("RTCEncryptionManager", () => {
782780
);
783781
});
784782

785-
it("Should re-distribute key on transport switch", async () => {
786-
const toDeviceEmitter = new TypedEventEmitter<KeyTransportEvents, KeyTransportEventsHandlerMap>();
787-
const mockToDeviceTransport = {
788-
start: jest.fn(),
789-
stop: jest.fn(),
790-
sendKey: jest.fn().mockResolvedValue(undefined),
791-
on: toDeviceEmitter.on.bind(toDeviceEmitter),
792-
off: toDeviceEmitter.off.bind(toDeviceEmitter),
793-
emit: toDeviceEmitter.emit.bind(toDeviceEmitter),
794-
setParentLogger: jest.fn(),
795-
} as unknown as Mocked<ToDeviceKeyTransport>;
796-
797-
const roomEmitter = new TypedEventEmitter<KeyTransportEvents, KeyTransportEventsHandlerMap>();
798-
const mockRoomTransport = {
799-
start: jest.fn(),
800-
stop: jest.fn(),
801-
sendKey: jest.fn().mockResolvedValue(undefined),
802-
on: roomEmitter.on.bind(roomEmitter),
803-
off: roomEmitter.off.bind(roomEmitter),
804-
emit: roomEmitter.emit.bind(roomEmitter),
805-
setParentLogger: jest.fn(),
806-
} as unknown as Mocked<RoomKeyTransport>;
807-
808-
const mockLogger = {
809-
debug: jest.fn(),
810-
warn: jest.fn(),
811-
} as unknown as Mocked<Logger>;
812-
813-
const transport = new RoomAndToDeviceTransport(mockToDeviceTransport, mockRoomTransport, {
814-
getChild: jest.fn().mockReturnValue(mockLogger),
815-
} as unknown as Mocked<Logger>);
816-
817-
encryptionManager = new RTCEncryptionManager(
818-
"@alice:example.org",
819-
"DEVICE01",
820-
getMembershipMock,
821-
transport,
822-
statistics,
823-
onEncryptionKeysChanged,
824-
);
825-
826-
const members = [
827-
aCallMembership("@bob:example.org", "BOBDEVICE"),
828-
aCallMembership("@bob:example.org", "BOBDEVICE2"),
829-
aCallMembership("@carl:example.org", "CARLDEVICE"),
830-
];
831-
getMembershipMock.mockReturnValue(members);
832-
833-
// Let's join
834-
encryptionManager.join(undefined);
835-
encryptionManager.onMembershipsUpdate();
836-
await jest.advanceTimersByTimeAsync(10);
837-
838-
// Should have sent the key to the toDevice transport
839-
expect(mockToDeviceTransport.sendKey).toHaveBeenCalledTimes(1);
840-
expect(mockRoomTransport.sendKey).not.toHaveBeenCalled();
841-
842-
// Simulate receiving a key by room transport
843-
roomEmitter.emit(
844-
KeyTransportEvents.ReceivedKeys,
845-
"@bob:example.org",
846-
"BOBDEVICE",
847-
"AAAAAAAAAAA",
848-
0 /* KeyId */,
849-
0 /* Timestamp */,
850-
);
851-
852-
await jest.runOnlyPendingTimersAsync();
853-
854-
// The key should have been re-distributed to the room transport
855-
expect(mockRoomTransport.sendKey).toHaveBeenCalled();
856-
expect(mockToDeviceTransport.sendKey).toHaveBeenCalledWith(
857-
expect.any(String),
858-
// It is the first key re-distributed
859-
0,
860-
// to all the members
861-
members.map((m) => ({ userId: m.sender, deviceId: m.deviceId, membershipTs: m.createdTs() })),
862-
);
863-
});
864-
865783
function aCallMembership(userId: string, deviceId: string, ts: number = 1000): CallMembership {
866784
return mockCallMembership(
867785
{ ...membershipTemplate, user_id: userId, device_id: deviceId, created_ts: ts },

spec/unit/matrixrtc/RoomAndToDeviceTransport.spec.ts

Lines changed: 0 additions & 187 deletions
This file was deleted.

src/matrixrtc/EncryptionManager.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@ import { type CallMembership } from "./CallMembership.ts";
77
import { type KeyTransportEventListener, KeyTransportEvents, type IKeyTransport } from "./IKeyTransport.ts";
88
import { isMyMembership, type ParticipantId, type Statistics } from "./types.ts";
99
import { getParticipantId } from "./utils.ts";
10-
import {
11-
type EnabledTransports,
12-
RoomAndToDeviceEvents,
13-
RoomAndToDeviceTransport,
14-
} from "./RoomAndToDeviceKeyTransport.ts";
1510

1611
/**
1712
* This interface is for testing and for making it possible to interchange the encryption manager.
@@ -119,10 +114,7 @@ export class EncryptionManager implements IEncryptionManager {
119114
this.manageMediaKeys = this.joinConfig?.manageMediaKeys ?? this.manageMediaKeys;
120115

121116
this.transport.on(KeyTransportEvents.ReceivedKeys, this.onNewKeyReceived);
122-
// Deprecate RoomKeyTransport: this can get removed.
123-
if (this.transport instanceof RoomAndToDeviceTransport) {
124-
this.transport.on(RoomAndToDeviceEvents.EnabledTransportsChanged, this.onTransportChanged);
125-
}
117+
126118
this.transport.start();
127119
if (this.joinConfig?.manageMediaKeys) {
128120
this.makeNewSenderKey();
@@ -315,10 +307,6 @@ export class EncryptionManager implements IEncryptionManager {
315307
}
316308
};
317309

318-
private onTransportChanged: (enabled: EnabledTransports) => void = () => {
319-
this.requestSendCurrentKey();
320-
};
321-
322310
public onNewKeyReceived: KeyTransportEventListener = (userId, deviceId, keyBase64Encoded, index, timestamp) => {
323311
this.logger.debug(`Received key over key transport ${userId}:${deviceId} at index ${index}`);
324312
this.setEncryptionKey(userId, deviceId, index, keyBase64Encoded, timestamp);

src/matrixrtc/MatrixRTCSession.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,17 @@ import type {
3636
RTCCallIntent,
3737
Transport,
3838
} from "./types.ts";
39-
import { RoomKeyTransport } from "./RoomKeyTransport.ts";
4039
import {
4140
MembershipManagerEvent,
4241
type MembershipManagerEventHandlerMap,
4342
type IMembershipManager,
4443
} from "./IMembershipManager.ts";
4544
import { RTCEncryptionManager } from "./RTCEncryptionManager.ts";
46-
import {
47-
RoomAndToDeviceEvents,
48-
type RoomAndToDeviceEventsHandlerMap,
49-
RoomAndToDeviceTransport,
50-
} from "./RoomAndToDeviceKeyTransport.ts";
51-
import { TypedReEmitter } from "../ReEmitter.ts";
5245
import { ToDeviceKeyTransport } from "./ToDeviceKeyTransport.ts";
46+
import { TypedReEmitter } from "../ReEmitter.ts";
5347
import { type MatrixEvent } from "../models/event.ts";
5448
import { RoomStickyEventsEvent, type RoomStickyEventsMap } from "../models/room-sticky-events.ts";
49+
import { RoomKeyTransport } from "./RoomKeyTransport.ts";
5550

5651
/**
5752
* Events emitted by MatrixRTCSession
@@ -257,8 +252,8 @@ interface SessionMembershipsForRoomOpts {
257252
* This class doesn't deal with media at all, just membership & properties of a session.
258253
*/
259254
export class MatrixRTCSession extends TypedEventEmitter<
260-
MatrixRTCSessionEvent | RoomAndToDeviceEvents | MembershipManagerEvent,
261-
MatrixRTCSessionEventHandlerMap & RoomAndToDeviceEventsHandlerMap & MembershipManagerEventHandlerMap
255+
MatrixRTCSessionEvent | MembershipManagerEvent,
256+
MatrixRTCSessionEventHandlerMap & MembershipManagerEventHandlerMap
262257
> {
263258
private membershipManager?: IMembershipManager;
264259
private encryptionManager?: IEncryptionManager;
@@ -571,8 +566,8 @@ export class MatrixRTCSession extends TypedEventEmitter<
571566
}
572567

573568
private reEmitter = new TypedReEmitter<
574-
MatrixRTCSessionEvent | RoomAndToDeviceEvents | MembershipManagerEvent,
575-
MatrixRTCSessionEventHandlerMap & RoomAndToDeviceEventsHandlerMap & MembershipManagerEventHandlerMap
569+
MatrixRTCSessionEvent | MembershipManagerEvent,
570+
MatrixRTCSessionEventHandlerMap & MembershipManagerEventHandlerMap
576571
>(this);
577572

578573
/**
@@ -620,13 +615,7 @@ export class MatrixRTCSession extends TypedEventEmitter<
620615
this.logger.info("Using to-device with room fallback transport for encryption keys");
621616
const [uId, dId] = [this.client.getUserId()!, this.client.getDeviceId()!];
622617
const [room, client, statistics] = [this.roomSubset, this.client, this.statistics];
623-
// Deprecate RoomKeyTransport: only ToDeviceKeyTransport is needed once deprecated
624-
const roomKeyTransport = new RoomKeyTransport(room, client, statistics);
625-
const toDeviceTransport = new ToDeviceKeyTransport(uId, dId, room.roomId, client, statistics);
626-
transport = new RoomAndToDeviceTransport(toDeviceTransport, roomKeyTransport, this.logger);
627-
628-
// Expose the changes so the ui can display the currently used transport.
629-
this.reEmitter.reEmit(transport, [RoomAndToDeviceEvents.EnabledTransportsChanged]);
618+
const transport = new ToDeviceKeyTransport(uId, dId, room.roomId, client, statistics);
630619
this.encryptionManager = new RTCEncryptionManager(
631620
this.client.getUserId()!,
632621
this.client.getDeviceId()!,

0 commit comments

Comments
 (0)