diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index ab952c56334..f34753b6798 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -340,7 +340,16 @@ class MatrixClientPegClass implements IMatrixClientPeg { setDeviceIsolationMode(this.matrixClient, SettingsStore.getValue("feature_exclude_insecure_devices")); - // TODO: device dehydration and whathaveyou + // Start dehydration. This code is only for the case where the client + // gets restarted, so we only do this if we already have the dehydration + // key cached, and we don't have to try to rehydrate a device. If this + // is a new login, we will start dehydration after Secret Storage is + // unlocked. + const crypto = this.matrixClient.getCrypto(); + if (await crypto?.isDehydrationSupported()) { + await crypto.startDehydration({ onlyIfKeyCached: true, rehydrate: false }); + } + return; } diff --git a/test/unit-tests/MatrixClientPeg-test.ts b/test/unit-tests/MatrixClientPeg-test.ts index c46edad55cf..f87a33e07ee 100644 --- a/test/unit-tests/MatrixClientPeg-test.ts +++ b/test/unit-tests/MatrixClientPeg-test.ts @@ -80,10 +80,17 @@ describe("MatrixClientPeg", () => { it("should initialise the rust crypto library by default", async () => { const mockInitRustCrypto = jest.spyOn(testPeg.safeGet(), "initRustCrypto").mockResolvedValue(undefined); + const mockStartDehydration = jest.fn(); + jest.spyOn(testPeg.safeGet(), "getCrypto").mockReturnValue({ + isDehydrationSupported: jest.fn().mockResolvedValue(true), + startDehydration: mockStartDehydration, + setDeviceIsolationMode: jest.fn(), + }); const cryptoStoreKey = new Uint8Array([1, 2, 3, 4]); await testPeg.start({ rustCryptoStoreKey: cryptoStoreKey }); expect(mockInitRustCrypto).toHaveBeenCalledWith({ storageKey: cryptoStoreKey }); + expect(mockStartDehydration).toHaveBeenCalledWith({ onlyIfKeyCached: true, rehydrate: false }); }); it("Should migrate existing login", async () => { diff --git a/test/unit-tests/components/structures/MatrixChat-test.tsx b/test/unit-tests/components/structures/MatrixChat-test.tsx index a29834d51f7..66397a7275a 100644 --- a/test/unit-tests/components/structures/MatrixChat-test.tsx +++ b/test/unit-tests/components/structures/MatrixChat-test.tsx @@ -129,6 +129,7 @@ describe("", () => { getCrypto: jest.fn().mockReturnValue({ getVerificationRequestsToDeviceInProgress: jest.fn().mockReturnValue([]), isCrossSigningReady: jest.fn().mockReturnValue(false), + isDehydrationSupported: jest.fn().mockReturnValue(false), getUserDeviceInfo: jest.fn().mockReturnValue(new Map()), getUserVerificationStatus: jest.fn().mockResolvedValue(new UserVerificationStatus(false, false, false)), getVersion: jest.fn().mockReturnValue("1"), @@ -1006,6 +1007,7 @@ describe("", () => { resetKeyBackup: jest.fn(), isEncryptionEnabledInRoom: jest.fn().mockResolvedValue(false), checkKeyBackupAndEnable: jest.fn().mockResolvedValue(null), + isDehydrationSupported: jest.fn().mockReturnValue(false), }; loginClient.getCrypto.mockReturnValue(mockCrypto as any); });