Add in-memory cache of secret storage keys
parent
7446bcdedb
commit
7601ce93d9
|
@ -32,6 +32,13 @@ const crossSigningKeys = {};
|
||||||
export const getCrossSigningKey = k => crossSigningKeys[k];
|
export const getCrossSigningKey = k => crossSigningKeys[k];
|
||||||
export const saveCrossSigningKeys = newKeys => Object.assign(crossSigningKeys, newKeys);
|
export const saveCrossSigningKeys = newKeys => Object.assign(crossSigningKeys, newKeys);
|
||||||
|
|
||||||
|
// This stores the secret storage private keys in memory for the JS SDK. This is
|
||||||
|
// only meant to act as a cache to avoid prompting the user multiple times
|
||||||
|
// during the same session. It is considered unsafe to persist this to normal
|
||||||
|
// web storage. For platforms with a secure enclave, we will store this key
|
||||||
|
// there.
|
||||||
|
const secretStorageKeys = {};
|
||||||
|
|
||||||
// XXX: This flow should maybe be reworked to allow retries in case of typos,
|
// XXX: This flow should maybe be reworked to allow retries in case of typos,
|
||||||
// etc.
|
// etc.
|
||||||
export const getSecretStorageKey = async keyInfos => {
|
export const getSecretStorageKey = async keyInfos => {
|
||||||
|
@ -40,6 +47,10 @@ export const getSecretStorageKey = async keyInfos => {
|
||||||
throw new Error("Multiple storage key requests not implemented");
|
throw new Error("Multiple storage key requests not implemented");
|
||||||
}
|
}
|
||||||
const [name, info] = keyInfoEntries[0];
|
const [name, info] = keyInfoEntries[0];
|
||||||
|
// Check the in-memory cache
|
||||||
|
if (secretStorageKeys[name]) {
|
||||||
|
return [name, secretStorageKeys[name]];
|
||||||
|
}
|
||||||
const AccessSecretStorageDialog =
|
const AccessSecretStorageDialog =
|
||||||
sdk.getComponent("dialogs.secretstorage.AccessSecretStorageDialog");
|
sdk.getComponent("dialogs.secretstorage.AccessSecretStorageDialog");
|
||||||
const { finished } = Modal.createTrackedDialog("Access Secret Storage dialog", "",
|
const { finished } = Modal.createTrackedDialog("Access Secret Storage dialog", "",
|
||||||
|
@ -58,5 +69,7 @@ export const getSecretStorageKey = async keyInfos => {
|
||||||
} else {
|
} else {
|
||||||
key = decodeRecoveryKey(input);
|
key = decodeRecoveryKey(input);
|
||||||
}
|
}
|
||||||
|
// Save to cache to avoid future prompts in the current session
|
||||||
|
secretStorageKeys[name] = key;
|
||||||
return [name, key];
|
return [name, key];
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue