You've already forked matrix-js-sdk
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:
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user