aboutsummaryrefslogtreecommitdiffstats
path: root/src/features
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-11-06 23:37:49 -0700
committerAdam Soltys <[email protected]>2026-11-06 23:37:49 -0700
commit5e315005b72a8e9e6670f10b1d30b532763f7fe6 (patch)
tree26682df4d55dee9269d25bb03c5fe395b50de3a8 /src/features
parent5eb89590b4b7beb681bd619337e58a69fac4b621 (diff)
downloadcoinosv3-5e315005b72a8e9e6670f10b1d30b532763f7fe6.tar.gz
coinosv3-5e315005b72a8e9e6670f10b1d30b532763f7fe6.zip
Passkeys in the WebView builds: the apps name v3.coinos.io too, and a failed passkey sign-in no longer goes on to make a new one. Coinos Beta's passkey sign-in failed after the account was picked — "CredMan getCredential call failed … RP ID cannot be validated" (Pixel 9, 2026-11-06). An app's association with a site runs both ways: the site's assetlinks.json names the app (it did), and the app's manifest names the site through asset_statements meta-data — which the TWA has and the webview/fcm manifests didn't. They declare it now, and the shared asset_statements string carries get_login_creds beside handle_all_urls. And passkeyLogin rolled any sign-in failure into creating a passkey, so the validation error was followed by a second, failed create dialog: only NotAllowedError (how browsers report "no passkey here", or a dismissed sheet) leads to creating one now; any other error is shown
Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01VMan6Ts5Tktega8VbLg31q
Diffstat (limited to 'src/features')
-rw-r--r--src/features/nostrlogin.js5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/features/nostrlogin.js b/src/features/nostrlogin.js
index 1c227c3..a4cfa24 100644
--- a/src/features/nostrlogin.js
+++ b/src/features/nostrlogin.js
@@ -364,6 +364,11 @@ export function nostrLoginFeature(ctx) {
await run(() => keySigner(sk));
} catch (e) {
if (/derive a wallet key/.test(e.message) || e.message === pass.LOCK_PASSKEY) { ui.nostrLoginError = e.message; render(); return; }
+ // Only "no passkey here" (NotAllowedError, as browsers report it) rolls
+ // into creating one; anything else is a failure to show, not a reason
+ // to make a second passkey (the Beta's "RP ID cannot be validated" went
+ // on to fail a create too, 2026-11-06).
+ if (e && e.name && e.name !== 'NotAllowedError') { ui.nostrLoginError = e.message || String(e); render(); return; }
try {
const sk = await pass.passkeyCreate();
await run(() => keySigner(sk));