Add support for device dehydration v2 (#12316)
* rehydrate/dehydrate device if configured in well-known * add handling for dehydrated devices * some fixes * schedule dehydration * improve display of own dehydrated device * created dehydrated device when creating or resetting SSSS * some UI tweaks * reorder strings * lint * remove statement for testing * add playwright test * lint and fix broken test * update to new dehydration API * some fixes from review * try to fix test error * remove unneeded debug line * apply changes from review * add Jest tests * fix typo Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * don't need Object.assign Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --------- Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||
Copyright 2020, 2024 The Matrix.org Foundation C.I.C.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@@ -28,6 +28,7 @@ import InteractiveAuthDialog from "../components/views/dialogs/InteractiveAuthDi
|
||||
import { _t } from "../languageHandler";
|
||||
import { SdkContextClass } from "../contexts/SDKContext";
|
||||
import { asyncSome } from "../utils/arrays";
|
||||
import { initialiseDehydration } from "../utils/device/dehydration";
|
||||
|
||||
export enum Phase {
|
||||
Loading = 0,
|
||||
@@ -111,8 +112,12 @@ export class SetupEncryptionStore extends EventEmitter {
|
||||
const userDevices: Iterable<Device> =
|
||||
(await crypto.getUserDeviceInfo([ownUserId])).get(ownUserId)?.values() ?? [];
|
||||
this.hasDevicesToVerifyAgainst = await asyncSome(userDevices, async (device) => {
|
||||
// ignore the dehydrated device
|
||||
// Ignore dehydrated devices. `dehydratedDevice` is set by the
|
||||
// implementation of MSC2697, whereas MSC3814 proposes that devices
|
||||
// should set a `dehydrated` flag in the device key. We ignore
|
||||
// both types of dehydrated devices.
|
||||
if (dehydratedDevice && device.deviceId == dehydratedDevice?.device_id) return false;
|
||||
if (device.dehydrated) return false;
|
||||
|
||||
// ignore devices without an identity key
|
||||
if (!device.getIdentityKey()) return false;
|
||||
@@ -144,11 +149,17 @@ export class SetupEncryptionStore extends EventEmitter {
|
||||
await new Promise((resolve: (value?: unknown) => void, reject: (reason?: any) => void) => {
|
||||
accessSecretStorage(async (): Promise<void> => {
|
||||
await cli.checkOwnCrossSigningTrust();
|
||||
|
||||
// The remaining tasks (device dehydration and restoring
|
||||
// key backup) may take some time due to processing many
|
||||
// to-device messages in the case of device dehydration, or
|
||||
// having many keys to restore in the case of key backups,
|
||||
// so we allow the dialog to advance before this.
|
||||
resolve();
|
||||
|
||||
await initialiseDehydration();
|
||||
|
||||
if (backupInfo) {
|
||||
// A complete restore can take many minutes for large
|
||||
// accounts / slow servers, so we allow the dialog
|
||||
// to advance before this.
|
||||
await cli.restoreKeyBackupWithSecretStorage(backupInfo);
|
||||
}
|
||||
}).catch(reject);
|
||||
@@ -255,6 +266,9 @@ export class SetupEncryptionStore extends EventEmitter {
|
||||
},
|
||||
setupNewCrossSigning: true,
|
||||
});
|
||||
|
||||
await initialiseDehydration(true);
|
||||
|
||||
this.phase = Phase.Finished;
|
||||
}, true);
|
||||
} catch (e) {
|
||||
|
||||
Reference in New Issue
Block a user