1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-25 05:23:13 +03:00

Rotate RTC key when a new member joins (#4422)

This commit is contained in:
Hugh Nimmo-Smith
2024-09-27 16:54:48 +01:00
committed by GitHub
parent 825d85f18d
commit 2d6230f199
2 changed files with 17 additions and 10 deletions

View File

@@ -686,25 +686,27 @@ describe("MatrixRTCSession", () => {
expect(client.cancelPendingEvent).toHaveBeenCalledWith(eventSentinel); expect(client.cancelPendingEvent).toHaveBeenCalledWith(eventSentinel);
}); });
it("Re-sends key if a new member joins", async () => { it("Rotates key if a new member joins", async () => {
jest.useFakeTimers(); jest.useFakeTimers();
try { try {
const mockRoom = makeMockRoom([membershipTemplate]); const mockRoom = makeMockRoom([membershipTemplate]);
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
const keysSentPromise1 = new Promise((resolve) => { const keysSentPromise1 = new Promise<EncryptionKeysEventContent>((resolve) => {
sendEventMock.mockImplementation(resolve); sendEventMock.mockImplementation((_roomId, _evType, payload) => resolve(payload));
}); });
sess.joinRoomSession([mockFocus], mockFocus, { manageMediaKeys: true }); sess.joinRoomSession([mockFocus], mockFocus, { manageMediaKeys: true });
await keysSentPromise1; const firstKeysPayload = await keysSentPromise1;
expect(firstKeysPayload.keys).toHaveLength(1);
expect(firstKeysPayload.keys[0].index).toEqual(0);
expect(sess!.statistics.counters.roomEventEncryptionKeysSent).toEqual(1); expect(sess!.statistics.counters.roomEventEncryptionKeysSent).toEqual(1);
sendEventMock.mockClear(); sendEventMock.mockClear();
jest.advanceTimersByTime(10000); jest.advanceTimersByTime(10000);
const keysSentPromise2 = new Promise((resolve) => { const keysSentPromise2 = new Promise<EncryptionKeysEventContent>((resolve) => {
sendEventMock.mockImplementation(resolve); sendEventMock.mockImplementation((_roomId, _evType, payload) => resolve(payload));
}); });
const onMembershipsChanged = jest.fn(); const onMembershipsChanged = jest.fn();
@@ -719,9 +721,14 @@ describe("MatrixRTCSession", () => {
.mockReturnValue(makeMockRoomState([membershipTemplate, member2], mockRoom.roomId)); .mockReturnValue(makeMockRoomState([membershipTemplate, member2], mockRoom.roomId));
sess.onMembershipUpdate(); sess.onMembershipUpdate();
await keysSentPromise2; jest.advanceTimersByTime(10000);
const secondKeysPayload = await keysSentPromise2;
expect(sendEventMock).toHaveBeenCalled(); expect(sendEventMock).toHaveBeenCalled();
expect(secondKeysPayload.keys).toHaveLength(1);
expect(secondKeysPayload.keys[0].index).toEqual(1);
expect(secondKeysPayload.keys[0].key).not.toEqual(firstKeysPayload.keys[0].key);
expect(sess!.statistics.counters.roomEventEncryptionKeysSent).toEqual(2); expect(sess!.statistics.counters.roomEventEncryptionKeysSent).toEqual(2);
} finally { } finally {
jest.useRealTimers(); jest.useRealTimers();

View File

@@ -776,8 +776,8 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
logger.debug(`Member(s) have left: queueing sender key rotation`); logger.debug(`Member(s) have left: queueing sender key rotation`);
this.makeNewKeyTimeout = setTimeout(this.onRotateKeyTimeout, MAKE_KEY_DELAY); this.makeNewKeyTimeout = setTimeout(this.onRotateKeyTimeout, MAKE_KEY_DELAY);
} else if (anyJoined) { } else if (anyJoined) {
logger.debug(`New member(s) have joined: re-sending keys`); logger.debug(`New member(s) have joined: queueing sender key rotation`);
this.requestKeyEventSend(); this.makeNewKeyTimeout = setTimeout(this.onRotateKeyTimeout, MAKE_KEY_DELAY);
} else if (oldFingerprints) { } else if (oldFingerprints) {
// does it look like any of the members have updated their memberships? // does it look like any of the members have updated their memberships?
const newFingerprints = this.lastMembershipFingerprints!; const newFingerprints = this.lastMembershipFingerprints!;
@@ -788,7 +788,7 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
Array.from(oldFingerprints).some((x) => !newFingerprints.has(x)) || Array.from(oldFingerprints).some((x) => !newFingerprints.has(x)) ||
Array.from(newFingerprints).some((x) => !oldFingerprints.has(x)); Array.from(newFingerprints).some((x) => !oldFingerprints.has(x));
if (candidateUpdates) { if (candidateUpdates) {
logger.debug(`Member(s) have updated/reconnected: re-sending keys`); logger.debug(`Member(s) have updated/reconnected: re-sending keys to everyone`);
this.requestKeyEventSend(); this.requestKeyEventSend();
} }
} }