diff options
| author | Adam Soltys <[email protected]> | 2026-10-10 22:01:32 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-10-10 22:01:32 -0700 |
| commit | 8b6d2837716aeb04bedbfdd9c00ab9071be63f90 (patch) | |
| tree | 49bd78e742929b85120b66f5813f5844437477b1 /src/features | |
| parent | e253cbd16d502cd382a6f7632d2851db4ae1a6ae (diff) | |
| download | coinosv3-8b6d2837716aeb04bedbfdd9c00ab9071be63f90.tar.gz coinosv3-8b6d2837716aeb04bedbfdd9c00ab9071be63f90.zip | |
Lock with fingerprint or face. The padlock's "Protect this device?" now offers a passkey instead of a password, and Settings → Security can turn it on or off. The saved-wallets vault is sealed under a secret only that passkey's PRF produces (behind the phone's fingerprint/face check, the passkey kept by the platform's secure hardware or password manager), so nothing in this browser's storage opens it. Opening the app on a locked device asks for the passkey by itself; a cancel leaves an Unlock button. The prompts that need the vault opened (save, forget, lock a stray wallet) take the passkey too; there's no Change password for a vault that has none; the recovery words remain the way back. The lock passkey has its own PRF salt and a marked user handle, not discoverable where the platform allows — passkey sign-in refuses it rather than derive a stranger's key from it. English + Italian strings. tools/passkey-lock-test.js (Chrome's virtual authenticator with PRF).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Vps2H27rhbG9ZqseGfMrc3
Diffstat (limited to 'src/features')
| -rw-r--r-- | src/features/nostrlogin.js | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/features/nostrlogin.js b/src/features/nostrlogin.js index 4f1f0de..f18b075 100644 --- a/src/features/nostrlogin.js +++ b/src/features/nostrlogin.js @@ -357,7 +357,7 @@ export function nostrLoginFeature(ctx) { const sk = await pass.passkeySignIn(); await run(() => keySigner(sk)); } catch (e) { - if (/derive a wallet key/.test(e.message)) { ui.nostrLoginError = e.message; render(); return; } + if (/derive a wallet key/.test(e.message) || e.message === pass.LOCK_PASSKEY) { ui.nostrLoginError = e.message; render(); return; } try { const sk = await pass.passkeyCreate(); await run(() => keySigner(sk)); |
