Skip to content

Commit 0a29063

Browse files
authored
Do not rotate MatrixRTC media encryption key when a new member joins a session (#4472)
* Do not rotate MatrixRTC media encryption key when a new member joins a call This change reverts #4422. Instead, the rotation when a new member joins will be reintroduced as part of supporting to-device based MatrixRTC encryption key distribution. * Improve function name
1 parent 3cc3bd0 commit 0a29063

File tree

2 files changed

+15
-20
lines changed

2 files changed

+15
-20
lines changed

spec/unit/matrixrtc/MatrixRTCSession.spec.ts

+9-14
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ describe("MatrixRTCSession", () => {
773773
expect(client.cancelPendingEvent).toHaveBeenCalledWith(eventSentinel);
774774
});
775775

776-
it("rotates key if a new member joins", async () => {
776+
it("Re-sends key if a new member joins", async () => {
777777
jest.useFakeTimers();
778778
try {
779779
const mockRoom = makeMockRoom([membershipTemplate]);
@@ -784,9 +784,7 @@ describe("MatrixRTCSession", () => {
784784
});
785785

786786
sess.joinRoomSession([mockFocus], mockFocus, { manageMediaKeys: true });
787-
const firstKeysPayload = await keysSentPromise1;
788-
expect(firstKeysPayload.keys).toHaveLength(1);
789-
expect(firstKeysPayload.keys[0].index).toEqual(0);
787+
await keysSentPromise1;
790788
expect(sess!.statistics.counters.roomEventEncryptionKeysSent).toEqual(1);
791789

792790
sendEventMock.mockClear();
@@ -808,14 +806,9 @@ describe("MatrixRTCSession", () => {
808806
.mockReturnValue(makeMockRoomState([membershipTemplate, member2], mockRoom.roomId));
809807
sess.onMembershipUpdate();
810808

811-
jest.advanceTimersByTime(10000);
812-
813-
const secondKeysPayload = await keysSentPromise2;
809+
await keysSentPromise2;
814810

815811
expect(sendEventMock).toHaveBeenCalled();
816-
expect(secondKeysPayload.keys).toHaveLength(1);
817-
expect(secondKeysPayload.keys[0].index).toEqual(1);
818-
expect(secondKeysPayload.keys[0].key).not.toEqual(firstKeysPayload.keys[0].key);
819812
expect(sess!.statistics.counters.roomEventEncryptionKeysSent).toEqual(2);
820813
} finally {
821814
jest.useRealTimers();
@@ -1103,8 +1096,8 @@ describe("MatrixRTCSession", () => {
11031096
}
11041097
jest.useFakeTimers();
11051098
try {
1106-
// start with a single member
1107-
const mockRoom = makeMockRoom(members.slice(0, 1));
1099+
// start with all members
1100+
const mockRoom = makeMockRoom(members);
11081101

11091102
for (let i = 0; i < membersToTest; i++) {
11101103
const keysSentPromise = new Promise<EncryptionKeysEventContent>((resolve) => {
@@ -1116,10 +1109,12 @@ describe("MatrixRTCSession", () => {
11161109
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
11171110
sess.joinRoomSession([mockFocus], mockFocus, { manageMediaKeys: true });
11181111
} else {
1119-
// otherwise update the state
1112+
// otherwise update the state reducing the membership each time in order to trigger key rotation
11201113
mockRoom.getLiveTimeline().getState = jest
11211114
.fn()
1122-
.mockReturnValue(makeMockRoomState(members.slice(0, i + 1), mockRoom.roomId));
1115+
.mockReturnValue(
1116+
makeMockRoomState(members.slice(0, membersToTest - i), mockRoom.roomId),
1117+
);
11231118
}
11241119

11251120
sess!.onMembershipUpdate();

src/matrixrtc/MatrixRTCSession.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
328328
logger.info(`Joining call session in room ${this.room.roomId} with manageMediaKeys=${this.manageMediaKeys}`);
329329
if (joinConfig?.manageMediaKeys) {
330330
this.makeNewSenderKey();
331-
this.requestKeyEventSend();
331+
this.requestSendCurrentKey();
332332
}
333333
// We don't wait for this, mostly because it may fail and schedule a retry, so this
334334
// function returning doesn't really mean anything at all.
@@ -546,10 +546,10 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
546546
}
547547

548548
/**
549-
* Requests that we resend our keys to the room. May send a keys event immediately
549+
* Requests that we resend our current keys to the room. May send a keys event immediately
550550
* or queue for alter if one has already been sent recently.
551551
*/
552-
private requestKeyEventSend(): void {
552+
private requestSendCurrentKey(): void {
553553
if (!this.manageMediaKeys) return;
554554

555555
if (
@@ -795,8 +795,8 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
795795
logger.debug(`Member(s) have left: queueing sender key rotation`);
796796
this.makeNewKeyTimeout = setTimeout(this.onRotateKeyTimeout, MAKE_KEY_DELAY);
797797
} else if (anyJoined) {
798-
logger.debug(`New member(s) have joined: queueing sender key rotation`);
799-
this.makeNewKeyTimeout = setTimeout(this.onRotateKeyTimeout, MAKE_KEY_DELAY);
798+
logger.debug(`New member(s) have joined: re-sending keys`);
799+
this.requestSendCurrentKey();
800800
} else if (oldFingerprints) {
801801
// does it look like any of the members have updated their memberships?
802802
const newFingerprints = this.lastMembershipFingerprints!;
@@ -808,7 +808,7 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
808808
Array.from(newFingerprints).some((x) => !oldFingerprints.has(x));
809809
if (candidateUpdates) {
810810
logger.debug(`Member(s) have updated/reconnected: re-sending keys to everyone`);
811-
this.requestKeyEventSend();
811+
this.requestSendCurrentKey();
812812
}
813813
}
814814
}

0 commit comments

Comments
 (0)