From a6caf946c960c159be740f0039e0d836bf4bb85b Mon Sep 17 00:00:00 2001 From: Rene Hollander Date: Sat, 23 Oct 2021 15:09:51 +0200 Subject: [PATCH] Retry loading of the pickle key if the user is logged in. If the Keyring is unavailable or not unlocked Element would start without being able to decrypt messages. This fix will ensure Element doesn't start unless it was able to retrieve the encryption key. Unlocking the Keyring at a later time would not result in the messages being decrypted. The app would need to be restarted to achieve this. This fixes https://github.com/vector-im/element-web/issues/17845 --- src/Lifecycle.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/Lifecycle.ts b/src/Lifecycle.ts index d351c46180a..1de2adb16ff 100644 --- a/src/Lifecycle.ts +++ b/src/Lifecycle.ts @@ -418,17 +418,21 @@ export async function restoreFromLocalStorage(opts?: { ignoreGuest?: boolean }): } let decryptedAccessToken = accessToken; - const pickleKey = await PlatformPeg.get().getPickleKey(userId, deviceId); - if (pickleKey) { - logger.log("Got pickle key"); - if (typeof accessToken !== "string") { - const encrKey = await pickleKeyToAesKey(pickleKey); - decryptedAccessToken = await decryptAES(accessToken, encrKey, "access_token"); - encrKey.fill(0); + let pickleKey = null; + do { + pickleKey = await PlatformPeg.get().getPickleKey(userId, deviceId); + if (pickleKey) { + logger.log("Got pickle key"); + if (typeof accessToken !== "string") { + const encrKey = await pickleKeyToAesKey(pickleKey); + decryptedAccessToken = await decryptAES(accessToken, encrKey, "access_token"); + encrKey.fill(0); + } + } else { + logger.log("No pickle key available. Waiting 1s and trying to read it again. (Hint: Is your Keyring unlocked?)"); + await new Promise(r => setTimeout(r, 1000)); } - } else { - logger.log("No pickle key available"); - } + } while(pickleKey == null); const freshLogin = sessionStorage.getItem("mx_fresh_login") === "true"; sessionStorage.removeItem("mx_fresh_login");