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
This commit is contained in:
Florian Duros 2024-10-16 16:13:14 +02:00 committed by Michael Telatynski
parent ea5cba3649
commit 7236953d07
No known key found for this signature in database
GPG key ID: A2B008A5F49F5D0D
12 changed files with 0 additions and 380 deletions

View file

@ -736,34 +736,6 @@ export const Commands = [
category: CommandCategories.advanced, category: CommandCategories.advanced,
renderingTypes: [TimelineRenderingType.Room], 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({ new Command({
command: "rainbow", command: "rainbow",
description: _td("slash_command|rainbow"), description: _td("slash_command|rainbow"),

View file

@ -14,7 +14,6 @@ import MatrixClientContext from "../../../contexts/MatrixClientContext";
import BaseDialog from "./BaseDialog"; import BaseDialog from "./BaseDialog";
import { TimelineEventEditor } from "./devtools/Event"; import { TimelineEventEditor } from "./devtools/Event";
import ServersInRoom from "./devtools/ServersInRoom"; import ServersInRoom from "./devtools/ServersInRoom";
import VerificationExplorer from "./devtools/VerificationExplorer";
import SettingExplorer from "./devtools/SettingExplorer"; import SettingExplorer from "./devtools/SettingExplorer";
import { RoomStateExplorer } from "./devtools/RoomState"; import { RoomStateExplorer } from "./devtools/RoomState";
import BaseTool, { DevtoolsContext, IDevtoolsProps } from "./devtools/BaseTool"; import BaseTool, { DevtoolsContext, IDevtoolsProps } from "./devtools/BaseTool";
@ -45,7 +44,6 @@ const Tools: Record<Category, [label: TranslationKey, tool: Tool][]> = {
[_td("devtools|explore_room_account_data"), RoomAccountDataExplorer], [_td("devtools|explore_room_account_data"), RoomAccountDataExplorer],
[_td("devtools|view_servers_in_room"), ServersInRoom], [_td("devtools|view_servers_in_room"), ServersInRoom],
[_td("devtools|notifications_debug"), RoomNotifications], [_td("devtools|notifications_debug"), RoomNotifications],
[_td("devtools|verification_explorer"), VerificationExplorer],
[_td("devtools|active_widgets"), WidgetExplorer], [_td("devtools|active_widgets"), WidgetExplorer],
], ],
[Category.Other]: [ [Category.Other]: [

View file

@ -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, TranslationKey> = {
[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 (
<div className="mx_DevTools_VerificationRequest">
<dl>
<dt>{_t("devtools|phase_transaction")}</dt>
<dd>{txnId}</dd>
<dt>{_t("devtools|phase")}</dt>
<dd>{PHASE_MAP[request.phase] ? _t(PHASE_MAP[request.phase]) : request.phase}</dd>
<dt>{_t("devtools|timeout")}</dt>
<dd>{timeout === null ? _t("devtools|timeout_none") : Math.floor(timeout / 1000)}</dd>
<dt>{_t("devtools|methods")}</dt>
<dd>{request.methods && request.methods.join(", ")}</dd>
<dt>{_t("devtools|other_user")}</dt>
<dd>{request.otherUserId}</dd>
</dl>
</div>
);
};
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<string, VerificationRequest>()
);
});
return (
<BaseTool onBack={onBack}>
{Array.from(requests.entries())
.reverse()
.map(([txnId, request]) => (
<VerificationRequestExplorer txnId={txnId} request={request} key={txnId} />
))}
{requests.size < 1 && _t("devtools|no_verification_requests_found")}
</BaseTool>
);
};
export default VerificationExplorer;

View file

@ -579,7 +579,6 @@
"unmute": "Unmute", "unmute": "Unmute",
"unnamed_room": "Unnamed Room", "unnamed_room": "Unnamed Room",
"unnamed_space": "Unnamed Space", "unnamed_space": "Unnamed Space",
"unsent": "Unsent",
"unverified": "Unverified", "unverified": "Unverified",
"updating": "Updating...", "updating": "Updating...",
"user": "User", "user": "User",
@ -764,20 +763,11 @@
"low_bandwidth_mode": "Low bandwidth mode", "low_bandwidth_mode": "Low bandwidth mode",
"low_bandwidth_mode_description": "Requires compatible homeserver.", "low_bandwidth_mode_description": "Requires compatible homeserver.",
"main_timeline": "Main timeline", "main_timeline": "Main timeline",
"methods": "Methods",
"no_receipt_found": "No receipt found", "no_receipt_found": "No receipt found",
"no_verification_requests_found": "No verification requests found",
"notification_state": "Notification state is <strong>%(notificationState)s</strong>", "notification_state": "Notification state is <strong>%(notificationState)s</strong>",
"notifications_debug": "Notifications debug", "notifications_debug": "Notifications debug",
"number_of_users": "Number of users", "number_of_users": "Number of users",
"original_event_source": "Original event source", "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 <strong>encrypted ✅</strong>", "room_encrypted": "Room is <strong>encrypted ✅</strong>",
"room_id": "Room ID: %(roomId)s", "room_id": "Room ID: %(roomId)s",
"room_not_encrypted": "Room is <strong>not encrypted 🚨</strong>", "room_not_encrypted": "Room is <strong>not encrypted 🚨</strong>",
@ -815,8 +805,6 @@
"state_key": "State Key", "state_key": "State Key",
"thread_root_id": "Thread Root ID: %(threadRootId)s", "thread_root_id": "Thread Root ID: %(threadRootId)s",
"threads_timeline": "Threads timeline", "threads_timeline": "Threads timeline",
"timeout": "Timeout",
"timeout_none": "None",
"title": "Developer tools", "title": "Developer tools",
"toggle_event": "toggle event", "toggle_event": "toggle event",
"toolbox": "Toolbox", "toolbox": "Toolbox",
@ -833,7 +821,6 @@
"values_explicit_colon": "Values at explicit levels:", "values_explicit_colon": "Values at explicit levels:",
"values_explicit_room": "Values at explicit levels in this room", "values_explicit_room": "Values at explicit levels in this room",
"values_explicit_this_room_colon": "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_servers_in_room": "View servers in room",
"view_source_decrypted_event_source": "Decrypted event source", "view_source_decrypted_event_source": "Decrypted event source",
"view_source_decrypted_event_source_unavailable": "Decrypted source unavailable", "view_source_decrypted_event_source_unavailable": "Decrypted source unavailable",
@ -3038,7 +3025,6 @@
"rageshake": "Send a bug report with logs", "rageshake": "Send a bug report with logs",
"rainbow": "Sends the given message coloured as a rainbow", "rainbow": "Sends the given message coloured as a rainbow",
"rainbowme": "Sends the given emote 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", "remove": "Removes user with given id from this room",
"roomavatar": "Changes the avatar of the current room", "roomavatar": "Changes the avatar of the current room",
"roomname": "Sets the room name", "roomname": "Sets the room name",

View file

@ -284,8 +284,6 @@ export class SetupEncryptionStore extends EventEmitter {
public done(): void { public done(): void {
this.phase = Phase.Finished; this.phase = Phase.Finished;
this.emit("update"); this.emit("update");
// async - ask other clients for keys, if necessary
MatrixClientPeg.safeGet().crypto?.cancelAndResendAllOutgoingKeyRequests();
} }
private async setActiveVerificationRequest(request: VerificationRequest): Promise<void> { private async setActiveVerificationRequest(request: VerificationRequest): Promise<void> {

View file

@ -414,55 +414,6 @@ export class StopGapWidgetDriver extends WidgetDriver {
await client._unstable_updateDelayedEvent(delayId, action); await client._unstable_updateDelayedEvent(delayId, action);
} }
public async sendToDevice(
eventType: string,
encrypted: boolean,
contentMap: { [userId: string]: { [deviceId: string]: object } },
): Promise<void> {
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<void> => {
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[] { private pickRooms(roomIds?: (string | Symbols.AnyRoom)[]): Room[] {
const client = MatrixClientPeg.get(); const client = MatrixClientPeg.get();
if (!client) throw new Error("Not attached to a client"); if (!client) throw new Error("Not attached to a client");

View file

@ -119,11 +119,6 @@ export function createTestClient(): MatrixClient {
removeRoom: jest.fn(), removeRoom: jest.fn(),
}, },
crypto: {
deviceList: {
downloadKeys: jest.fn(),
},
},
getCrypto: jest.fn().mockReturnValue({ getCrypto: jest.fn().mockReturnValue({
getOwnDeviceKeys: jest.fn(), getOwnDeviceKeys: jest.fn(),
getUserDeviceInfo: jest.fn(), getUserDeviceInfo: jest.fn(),

View file

@ -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", () => { describe("/part", () => {
it("should part room matching alias if found", async () => { it("should part room matching alias if found", async () => {
const room1 = new Room("room-id", client, client.getSafeUserId()); const room1 = new Room("room-id", client, client.getSafeUserId());

View file

@ -75,11 +75,6 @@ exports[`DevtoolsDialog renders the devtools dialog 1`] = `
> >
Notifications debug Notifications debug
</button> </button>
<button
class="mx_DevTools_button"
>
Verification explorer
</button>
<button <button
class="mx_DevTools_button" class="mx_DevTools_button"
> >

View file

@ -51,7 +51,6 @@ function makeClient() {
}, },
getClientWellKnown: jest.fn().mockReturnValue({}), getClientWellKnown: jest.fn().mockReturnValue({}),
getCrypto: jest.fn().mockReturnValue({}), getCrypto: jest.fn().mockReturnValue({}),
crypto: {},
} as unknown as MatrixClient); } as unknown as MatrixClient);
} }
@ -194,7 +193,6 @@ describe("<LoginWithQR />", () => {
}); });
test("approve - no crypto", async () => { test("approve - no crypto", async () => {
(client as any).crypto = undefined;
(client as any).getCrypto = () => undefined; (client as any).getCrypto = () => undefined;
const onFinished = jest.fn(); const onFinished = jest.fn();
render(getComponent({ client, onFinished })); render(getComponent({ client, onFinished }));

View file

@ -18,7 +18,6 @@ import {
MsgType, MsgType,
RelationType, RelationType,
} from "matrix-js-sdk/src/matrix"; } from "matrix-js-sdk/src/matrix";
import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo";
import { import {
Widget, Widget,
MatrixWidgetType, MatrixWidgetType,
@ -171,54 +170,6 @@ describe("StopGapWidgetDriver", () => {
expect(listener).toHaveBeenCalledWith(openIdUpdate); expect(listener).toHaveBeenCalledWith(openIdUpdate);
}); });
describe("sendToDevice", () => {
const contentMap = {
"@alice:example.org": {
"*": {
hello: "alice",
},
},
"@bob:example.org": {
bobDesktop: {
hello: "bob",
},
},
};
let driver: WidgetDriver;
beforeEach(() => {
driver = mkDefaultDriver();
});
it("sends unencrypted messages", async () => {
await driver.sendToDevice("org.example.foo", false, contentMap);
expect(client.queueToDevice.mock.calls).toMatchSnapshot();
});
it("sends encrypted messages", async () => {
const aliceWeb = new DeviceInfo("aliceWeb");
const aliceMobile = new DeviceInfo("aliceMobile");
const bobDesktop = new DeviceInfo("bobDesktop");
mocked(client.crypto!.deviceList).downloadKeys.mockResolvedValue(
new Map([
[
"@alice:example.org",
new Map([
["aliceWeb", aliceWeb],
["aliceMobile", aliceMobile],
]),
],
["@bob:example.org", new Map([["bobDesktop", bobDesktop]])],
]),
);
await driver.sendToDevice("org.example.foo", true, contentMap);
expect(client.encryptAndSendToDevices.mock.calls).toMatchSnapshot();
});
});
describe("getTurnServers", () => { describe("getTurnServers", () => {
let driver: WidgetDriver; let driver: WidgetDriver;

View file

@ -1,82 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`StopGapWidgetDriver sendToDevice sends encrypted messages 1`] = `
[
[
[
{
"deviceInfo": DeviceInfo {
"algorithms": [],
"deviceId": "aliceWeb",
"keys": {},
"known": false,
"signatures": {},
"unsigned": {},
"verified": 0,
},
"userId": "@alice:example.org",
},
{
"deviceInfo": DeviceInfo {
"algorithms": [],
"deviceId": "aliceMobile",
"keys": {},
"known": false,
"signatures": {},
"unsigned": {},
"verified": 0,
},
"userId": "@alice:example.org",
},
],
{
"hello": "alice",
},
],
[
[
{
"deviceInfo": DeviceInfo {
"algorithms": [],
"deviceId": "bobDesktop",
"keys": {},
"known": false,
"signatures": {},
"unsigned": {},
"verified": 0,
},
"userId": "@bob:example.org",
},
],
{
"hello": "bob",
},
],
]
`;
exports[`StopGapWidgetDriver sendToDevice sends unencrypted messages 1`] = `
[
[
{
"batch": [
{
"deviceId": "*",
"payload": {
"hello": "alice",
},
"userId": "@alice:example.org",
},
{
"deviceId": "bobDesktop",
"payload": {
"hello": "bob",
},
"userId": "@bob:example.org",
},
],
"eventType": "org.example.foo",
},
],
]
`;