From 571ada37a760b381b536cc100cac72805634fce0 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Tue, 15 Oct 2024 16:24:58 +0200 Subject: [PATCH] Replace `MatrixClient.isCryptoEnabled` by `MatrixClient.getCrypto` (#140) * Replace `MatrixClient.isCryptoEnabled` by `MatrixClient.getCrypto` * Cast `cryptoEnabled` as `boolean` * Fix `MatrixChat-test` (cherry picked from commit 950ab1940bfcea9443f03284f9175d319c13a44c) --- src/components/structures/MatrixChat.tsx | 6 +++--- src/components/structures/RoomView.tsx | 2 +- .../views/rooms/SendMessageComposer.tsx | 2 +- src/hooks/useEncryptionStatus.ts | 2 +- test/test-utils/client.ts | 1 - test/test-utils/test-utils.ts | 1 - .../components/structures/MatrixChat-test.tsx | 6 ++---- .../components/structures/RoomView-test.tsx | 3 +-- .../security/CreateSecretStorageDialog-test.tsx | 2 -- .../views/right_panel/UserInfo-test.tsx | 3 --- .../components/views/rooms/RoomHeader-test.tsx | 16 ++-------------- .../views/rooms/SendMessageComposer-test.tsx | 1 - .../views/settings/devices/LoginWithQR-test.tsx | 1 - .../settings/devices/LoginWithQRSection-test.tsx | 1 - 14 files changed, 11 insertions(+), 36 deletions(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 0e5ec04d33..32d3bc7bd6 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -413,7 +413,7 @@ export default class MatrixChat extends React.PureComponent { private async postLoginSetup(): Promise { const cli = MatrixClientPeg.safeGet(); - const cryptoEnabled = cli.isCryptoEnabled(); + const cryptoEnabled = Boolean(cli.getCrypto()); if (!cryptoEnabled) { this.onLoggedIn(); } @@ -1619,7 +1619,7 @@ export default class MatrixChat extends React.PureComponent { .catch((e) => logger.error("Unable to start DecryptionFailureTracker", e)); cli.on(ClientEvent.Room, (room) => { - if (cli.isCryptoEnabled()) { + if (cli.getCrypto()) { const blacklistEnabled = SettingsStore.getValueAt( SettingLevel.ROOM_DEVICE, "blacklistUnverifiedDevices", @@ -1707,7 +1707,7 @@ export default class MatrixChat extends React.PureComponent { } } - if (cli.isCryptoEnabled()) { + if (cli.getCrypto()) { const blacklistEnabled = SettingsStore.getValueAt(SettingLevel.DEVICE, "blacklistUnverifiedDevices"); cli.setGlobalBlacklistUnverifiedDevices(blacklistEnabled); diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 1b191f5d8e..9a75c62481 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -1461,7 +1461,7 @@ export class RoomView extends React.Component { // set the state immediately then update, so we don't scare the user into thinking the room is unencrypted this.setState({ e2eStatus }); - if (this.context.client.isCryptoEnabled()) { + if (this.context.client.getCrypto()) { /* At this point, the user has encryption on and cross-signing on */ e2eStatus = await shieldStatusForRoom(this.context.client, room); RoomView.e2eStatusCache.set(room.roomId, e2eStatus); diff --git a/src/components/views/rooms/SendMessageComposer.tsx b/src/components/views/rooms/SendMessageComposer.tsx index 30c11428fc..776963eb33 100644 --- a/src/components/views/rooms/SendMessageComposer.tsx +++ b/src/components/views/rooms/SendMessageComposer.tsx @@ -265,7 +265,7 @@ export class SendMessageComposer extends React.Component) { super(props, context); - if (this.props.mxClient.isCryptoEnabled() && this.props.mxClient.isRoomEncrypted(this.props.room.roomId)) { + if (this.props.mxClient.getCrypto() && this.props.mxClient.isRoomEncrypted(this.props.room.roomId)) { this.prepareToEncrypt = throttle( () => { this.props.mxClient.getCrypto()?.prepareToEncrypt(this.props.room); diff --git a/src/hooks/useEncryptionStatus.ts b/src/hooks/useEncryptionStatus.ts index e3e44fca77..30417f7821 100644 --- a/src/hooks/useEncryptionStatus.ts +++ b/src/hooks/useEncryptionStatus.ts @@ -15,7 +15,7 @@ export function useEncryptionStatus(client: MatrixClient, room: Room): E2EStatus const [e2eStatus, setE2eStatus] = useState(null); useEffect(() => { - if (client.isCryptoEnabled()) { + if (client.getCrypto()) { shieldStatusForRoom(client, room).then((e2eStatus) => { setE2eStatus(e2eStatus); }); diff --git a/test/test-utils/client.ts b/test/test-utils/client.ts index 19625043e1..7b0e22e70e 100644 --- a/test/test-utils/client.ts +++ b/test/test-utils/client.ts @@ -141,7 +141,6 @@ export const mockClientMethodsDevice = ( export const mockClientMethodsCrypto = (): Partial< Record & PropertyLikeKeys, unknown> > => ({ - isCryptoEnabled: jest.fn(), isCrossSigningReady: jest.fn(), isKeyBackupKeyStored: jest.fn(), getCrossSigningCacheCallbacks: jest.fn().mockReturnValue({ getCrossSigningKeyCache: jest.fn() }), diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index 6573285423..acf2a9d6e0 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -212,7 +212,6 @@ export function createTestClient(): MatrixClient { relations: jest.fn().mockResolvedValue({ events: [], }), - isCryptoEnabled: jest.fn().mockReturnValue(false), hasLazyLoadMembersEnabled: jest.fn().mockReturnValue(false), isInitialSyncComplete: jest.fn().mockReturnValue(true), downloadKeys: jest.fn(), diff --git a/test/unit-tests/components/structures/MatrixChat-test.tsx b/test/unit-tests/components/structures/MatrixChat-test.tsx index e47494cc7b..4b10043ad2 100644 --- a/test/unit-tests/components/structures/MatrixChat-test.tsx +++ b/test/unit-tests/components/structures/MatrixChat-test.tsx @@ -98,7 +98,6 @@ describe("", () => { getThirdpartyProtocols: jest.fn().mockResolvedValue({}), getClientWellKnown: jest.fn().mockReturnValue({}), isVersionSupported: jest.fn().mockResolvedValue(false), - isCryptoEnabled: jest.fn().mockReturnValue(false), initRustCrypto: jest.fn(), getRoom: jest.fn(), getMediaHandler: jest.fn().mockReturnValue({ @@ -1012,16 +1011,15 @@ describe("", () => { setDeviceIsolationMode: jest.fn(), userHasCrossSigningKeys: jest.fn().mockResolvedValue(false), }; - loginClient.isCryptoEnabled.mockReturnValue(true); loginClient.getCrypto.mockReturnValue(mockCrypto as any); }); it("should go straight to logged in view when crypto is not enabled", async () => { - loginClient.isCryptoEnabled.mockReturnValue(false); + loginClient.getCrypto.mockReturnValue(undefined); await getComponentAndLogin(true); - expect(loginClient.getCrypto()!.userHasCrossSigningKeys).not.toHaveBeenCalled(); + expect(screen.getByRole("heading", { name: "Welcome Ernie" })).toBeInTheDocument(); }); it("should go straight to logged in view when user does not have cross signing keys and server does not support cross signing", async () => { diff --git a/test/unit-tests/components/structures/RoomView-test.tsx b/test/unit-tests/components/structures/RoomView-test.tsx index c9fcaa6e30..b6a0f28637 100644 --- a/test/unit-tests/components/structures/RoomView-test.tsx +++ b/test/unit-tests/components/structures/RoomView-test.tsx @@ -97,6 +97,7 @@ describe("RoomView", () => { stores.rightPanelStore.useUnitTestClient(cli); jest.spyOn(VoipUserMapper.sharedInstance(), "getVirtualRoomForRoom").mockResolvedValue(undefined); + jest.spyOn(cli, "getCrypto").mockReturnValue(undefined); }); afterEach(() => { @@ -230,7 +231,6 @@ describe("RoomView", () => { it("updates url preview visibility on encryption state change", async () => { room.getMyMembership = jest.fn().mockReturnValue(KnownMembership.Join); // we should be starting unencrypted - expect(cli.isCryptoEnabled()).toEqual(false); expect(cli.isRoomEncrypted(room.roomId)).toEqual(false); const roomViewInstance = await getRoomViewInstance(); @@ -246,7 +246,6 @@ describe("RoomView", () => { expect(roomViewInstance.state.showUrlPreview).toBe(true); // now enable encryption - cli.isCryptoEnabled.mockReturnValue(true); cli.isRoomEncrypted.mockReturnValue(true); // and fake an encryption event into the room to prompt it to re-check diff --git a/test/unit-tests/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx b/test/unit-tests/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx index 008032f888..7c67125f01 100644 --- a/test/unit-tests/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx +++ b/test/unit-tests/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx @@ -134,8 +134,6 @@ describe("CreateSecretStorageDialog", () => { }); it("calls bootstrapSecretStorage once keys are restored if the backup is now trusted", async () => { - mockClient.isCryptoEnabled.mockReturnValue(true); - const result = renderComponent(); await result.findByText(/Enter your account password to confirm the upgrade/); expect(result.container).toMatchSnapshot(); diff --git a/test/unit-tests/components/views/right_panel/UserInfo-test.tsx b/test/unit-tests/components/views/right_panel/UserInfo-test.tsx index 86d35bf884..e0bfe10c86 100644 --- a/test/unit-tests/components/views/right_panel/UserInfo-test.tsx +++ b/test/unit-tests/components/views/right_panel/UserInfo-test.tsx @@ -142,7 +142,6 @@ beforeEach(() => { isUserIgnored: jest.fn(), getIgnoredUsers: jest.fn(), setIgnoredUsers: jest.fn(), - isCryptoEnabled: jest.fn(), getUserId: jest.fn(), getSafeUserId: jest.fn(), getDomain: jest.fn(), @@ -424,7 +423,6 @@ describe("", () => { describe("with crypto enabled", () => { beforeEach(() => { - mockClient.isCryptoEnabled.mockReturnValue(true); mockClient.doesServerSupportUnstableFeature.mockResolvedValue(true); mockCrypto.getUserVerificationStatus.mockResolvedValue(new UserVerificationStatus(false, false, false)); @@ -663,7 +661,6 @@ describe("", () => { describe("with an encrypted room", () => { beforeEach(() => { - mockClient.isCryptoEnabled.mockReturnValue(true); mockClient.isRoomEncrypted.mockReturnValue(true); }); diff --git a/test/unit-tests/components/views/rooms/RoomHeader-test.tsx b/test/unit-tests/components/views/rooms/RoomHeader-test.tsx index bd4e3c8f29..6805f064cf 100644 --- a/test/unit-tests/components/views/rooms/RoomHeader-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomHeader-test.tsx @@ -8,15 +8,7 @@ Please see LICENSE files in the repository root for full details. import React from "react"; import { CallType, MatrixCall } from "matrix-js-sdk/src/webrtc/call"; -import { - EventType, - JoinRule, - MatrixClient, - MatrixEvent, - PendingEventOrdering, - Room, - RoomMember, -} from "matrix-js-sdk/src/matrix"; +import { EventType, JoinRule, MatrixEvent, PendingEventOrdering, Room, RoomMember } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; import { createEvent, @@ -86,6 +78,7 @@ describe("RoomHeader", () => { } as unknown as DMRoomMap); setCardSpy = jest.spyOn(RightPanelStore.instance, "setCard"); + jest.spyOn(ShieldUtils, "shieldStatusForRoom").mockResolvedValue(ShieldUtils.E2EStatus.Normal); }); afterEach(() => { @@ -595,10 +588,7 @@ describe("RoomHeader", () => { }); describe("dm", () => { - let client: MatrixClient; beforeEach(() => { - client = MatrixClientPeg.get()!; - // Make the mocked room a DM mocked(DMRoomMap.shared().getUserIdForRoomId).mockImplementation((roomId) => { if (roomId === room.roomId) return "@user:example.com"; @@ -624,8 +614,6 @@ describe("RoomHeader", () => { getMxcAvatarUrl: () => "mxc://avatar.url/image.png", }, ]); - jest.spyOn(client, "isCryptoEnabled").mockReturnValue(true); - jest.spyOn(ShieldUtils, "shieldStatusForRoom").mockResolvedValue(ShieldUtils.E2EStatus.Normal); }); it.each([ diff --git a/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx b/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx index 5fcea1dbd4..a41c221616 100644 --- a/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx +++ b/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx @@ -571,7 +571,6 @@ describe("", () => { it("should call prepareToEncrypt when the user is typing", async () => { const cli = stubClient(); - cli.isCryptoEnabled = jest.fn().mockReturnValue(true); cli.isRoomEncrypted = jest.fn().mockReturnValue(true); const room = mkStubRoom("!roomId:server", "Room", cli); diff --git a/test/unit-tests/components/views/settings/devices/LoginWithQR-test.tsx b/test/unit-tests/components/views/settings/devices/LoginWithQR-test.tsx index e54d296857..1e85b0e4a9 100644 --- a/test/unit-tests/components/views/settings/devices/LoginWithQR-test.tsx +++ b/test/unit-tests/components/views/settings/devices/LoginWithQR-test.tsx @@ -38,7 +38,6 @@ function makeClient() { getUser: jest.fn(), isGuest: jest.fn().mockReturnValue(false), isUserIgnored: jest.fn(), - isCryptoEnabled: jest.fn(), getUserId: jest.fn(), on: jest.fn(), isSynapseAdministrator: jest.fn().mockResolvedValue(false), diff --git a/test/unit-tests/components/views/settings/devices/LoginWithQRSection-test.tsx b/test/unit-tests/components/views/settings/devices/LoginWithQRSection-test.tsx index 3a839d68f4..fc06a88b6a 100644 --- a/test/unit-tests/components/views/settings/devices/LoginWithQRSection-test.tsx +++ b/test/unit-tests/components/views/settings/devices/LoginWithQRSection-test.tsx @@ -25,7 +25,6 @@ function makeClient(wellKnown: IClientWellKnown) { getUser: jest.fn(), isGuest: jest.fn().mockReturnValue(false), isUserIgnored: jest.fn(), - isCryptoEnabled: jest.fn(), getUserId: jest.fn(), on: jest.fn(), isSynapseAdministrator: jest.fn().mockResolvedValue(false),