diff --git a/src/lib/views/Settings.svelte b/src/lib/views/Settings.svelte index 6caa53e..5707307 100644 --- a/src/lib/views/Settings.svelte +++ b/src/lib/views/Settings.svelte @@ -63,6 +63,58 @@ let showConsent = $state(false); let testResult = $state<{ ok: boolean; message: string } | null>(null); + // ---- At-rest encryption vault (T8.8, FR-SEC-3) ---- + let vault = $state<{ enabled: boolean; unlocked: boolean } | null>(null); + let vaultPw = $state(""); + let vaultPw2 = $state(""); + let vaultMsg = $state(null); + async function loadVault() { + try { + vault = await api.vaultStatus(); + } catch { + vault = null; + } + } + onMount(loadVault); + async function enableVault() { + vaultMsg = null; + try { + await api.enableVault(vaultPw); + vaultPw = ""; + vaultMsg = "Vault enabled and unlocked."; + await loadVault(); + } catch (e) { + vaultMsg = `${e}`; + } + } + async function unlockVault() { + vaultMsg = null; + try { + await api.unlockVault(vaultPw); + vaultPw = ""; + vaultMsg = "Unlocked."; + await loadVault(); + } catch (e) { + vaultMsg = `${e}`; + } + } + async function lockVault() { + await api.lockVault(); + vaultMsg = "Locked."; + await loadVault(); + } + async function changeVaultPassword() { + vaultMsg = null; + try { + await api.changeVaultPassword(vaultPw, vaultPw2); + vaultPw = ""; + vaultPw2 = ""; + vaultMsg = "Password changed."; + } catch (e) { + vaultMsg = `${e}`; + } + } + // ---- NPU package download (T3.4) ---- let npuBusy = $state(false); let npuMsg = $state(null); @@ -612,6 +664,56 @@ {:else}

Privacy self-check unavailable.

{/if} + + {#if vault} +

Encryption vault

+ {#if !vault.enabled} +

+ Encrypt notes, transcripts, and summaries at rest with a password. (Audio files are + not encrypted yet.) +

+
+ +
+ +

+ Use at least 8 characters. If you forget it, encrypted content can't be recovered. +

+ {:else if !vault.unlocked} +

+ Vault is locked. Unlock to read encrypted meetings. +

+
+ +
+ + {:else} +

+ Vault is unlocked. New notes, transcripts, and summaries are + encrypted at rest. +

+ +
+ Change password +
+ + +
+ +
+ {/if} + {#if vaultMsg}

{vaultMsg}

{/if} + {/if} {/if}