From f56f8148b7e22e9e09610848a495b538ac0c3eeb Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Wed, 16 Oct 2024 16:13:14 +0200 Subject: [PATCH] Remove references to `MatrixClient.crypto` (#28204) * Remove `VerificationExplorer` * Remove `remakeolm` slash command * Remove call to `crypto.cancelAndResendAllOutgoingKeyRequests` * Remove crypto mock in `LoginWithQR-test.tsx` * Remove `StopGadWidgetDriver.sendToDevice` * Remove remaining mock --- src/SlashCommands.tsx | 28 ------ .../views/dialogs/DevtoolsDialog.tsx | 2 - .../dialogs/devtools/VerificationExplorer.tsx | 98 ------------------- src/i18n/strings/en_EN.json | 14 --- src/stores/SetupEncryptionStore.ts | 2 - src/stores/widgets/StopGapWidgetDriver.ts | 49 ---------- test/test-utils/test-utils.ts | 5 - test/unit-tests/SlashCommands-test.tsx | 44 --------- .../DevtoolsDialog-test.tsx.snap | 5 - .../settings/devices/LoginWithQR-test.tsx | 2 - .../widgets/StopGapWidgetDriver-test.ts | 49 ---------- .../StopGapWidgetDriver-test.ts.snap | 82 ---------------- 12 files changed, 380 deletions(-) delete mode 100644 test/unit-tests/stores/widgets/__snapshots__/StopGapWidgetDriver-test.ts.snap diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index 9d91ec09873..7375cba568e 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -736,34 +736,6 @@ export const Commands = [ category: CommandCategories.advanced, renderingTypes: [TimelineRenderingType.Room], }), - new Command({ - command: "remakeolm", - description: _td("slash_command|remakeolm"), - isEnabled: (cli) => { - return SettingsStore.getValue("developerMode") && !isCurrentLocalRoom(cli); - }, - runFn: (cli, roomId) => { - try { - const room = cli.getRoom(roomId); - - cli.forceDiscardSession(roomId); - - return success( - room?.getEncryptionTargetMembers().then((members) => { - // noinspection JSIgnoredPromiseFromCall - cli.crypto?.ensureOlmSessionsForUsers( - members.map((m) => m.userId), - true, - ); - }), - ); - } catch (e) { - return reject(e instanceof Error ? e.message : e); - } - }, - category: CommandCategories.advanced, - renderingTypes: [TimelineRenderingType.Room], - }), new Command({ command: "rainbow", description: _td("slash_command|rainbow"), diff --git a/src/components/views/dialogs/DevtoolsDialog.tsx b/src/components/views/dialogs/DevtoolsDialog.tsx index f06c5af1987..7319685014c 100644 --- a/src/components/views/dialogs/DevtoolsDialog.tsx +++ b/src/components/views/dialogs/DevtoolsDialog.tsx @@ -14,7 +14,6 @@ import MatrixClientContext from "../../../contexts/MatrixClientContext"; import BaseDialog from "./BaseDialog"; import { TimelineEventEditor } from "./devtools/Event"; import ServersInRoom from "./devtools/ServersInRoom"; -import VerificationExplorer from "./devtools/VerificationExplorer"; import SettingExplorer from "./devtools/SettingExplorer"; import { RoomStateExplorer } from "./devtools/RoomState"; import BaseTool, { DevtoolsContext, IDevtoolsProps } from "./devtools/BaseTool"; @@ -45,7 +44,6 @@ const Tools: Record = { [_td("devtools|explore_room_account_data"), RoomAccountDataExplorer], [_td("devtools|view_servers_in_room"), ServersInRoom], [_td("devtools|notifications_debug"), RoomNotifications], - [_td("devtools|verification_explorer"), VerificationExplorer], [_td("devtools|active_widgets"), WidgetExplorer], ], [Category.Other]: [ diff --git a/src/components/views/dialogs/devtools/VerificationExplorer.tsx b/src/components/views/dialogs/devtools/VerificationExplorer.tsx index 017f1b95b47..e69de29bb2d 100644 --- a/src/components/views/dialogs/devtools/VerificationExplorer.tsx +++ b/src/components/views/dialogs/devtools/VerificationExplorer.tsx @@ -1,98 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2023 The Matrix.org Foundation C.I.C. -Copyright 2022 Michael Telatynski <7t3chguy@gmail.com> - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only -Please see LICENSE files in the repository root for full details. -*/ - -import React, { useContext, useEffect, useState } from "react"; -import { - VerificationPhase as Phase, - VerificationRequest, - VerificationRequestEvent, - CryptoEvent, -} from "matrix-js-sdk/src/crypto-api"; - -import { useTypedEventEmitter, useTypedEventEmitterState } from "../../../../hooks/useEventEmitter"; -import { _t, _td, TranslationKey } from "../../../../languageHandler"; -import MatrixClientContext from "../../../../contexts/MatrixClientContext"; -import BaseTool, { DevtoolsContext, IDevtoolsProps } from "./BaseTool"; -import { Tool } from "../DevtoolsDialog"; - -const PHASE_MAP: Record = { - [Phase.Unsent]: _td("common|unsent"), - [Phase.Requested]: _td("devtools|phase_requested"), - [Phase.Ready]: _td("devtools|phase_ready"), - [Phase.Done]: _td("action|done"), - [Phase.Started]: _td("devtools|phase_started"), - [Phase.Cancelled]: _td("devtools|phase_cancelled"), -}; - -const VerificationRequestExplorer: React.FC<{ - txnId: string; - request: VerificationRequest; -}> = ({ txnId, request }) => { - const [, updateState] = useState(); - const [timeout, setRequestTimeout] = useState(request.timeout); - - /* Re-render if something changes state */ - useTypedEventEmitter(request, VerificationRequestEvent.Change, updateState); - - /* Keep re-rendering if there's a timeout */ - useEffect(() => { - if (request.timeout == 0) return; - - /* Note that request.timeout is a getter, so its value changes */ - const id = window.setInterval(() => { - setRequestTimeout(request.timeout); - }, 500); - - return () => { - clearInterval(id); - }; - }, [request]); - - return ( -
-
-
{_t("devtools|phase_transaction")}
-
{txnId}
-
{_t("devtools|phase")}
-
{PHASE_MAP[request.phase] ? _t(PHASE_MAP[request.phase]) : request.phase}
-
{_t("devtools|timeout")}
-
{timeout === null ? _t("devtools|timeout_none") : Math.floor(timeout / 1000)}
-
{_t("devtools|methods")}
-
{request.methods && request.methods.join(", ")}
-
{_t("devtools|other_user")}
-
{request.otherUserId}
-
-
- ); -}; - -const VerificationExplorer: Tool = ({ onBack }: IDevtoolsProps) => { - const cli = useContext(MatrixClientContext); - const context = useContext(DevtoolsContext); - - const requests = useTypedEventEmitterState(cli, CryptoEvent.VerificationRequestReceived, () => { - return ( - cli.crypto?.inRoomVerificationRequests["requestsByRoomId"]?.get(context.room.roomId) ?? - new Map() - ); - }); - - return ( - - {Array.from(requests.entries()) - .reverse() - .map(([txnId, request]) => ( - - ))} - {requests.size < 1 && _t("devtools|no_verification_requests_found")} - - ); -}; - -export default VerificationExplorer; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 35dfab239df..7e96be0589a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -579,7 +579,6 @@ "unmute": "Unmute", "unnamed_room": "Unnamed Room", "unnamed_space": "Unnamed Space", - "unsent": "Unsent", "unverified": "Unverified", "updating": "Updating...", "user": "User", @@ -764,20 +763,11 @@ "low_bandwidth_mode": "Low bandwidth mode", "low_bandwidth_mode_description": "Requires compatible homeserver.", "main_timeline": "Main timeline", - "methods": "Methods", "no_receipt_found": "No receipt found", - "no_verification_requests_found": "No verification requests found", "notification_state": "Notification state is %(notificationState)s", "notifications_debug": "Notifications debug", "number_of_users": "Number of users", "original_event_source": "Original event source", - "other_user": "Other user", - "phase": "Phase", - "phase_cancelled": "Cancelled", - "phase_ready": "Ready", - "phase_requested": "Requested", - "phase_started": "Started", - "phase_transaction": "Transaction", "room_encrypted": "Room is encrypted ✅", "room_id": "Room ID: %(roomId)s", "room_not_encrypted": "Room is not encrypted 🚨", @@ -815,8 +805,6 @@ "state_key": "State Key", "thread_root_id": "Thread Root ID: %(threadRootId)s", "threads_timeline": "Threads timeline", - "timeout": "Timeout", - "timeout_none": "None", "title": "Developer tools", "toggle_event": "toggle event", "toolbox": "Toolbox", @@ -833,7 +821,6 @@ "values_explicit_colon": "Values at explicit levels:", "values_explicit_room": "Values at explicit levels in this room", "values_explicit_this_room_colon": "Values at explicit levels in this room:", - "verification_explorer": "Verification explorer", "view_servers_in_room": "View servers in room", "view_source_decrypted_event_source": "Decrypted event source", "view_source_decrypted_event_source_unavailable": "Decrypted source unavailable", @@ -3038,7 +3025,6 @@ "rageshake": "Send a bug report with logs", "rainbow": "Sends the given message coloured as a rainbow", "rainbowme": "Sends the given emote coloured as a rainbow", - "remakeolm": "Developer command: Discards the current outbound group session and sets up new Olm sessions", "remove": "Removes user with given id from this room", "roomavatar": "Changes the avatar of the current room", "roomname": "Sets the room name", diff --git a/src/stores/SetupEncryptionStore.ts b/src/stores/SetupEncryptionStore.ts index 56ec7a3ddf3..6fafd6efaa2 100644 --- a/src/stores/SetupEncryptionStore.ts +++ b/src/stores/SetupEncryptionStore.ts @@ -284,8 +284,6 @@ export class SetupEncryptionStore extends EventEmitter { public done(): void { this.phase = Phase.Finished; this.emit("update"); - // async - ask other clients for keys, if necessary - MatrixClientPeg.safeGet().crypto?.cancelAndResendAllOutgoingKeyRequests(); } private async setActiveVerificationRequest(request: VerificationRequest): Promise { diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index 88e79d97f2d..bf4ee16b5d8 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -414,55 +414,6 @@ export class StopGapWidgetDriver extends WidgetDriver { await client._unstable_updateDelayedEvent(delayId, action); } - public async sendToDevice( - eventType: string, - encrypted: boolean, - contentMap: { [userId: string]: { [deviceId: string]: object } }, - ): Promise { - const client = MatrixClientPeg.safeGet(); - - if (encrypted) { - const deviceInfoMap = await client.crypto!.deviceList.downloadKeys(Object.keys(contentMap), false); - - await Promise.all( - Object.entries(contentMap).flatMap(([userId, userContentMap]) => - Object.entries(userContentMap).map(async ([deviceId, content]): Promise => { - const devices = deviceInfoMap.get(userId); - if (!devices) return; - - if (deviceId === "*") { - // Send the message to all devices we have keys for - await client.encryptAndSendToDevices( - Array.from(devices.values()).map((deviceInfo) => ({ - userId, - deviceInfo, - })), - content, - ); - } else if (devices.has(deviceId)) { - // Send the message to a specific device - await client.encryptAndSendToDevices( - [{ userId, deviceInfo: devices.get(deviceId)! }], - content, - ); - } - }), - ), - ); - } else { - await client.queueToDevice({ - eventType, - batch: Object.entries(contentMap).flatMap(([userId, userContentMap]) => - Object.entries(userContentMap).map(([deviceId, content]) => ({ - userId, - deviceId, - payload: content, - })), - ), - }); - } - } - private pickRooms(roomIds?: (string | Symbols.AnyRoom)[]): Room[] { const client = MatrixClientPeg.get(); if (!client) throw new Error("Not attached to a client"); diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index acf2a9d6e0e..d9f4f3f5a65 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -119,11 +119,6 @@ export function createTestClient(): MatrixClient { removeRoom: jest.fn(), }, - crypto: { - deviceList: { - downloadKeys: jest.fn(), - }, - }, getCrypto: jest.fn().mockReturnValue({ getOwnDeviceKeys: jest.fn(), getUserDeviceInfo: jest.fn(), diff --git a/test/unit-tests/SlashCommands-test.tsx b/test/unit-tests/SlashCommands-test.tsx index 4592420273f..9305f0956ec 100644 --- a/test/unit-tests/SlashCommands-test.tsx +++ b/test/unit-tests/SlashCommands-test.tsx @@ -236,50 +236,6 @@ describe("SlashCommands", () => { }); }); - describe("/remakeolm", () => { - beforeEach(() => { - command = findCommand("remakeolm")!; - }); - - describe("isEnabled", () => { - describe("when developer mode is enabled", () => { - beforeEach(() => { - jest.spyOn(SettingsStore, "getValue").mockImplementation((settingName: string) => { - if (settingName === "developerMode") return true; - }); - }); - - it("should return true for Room", () => { - setCurrentRoom(); - expect(command.isEnabled(client)).toBe(true); - }); - - it("should return false for LocalRoom", () => { - setCurrentLocalRoom(); - expect(command.isEnabled(client)).toBe(false); - }); - }); - - describe("when developer mode is not enabled", () => { - beforeEach(() => { - jest.spyOn(SettingsStore, "getValue").mockImplementation((settingName: string) => { - if (settingName === "developerMode") return false; - }); - }); - - it("should return false for Room", () => { - setCurrentRoom(); - expect(command.isEnabled(client)).toBe(false); - }); - - it("should return false for LocalRoom", () => { - setCurrentLocalRoom(); - expect(command.isEnabled(client)).toBe(false); - }); - }); - }); - }); - describe("/part", () => { it("should part room matching alias if found", async () => { const room1 = new Room("room-id", client, client.getSafeUserId()); diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap index fca0dc9885d..6cd547e58bf 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap @@ -75,11 +75,6 @@ exports[`DevtoolsDialog renders the devtools dialog 1`] = ` > Notifications debug -