From 86994c4c4626a1fa3e6b45cde9c137e2e48bf460 Mon Sep 17 00:00:00 2001 From: Riccardo Balbo Date: Wed, 16 Oct 2024 17:11:45 +0200 Subject: [PATCH] use openConfig instead of useConfig --- components/use-vault.js | 97 ++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/components/use-vault.js b/components/use-vault.js index 9211e7cf..1cd3b5c1 100644 --- a/components/use-vault.js +++ b/components/use-vault.js @@ -4,7 +4,7 @@ import { useMutation, useApolloClient } from '@apollo/client' import { SET_ENTRY, UNSET_ENTRY, GET_ENTRY, CLEAR_VAULT, SET_VAULT_KEY_HASH } from '@/fragments/vault' import { E_VAULT_KEY_EXISTS } from '@/lib/error' import { useToast } from '@/components/toast' -import useLocalStorage, { openLocalStorage, listLocalStorages } from '@/components/use-local-storage' +import { openLocalStorage, listLocalStorages } from '@/components/use-local-storage' import { toHex, fromHex } from '@/lib/hex' import createTaskQueue from '@/lib/task-queue' @@ -17,61 +17,84 @@ export function useVaultConfigurator () { const [setVaultKeyHash] = useMutation(SET_VAULT_KEY_HASH) const [vaultKey, innerSetVaultKey] = useState(null) - const [config, configError] = useConfig() const [vaultKeyHash, setVaultKeyHashLocal] = useState(null) useEffect(() => { if (!me) return - if (configError) { - toaster.danger('error loading vault configuration ' + configError.message) - return - } (async () => { - let localVaultKey = await config.get('key') - const keyHash = me?.privates?.vaultKeyHash || vaultKeyHash - if ((!keyHash && localVaultKey?.hash) || (localVaultKey?.hash !== keyHash)) { - // If the hash stored in the server does not match the hash of the local key, - // we can tell that the key is outdated (reset by another device or other reasons) - // in this case we clear the local key and let the user re-enter the passphrase - console.log('vault key hash mismatch, clearing local key', localVaultKey?.hash, '!=', keyHash) - localVaultKey = null - await config.unset('key') + const config = await openConfig(me.id) + try { + let localVaultKey = await config.get('key') + const keyHash = me?.privates?.vaultKeyHash || vaultKeyHash + if ((!keyHash && localVaultKey?.hash) || (localVaultKey?.hash && keyHash && localVaultKey?.hash !== keyHash)) { + // If the hash stored in the server does not match the hash of the local key, + // we can tell that the key is outdated (reset by another device or other reasons) + // in this case we clear the local key and let the user re-enter the passphrase + console.log('vault key hash mismatch, clearing local key', localVaultKey?.hash, '!=', keyHash) + localVaultKey = null + await config.unset('key') + } + innerSetVaultKey(localVaultKey) + } catch (e) { + toaster.danger('error loading vault configuration ' + e.message) + } finally { + await config.close() } - innerSetVaultKey(localVaultKey) })() - }, [me?.privates?.vaultKeyHash, config, configError]) + }, [me?.privates?.vaultKeyHash]) // clear vault: remove everything and reset the key const [clearVault] = useMutation(CLEAR_VAULT, { onCompleted: async () => { - await config.unset('key') - innerSetVaultKey(null) + const config = await openConfig(me.id) + try { + await config.unset('key') + innerSetVaultKey(null) + } catch (e) { + toaster.danger('error clearing vault ' + e.message) + } finally { + await config.close() + } } }) // initialize the vault and set a vault key const setVaultKey = useCallback(async (passphrase) => { - const vaultKey = await deriveKey(me.id, passphrase) - await setVaultKeyHash({ - variables: { hash: vaultKey.hash }, - onError: (error) => { - const errorCode = error.graphQLErrors[0]?.extensions?.code - if (errorCode === E_VAULT_KEY_EXISTS) { - throw new Error('wrong passphrase') + const config = await openConfig(me.id) + try { + const vaultKey = await deriveKey(me.id, passphrase) + await setVaultKeyHash({ + variables: { hash: vaultKey.hash }, + onError: (error) => { + const errorCode = error.graphQLErrors[0]?.extensions?.code + if (errorCode === E_VAULT_KEY_EXISTS) { + throw new Error('wrong passphrase') + } + toaster.danger(error.graphQLErrors[0].message) } - toaster.danger(error.graphQLErrors[0].message) - } - }) - innerSetVaultKey(vaultKey) - setVaultKeyHashLocal(vaultKey.hash) - await config.set('key', vaultKey) + }) + innerSetVaultKey(vaultKey) + setVaultKeyHashLocal(vaultKey.hash) + await config.set('key', vaultKey) + } catch (e) { + toaster.danger('error setting vault key ' + e.message) + } finally { + await config.close() + } }, [setVaultKeyHash]) // disconnect the user from the vault (will not clear or reset the passphrase, use clearVault for that) const disconnectVault = useCallback(async () => { - await config.unset('key') - innerSetVaultKey(null) - }, [innerSetVaultKey, config]) + const config = await openConfig(me.id) + try { + await config.unset('key') + innerSetVaultKey(null) + } catch (e) { + toaster.danger('error disconnecting vault ' + e.message) + } finally { + await config.close() + } + }, [innerSetVaultKey]) return [vaultKey, setVaultKey, clearVault, disconnectVault] } @@ -332,10 +355,6 @@ export function openVault (apollo, user, owner) { return { get: getValue, set: setValue, clear: clearValue, close } } -function useConfig () { - return useLocalStorage({ database: 'vault-config', namespace: ['settings'], supportLegacy: false }) -} - async function openConfig (userId) { return await openLocalStorage({ userId, database: 'vault-config', namespace: ['settings'] }) }