From 121e17262ebb9345271f618d26a810342228a24e Mon Sep 17 00:00:00 2001 From: Faye Duxovni Date: Thu, 1 Dec 2022 02:46:53 -0500 Subject: [PATCH 1/3] Add method to get outgoing room key requests for a given event --- src/client.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/client.ts b/src/client.ts index 8b8fa18c315..7029640a317 100644 --- a/src/client.ts +++ b/src/client.ts @@ -78,6 +78,7 @@ import { IMegolmSessionData, isCryptoAvailable, VerificationMethod, + IRoomKeyRequestBody, } from './crypto'; import { DeviceInfo, IDevice } from "./crypto/deviceinfo"; import { decodeRecoveryKey } from './crypto/recoverykey'; @@ -184,7 +185,7 @@ import { RuleId, } from "./@types/PushRules"; import { IThreepid } from "./@types/threepids"; -import { CryptoStore } from "./crypto/store/base"; +import { CryptoStore, OutgoingRoomKeyRequest } from "./crypto/store/base"; import { GroupCall, IGroupCallDataChannelOptions, @@ -2631,6 +2632,32 @@ export class MatrixClient extends TypedEventEmitter { + if (!this.crypto) { + throw new Error("End-to-End encryption disabled"); + } + const wireContent = event.getWireContent(); + const requestBody: IRoomKeyRequestBody = { + session_id: wireContent.sessionId, + sender_key: wireContent.sender_key, + algorithm: wireContent.algorithm, + room_id: event.getRoomId()!, + }; + if ( + !requestBody.session_id + || !requestBody.sender_key + || !requestBody.algorithm + || !requestBody.room_id + ) return Promise.resolve(null); + return this.crypto.cryptoStore.getOutgoingRoomKeyRequest(requestBody); + } + /** * Cancel a room key request for this event if one is ongoing and resend the * request. From 8cca82e75d3b646458b4e5c87c05df1239de6925 Mon Sep 17 00:00:00 2001 From: Faye Duxovni Date: Thu, 1 Dec 2022 03:19:41 -0500 Subject: [PATCH 2/3] Write test, fix typo --- spec/integ/matrix-client-crypto.spec.ts | 35 +++++++++++++++++++++++++ src/client.ts | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/spec/integ/matrix-client-crypto.spec.ts b/spec/integ/matrix-client-crypto.spec.ts index 38de34aa59d..022278c350d 100644 --- a/spec/integ/matrix-client-crypto.spec.ts +++ b/spec/integ/matrix-client-crypto.spec.ts @@ -679,4 +679,39 @@ describe("MatrixClient crypto", () => { }); await httpBackend.flushAllExpected(); }); + + it("Checks for outgoing room key requests for a given event's session", async () => { + const eventA0 = new MatrixEvent({ + sender: "@bob:example.com", + room_id: "!someroom", + content: { + algorithm: 'm.megolm.v1.aes-sha2', + session_id: "sessionid", + sender_key: "senderkey", + }, + }); + const eventA1 = new MatrixEvent({ + sender: "@bob:example.com", + room_id: "!someroom", + content: { + algorithm: 'm.megolm.v1.aes-sha2', + session_id: "sessionid", + sender_key: "senderkey", + }, + }); + const eventB = new MatrixEvent({ + sender: "@bob:example.com", + room_id: "!someroom", + content: { + algorithm: 'm.megolm.v1.aes-sha2', + session_id: "othersessionid", + sender_key: "senderkey", + }, + }); + + aliTestClient.client.crypto?.onSyncCompleted({}); + await aliTestClient.client.cancelAndResendEventRoomKeyRequest(eventA0); + expect(await aliTestClient.client.getOutgoingRoomKeyRequest(eventA1)).not.toBeNull(); + expect(await aliTestClient.client.getOutgoingRoomKeyRequest(eventB)).toBeNull(); + }); }); diff --git a/src/client.ts b/src/client.ts index 7029640a317..42709446ecc 100644 --- a/src/client.ts +++ b/src/client.ts @@ -2644,7 +2644,7 @@ export class MatrixClient extends TypedEventEmitter Date: Thu, 1 Dec 2022 04:31:25 -0500 Subject: [PATCH 3/3] Add test case for non-encrypted event --- spec/integ/matrix-client-crypto.spec.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/integ/matrix-client-crypto.spec.ts b/spec/integ/matrix-client-crypto.spec.ts index 022278c350d..847bb8528ae 100644 --- a/spec/integ/matrix-client-crypto.spec.ts +++ b/spec/integ/matrix-client-crypto.spec.ts @@ -708,10 +708,16 @@ describe("MatrixClient crypto", () => { sender_key: "senderkey", }, }); + const nonEncryptedEvent = new MatrixEvent({ + sender: "@bob:example.com", + room_id: "!someroom", + content: {}, + }); aliTestClient.client.crypto?.onSyncCompleted({}); await aliTestClient.client.cancelAndResendEventRoomKeyRequest(eventA0); expect(await aliTestClient.client.getOutgoingRoomKeyRequest(eventA1)).not.toBeNull(); expect(await aliTestClient.client.getOutgoingRoomKeyRequest(eventB)).toBeNull(); + expect(await aliTestClient.client.getOutgoingRoomKeyRequest(nonEncryptedEvent)).toBeNull(); }); });