diff --git a/src/components/views/settings/CrossSigningPanel.tsx b/src/components/views/settings/CrossSigningPanel.tsx index fdc54dee6e..c9208ca903 100644 --- a/src/components/views/settings/CrossSigningPanel.tsx +++ b/src/components/views/settings/CrossSigningPanel.tsx @@ -90,17 +90,15 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> { private async getUpdatedStatus(): Promise { const cli = MatrixClientPeg.get(); - const crypto = cli.crypto; + const crypto = cli.getCrypto(); if (!crypto) return; - const pkCache = cli.getCrossSigningCacheCallbacks(); - const crossSigning = crypto.crossSigningInfo; - const secretStorage = cli.secretStorage; - const crossSigningPublicKeysOnDevice = Boolean(crossSigning.getId()); - const crossSigningPrivateKeysInStorage = Boolean(await crossSigning.isStoredInSecretStorage(secretStorage)); - const masterPrivateKeyCached = !!(await pkCache?.getCrossSigningKeyCache?.("master")); - const selfSigningPrivateKeyCached = !!(await pkCache?.getCrossSigningKeyCache?.("self_signing")); - const userSigningPrivateKeyCached = !!(await pkCache?.getCrossSigningKeyCache?.("user_signing")); + const crossSigningStatus = await crypto.getCrossSigningStatus(); + const crossSigningPublicKeysOnDevice = crossSigningStatus.publicKeysOnDevice; + const crossSigningPrivateKeysInStorage = crossSigningStatus.privateKeysInSecretStorage; + const masterPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.masterKey; + const selfSigningPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.selfSigningKey; + const userSigningPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.userSigningKey; const homeserverSupportsCrossSigning = await cli.doesServerSupportUnstableFeature( "org.matrix.e2e_cross_signing", ); diff --git a/test/components/views/settings/CrossSigningPanel-test.tsx b/test/components/views/settings/CrossSigningPanel-test.tsx index a41c55c48a..b9fd22dc44 100644 --- a/test/components/views/settings/CrossSigningPanel-test.tsx +++ b/test/components/views/settings/CrossSigningPanel-test.tsx @@ -16,7 +16,8 @@ limitations under the License. import React from "react"; import { render, screen } from "@testing-library/react"; -import { mocked } from "jest-mock"; +import { Mocked, mocked } from "jest-mock"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; import CrossSigningPanel from "../../../../src/components/views/settings/CrossSigningPanel"; import { @@ -28,17 +29,18 @@ import { describe("", () => { const userId = "@alice:server.org"; - const mockClient = getMockClientWithEventEmitter({ - ...mockClientMethodsUser(userId), - ...mockClientMethodsCrypto(), - doesServerSupportUnstableFeature: jest.fn(), - }); + let mockClient: Mocked; const getComponent = () => render(); beforeEach(() => { + mockClient = getMockClientWithEventEmitter({ + ...mockClientMethodsUser(userId), + ...mockClientMethodsCrypto(), + doesServerSupportUnstableFeature: jest.fn(), + }); + mockClient.doesServerSupportUnstableFeature.mockResolvedValue(true); mockClient.isCrossSigningReady.mockResolvedValue(false); - mocked(mockClient.crypto!.crossSigningInfo).isStoredInSecretStorage.mockClear().mockResolvedValue(null); }); it("should render a spinner while loading", () => { @@ -72,15 +74,20 @@ describe("", () => { }); it("should render when keys are backed up", async () => { - mocked(mockClient.crypto!.crossSigningInfo).isStoredInSecretStorage.mockResolvedValue({ test: {} }); + mocked(mockClient.getCrypto()!.getCrossSigningStatus).mockResolvedValue({ + publicKeysOnDevice: true, + privateKeysInSecretStorage: true, + privateKeysCachedLocally: { + masterKey: true, + selfSigningKey: true, + userSigningKey: true, + }, + }); getComponent(); await flushPromises(); expect(screen.getByTestId("summarised-status").innerHTML).toEqual("✅ Cross-signing is ready for use."); expect(screen.getByText("Cross-signing private keys:").parentElement!).toMatchSnapshot(); - expect(mockClient.crypto!.crossSigningInfo.isStoredInSecretStorage).toHaveBeenCalledWith( - mockClient.secretStorage, - ); }); }); @@ -97,7 +104,15 @@ describe("", () => { }); it("should render when keys are backed up", async () => { - mocked(mockClient.crypto!.crossSigningInfo).isStoredInSecretStorage.mockResolvedValue({ test: {} }); + mocked(mockClient.getCrypto()!.getCrossSigningStatus).mockResolvedValue({ + publicKeysOnDevice: true, + privateKeysInSecretStorage: true, + privateKeysCachedLocally: { + masterKey: true, + selfSigningKey: true, + userSigningKey: true, + }, + }); getComponent(); await flushPromises(); @@ -105,9 +120,6 @@ describe("", () => { "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", ); expect(screen.getByText("Cross-signing private keys:").parentElement!).toMatchSnapshot(); - expect(mockClient.crypto!.crossSigningInfo.isStoredInSecretStorage).toHaveBeenCalledWith( - mockClient.secretStorage, - ); }); }); }); diff --git a/test/test-utils/client.ts b/test/test-utils/client.ts index 88b064dbb8..177e06abc1 100644 --- a/test/test-utils/client.ts +++ b/test/test-utils/client.ts @@ -156,9 +156,16 @@ export const mockClientMethodsCrypto = (): Partial< crypto: { isSecretStorageReady: jest.fn(), getSessionBackupPrivateKey: jest.fn(), - crossSigningInfo: { - getId: jest.fn(), - isStoredInSecretStorage: jest.fn(), - }, }, + getCrypto: jest.fn().mockReturnValue({ + getCrossSigningStatus: jest.fn().mockResolvedValue({ + publicKeysOnDevice: true, + privateKeysInSecretStorage: false, + privateKeysCachedLocally: { + masterKey: true, + selfSigningKey: true, + userSigningKey: true, + }, + }), + }), });