From 3a5d66057e4cbc9dddd35bfd334f6dfc1402f83a Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Wed, 9 Aug 2023 16:14:58 +0200 Subject: [PATCH] ElementR: Process all verification events, not just requests (#3650) * Process all verification event * Add test for `isVerificationEvent` * Review changes * Remove null comparison and add doc to remote echo * review changes --- spec/unit/rust-crypto/verification.spec.ts | 37 +++++++++++++++++++++- src/rust-crypto/rust-crypto.ts | 18 +++++------ src/rust-crypto/verification.ts | 27 ++++++++++++++++ 3 files changed, 71 insertions(+), 11 deletions(-) diff --git a/spec/unit/rust-crypto/verification.spec.ts b/spec/unit/rust-crypto/verification.spec.ts index a22ee8fd662..90f9e846b32 100644 --- a/spec/unit/rust-crypto/verification.spec.ts +++ b/spec/unit/rust-crypto/verification.spec.ts @@ -17,8 +17,9 @@ limitations under the License. import * as RustSdkCryptoJs from "@matrix-org/matrix-sdk-crypto-wasm"; import { Mocked } from "jest-mock"; -import { RustVerificationRequest } from "../../../src/rust-crypto/verification"; +import { isVerificationEvent, RustVerificationRequest } from "../../../src/rust-crypto/verification"; import { OutgoingRequestProcessor } from "../../../src/rust-crypto/OutgoingRequestProcessor"; +import { EventType, MatrixEvent, MsgType } from "../../../src"; describe("VerificationRequest", () => { describe("pending", () => { @@ -80,6 +81,40 @@ describe("VerificationRequest", () => { }); }); +describe("isVerificationEvent", () => { + it.each([ + [EventType.KeyVerificationCancel], + [EventType.KeyVerificationDone], + [EventType.KeyVerificationMac], + [EventType.KeyVerificationStart], + [EventType.KeyVerificationKey], + [EventType.KeyVerificationReady], + [EventType.KeyVerificationAccept], + ])("should return true with %s event", (eventType) => { + const event = new MatrixEvent({ + type: eventType, + }); + expect(isVerificationEvent(event)).toBe(true); + }); + + it("should return true with EventType.RoomMessage and MsgType.KeyVerificationRequest", () => { + const event = new MatrixEvent({ + type: EventType.RoomMessage, + content: { + msgtype: MsgType.KeyVerificationRequest, + }, + }); + expect(isVerificationEvent(event)).toBe(true); + }); + + it("should return false with a non verification event", () => { + const event = new MatrixEvent({ + type: EventType.RoomName, + }); + expect(isVerificationEvent(event)).toBe(false); + }); +}); + /** build a RustVerificationRequest with default parameters */ function makeTestRequest( inner?: RustSdkCryptoJs.VerificationRequest, diff --git a/src/rust-crypto/rust-crypto.ts b/src/rust-crypto/rust-crypto.ts index 61749eefa3e..d9cd3466c24 100644 --- a/src/rust-crypto/rust-crypto.ts +++ b/src/rust-crypto/rust-crypto.ts @@ -55,8 +55,8 @@ import { secretStorageContainsCrossSigningKeys } from "./secret-storage"; import { keyFromPassphrase } from "../crypto/key_passphrase"; import { encodeRecoveryKey } from "../crypto/recoverykey"; import { crypto } from "../crypto/crypto"; -import { RustVerificationRequest, verificationMethodIdentifierToMethod } from "./verification"; -import { EventType, MsgType } from "../@types/event"; +import { isVerificationEvent, RustVerificationRequest, verificationMethodIdentifierToMethod } from "./verification"; +import { EventType } from "../@types/event"; import { CryptoEvent } from "../crypto"; import { TypedEventEmitter } from "../models/typed-event-emitter"; import { RustBackupCryptoEventMap, RustBackupCryptoEvents, RustBackupManager } from "./backup"; @@ -1054,15 +1054,13 @@ export class RustCrypto extends TypedEventEmitter { - // Ignore state event - if (event.isState()) return; + // Ignore state event or remote echo + // transaction_id is provided in case of remote echo {@link https://spec.matrix.org/v1.7/client-server-api/#local-echo} + if (event.isState() || !!event.getUnsigned().transaction_id) return; const processEvent = async (evt: MatrixEvent): Promise => { - // Process only key validation request - if ( - evt.getType() === EventType.RoomMessage && - evt.getContent().msgtype === MsgType.KeyVerificationRequest - ) { + // Process only verification event + if (isVerificationEvent(event)) { await this.onKeyVerificationRequest(evt); } }; @@ -1072,6 +1070,7 @@ export class RustCrypto extends TypedEventEmitter event.off(MatrixEventEvent.Decrypted, onDecrypted), TIMEOUT_DELAY); const onDecrypted = (decryptedEvent: MatrixEvent, error?: Error): void => { @@ -1081,7 +1080,6 @@ export class RustCrypto extends TypedEventEmitter