Skip to content

Commit 8f95e7d

Browse files
committed
Finally drop clear RTC to-device
1 parent c7aa9a9 commit 8f95e7d

3 files changed

Lines changed: 99 additions & 46 deletions

File tree

spec/unit/matrixrtc/ToDeviceKeyTransport.spec.ts

Lines changed: 72 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ limitations under the License.
1616

1717
import { type Mocked } from "vitest";
1818

19-
import { makeMockEvent } from "./mocks.ts";
19+
import { makeMatrixEvent } from "./mocks.ts";
2020
import { ClientEvent, EventType, type MatrixClient } from "../../../src";
2121
import { ToDeviceKeyTransport } from "../../../src/matrixrtc/ToDeviceKeyTransport.ts";
2222
import { getMockClientWithEventEmitter } from "../../test-utils/client.ts";
@@ -122,24 +122,23 @@ describe("ToDeviceKeyTransport", () => {
122122
const testEncoded = "ABCDEDF";
123123
const testKeyIndex = 2;
124124

125-
mockClient.emit(
126-
ClientEvent.ToDeviceEvent,
127-
makeMockEvent(EventType.CallEncryptionKeysPrefix, "@bob:example.org", undefined, {
128-
keys: {
129-
index: testKeyIndex,
130-
key: testEncoded,
131-
},
132-
member: {
133-
claimed_device_id: "BOBDEVICE",
134-
},
135-
room_id: roomId,
136-
session: {
137-
application: "m.call",
138-
call_id: "",
139-
scope: "m.room",
140-
},
141-
}),
142-
);
125+
const mockEvent = makeMatrixEvent(EventType.CallEncryptionKeysPrefix, "@bob:example.org", undefined, {
126+
keys: {
127+
index: testKeyIndex,
128+
key: testEncoded,
129+
},
130+
member: {
131+
claimed_device_id: "BOBDEVICE",
132+
},
133+
room_id: roomId,
134+
session: {
135+
application: "m.call",
136+
call_id: "",
137+
scope: "m.room",
138+
},
139+
});
140+
mockEvent.makeEncrypted(EventType.RoomMessageEncrypted, {}, "", "");
141+
mockClient.emit(ClientEvent.ToDeviceEvent, mockEvent);
143142

144143
const { userId, deviceId, keyBase64Encoded, index } = await receivedKeyResolvers.promise;
145144
expect(userId).toBe("@bob:example.org");
@@ -150,6 +149,41 @@ describe("ToDeviceKeyTransport", () => {
150149
expect(statistics.counters.roomEventEncryptionKeysReceived).toBe(1);
151150
});
152151

152+
it("should drop non-encrypted/clear to-devic events", () => {
153+
const receivedKeyResolvers = vi.fn();
154+
transport.on(KeyTransportEvents.ReceivedKeys, (membership, keyBase64Encoded, index, _timestamp) => {
155+
receivedKeyResolvers();
156+
});
157+
transport.start();
158+
159+
const testEncoded = "ABCDEDF";
160+
const testKeyIndex = 2;
161+
162+
const clearEvent = makeMatrixEvent(EventType.CallEncryptionKeysPrefix, "@bob:example.org", undefined, {
163+
keys: {
164+
index: testKeyIndex,
165+
key: testEncoded,
166+
},
167+
member: {
168+
claimed_device_id: "BOBDEVICE",
169+
},
170+
room_id: roomId,
171+
session: {
172+
application: "m.call",
173+
call_id: "",
174+
scope: "m.room",
175+
},
176+
});
177+
mockClient.emit(ClientEvent.ToDeviceEvent, clearEvent);
178+
179+
expect(receivedKeyResolvers).toHaveBeenCalledTimes(0);
180+
181+
clearEvent.makeEncrypted(EventType.RoomMessageEncrypted, {}, "", "");
182+
mockClient.emit(ClientEvent.ToDeviceEvent, clearEvent);
183+
184+
expect(receivedKeyResolvers).toHaveBeenCalledTimes(1);
185+
});
186+
153187
it("should not sent to ourself", async () => {
154188
const keyBase64Encoded = "ABCDEDF";
155189
const keyIndex = 2;
@@ -168,24 +202,24 @@ describe("ToDeviceKeyTransport", () => {
168202
const testEncoded = "ABCDEDF";
169203
const testKeyIndex = 2;
170204

171-
mockClient.emit(
172-
ClientEvent.ToDeviceEvent,
173-
makeMockEvent(EventType.CallEncryptionKeysPrefix, "@bob:example.org", undefined, {
174-
keys: {
175-
index: testKeyIndex,
176-
key: testEncoded,
177-
},
178-
member: {
179-
claimed_device_id: "BOBDEVICE",
180-
},
181-
room_id: "!anotherroom:id",
182-
session: {
183-
application: "m.call",
184-
call_id: "",
185-
scope: "m.room",
186-
},
187-
}),
188-
);
205+
const keyEvent = makeMatrixEvent(EventType.CallEncryptionKeysPrefix, "@bob:example.org", undefined, {
206+
keys: {
207+
index: testKeyIndex,
208+
key: testEncoded,
209+
},
210+
member: {
211+
claimed_device_id: "BOBDEVICE",
212+
},
213+
room_id: "!anotherroom:id",
214+
session: {
215+
application: "m.call",
216+
call_id: "",
217+
scope: "m.room",
218+
},
219+
});
220+
221+
keyEvent.makeEncrypted(EventType.RoomMessageEncrypted, {}, "", "");
222+
mockClient.emit(ClientEvent.ToDeviceEvent, keyEvent);
189223

190224
expect(mockLogger.warn).toHaveBeenCalledWith("Malformed Event: Mismatch roomId");
191225
expect(statistics.counters.roomEventEncryptionKeysReceived).toBe(0);
@@ -240,7 +274,7 @@ describe("ToDeviceKeyTransport", () => {
240274

241275
mockClient.emit(
242276
ClientEvent.ToDeviceEvent,
243-
makeMockEvent(EventType.CallEncryptionKeysPrefix, "@bob:example.org", undefined, event),
277+
makeMatrixEvent(EventType.CallEncryptionKeysPrefix, "@bob:example.org", undefined, event),
244278
);
245279

246280
expect(mockLogger.warn).toHaveBeenCalled();

spec/unit/matrixrtc/mocks.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ limitations under the License.
1717
import { EventEmitter } from "node:stream";
1818
import { type Mocked, type MockedObject } from "vitest";
1919

20-
import { EventType, type Room, RoomEvent, type MatrixClient, type MatrixEvent } from "../../../src";
20+
import { EventType, type Room, RoomEvent, type MatrixClient, MatrixEvent } from "../../../src";
2121
import { CallMembership } from "../../../src/matrixrtc";
2222
import { secureRandomString } from "../../../src/randomstring";
2323
import { type RtcMembershipData, type SessionMembershipData } from "../../../src/matrixrtc/membershipData";
@@ -108,6 +108,7 @@ export type MockClient = MockedObject<
108108
| "cancelPendingEvent"
109109
>
110110
>;
111+
111112
/**
112113
* Mocks a object that has all required methods for a MatrixRTC session client.
113114
*/
@@ -232,6 +233,24 @@ export function makeMockEvent(
232233
} as unknown as MatrixEvent;
233234
}
234235

236+
export function makeMatrixEvent(
237+
type: string,
238+
sender: string,
239+
roomId: string | undefined,
240+
content: any,
241+
timestamp?: number,
242+
stateKey?: string,
243+
): MatrixEvent {
244+
return new MatrixEvent({
245+
type,
246+
sender,
247+
room_id: roomId,
248+
content,
249+
state_key: stateKey,
250+
origin_server_ts: timestamp,
251+
});
252+
}
253+
235254
export function mockRTCEvent(
236255
{ user_id: sender, ...membershipData }: MembershipData,
237256
roomId: string,

src/matrixrtc/ToDeviceKeyTransport.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,13 @@ export class ToDeviceKeyTransport
152152
return;
153153
}
154154

155-
// TODO: Not possible to check if the event is encrypted or not
156-
// see https://github.com/matrix-org/matrix-rust-sdk/issues/4883
157-
// if (evnt.getWireType() != EventType.RoomMessageEncrypted) {
158-
// // WARN: The call keys were sent in clear. Ignore them
159-
// logger.warn(`Call encryption keys sent in clear from: ${event.getSender()}`);
160-
// return;
161-
// }
155+
// NB: When received via the widget driver, the to-device events
156+
// are properly reconstructed as if they are encrypted (see MatrixEvent#makeEncrypted).
157+
if (event.getWireType() != EventType.RoomMessageEncrypted) {
158+
// WARN: The call keys were sent in clear. Ignore them
159+
this.logger.warn(`Call encryption keys sent in clear from: ${event.getSender()}`);
160+
return;
161+
}
162162

163163
const content = this.getValidEventContent(event);
164164
if (!content) return;

0 commit comments

Comments
 (0)