Skip to content

fix(acl01): ask for one name, and say it is only a label - #199

Merged
NiKrause merged 2 commits into
acl01from
fix/acl01-name-is-a-label
Aug 17, 2026
Merged

fix(acl01): ask for one name, and say it is only a label#199
NiKrause merged 2 commits into
acl01from
fix/acl01-name-is-a-label

Conversation

@NiKrause

@NiKrause NiKrause commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Ready. The provider release this waited on has landed: orbitdb-identity-provider-webauthn-did#46 merged 2026-08-16 20:04 UTC and shipped as 0.5.1 at 21:17 UTC. This branch was still pinning 0.5.0 — the version without the fix — so acl01 has been merged in and the pin is now 0.5.1 in both package.json and the lockfile.

Verified locally against 0.5.1, running every suite this PR touches, not just the one the chapter workflow runs: passkey-identity 1 passed, acl-permissions 2 passed, list-registry 4 passed, private-list-visibility 4 passed.

Merges after #198 (the same change for passkey01).

Mirrors #198 into this chapter. The onboarding form asked for a user id (e.g. alice@example.com) and a separate display name. Both are labels — WebAuthn's user.name and displayName exist so the passkey picker has something to show — but the first read like an identifier, and until now it was one: the provider derived the WebAuthn user handle from it, and an authenticator keeps one credential per (origin, handle). Two people typing the same name on one device replaced each other's passkey.

It costs more here than in passkey01. A private list is gated on the owner's DID, so a replaced passkey did not merely lose an identity — it locked the list that identity had created, with no way back in.

What changes

  • One field (data-testid="passkey-label") instead of two, with a hint that says what it is.
  • No e-mail in the placeholder. user.name is still stored in the authenticator and shown in the picker.
  • "Create a passkey" says what a second press does when a passkey already exists: it adds an identity rather than quietly replacing one.
  • README gains a short section on why the name is only a label.
  • The three ACL suites (acl-permissions, list-registry, private-list-visibility) drop the ${runId}@example.com labels they used to keep identities apart. Two passkeys are two identities whatever they are called.

Verification

Build succeeds, 45 unit tests pass. All four suites this PR touches run and pass locally against the released 0.5.1: passkey-identity (1), acl-permissions (2), list-registry (4), private-list-visibility (4). The files prettier still flags (README.md, +page.svelte, passkey-identity.spec.js) were already unformatted on acl01 before this change.

Mirrors the passkey01 change. The onboarding form asked for a "user id
(e.g. alice@example.com)" and a separate display name. Both are labels —
WebAuthn's `user.name` and `displayName` exist so the passkey picker has
something to show — but the first read like an identifier, and until
recently it was one: the identity provider derived the WebAuthn user handle
from it, and an authenticator keeps one credential per (origin, handle). Two
people typing the same name on one device replaced each other's passkey, DID
and all.

The provider now generates a random handle
(Le-Space/orbitdb-identity-provider-webauthn-did#45), so the text is finally
just a label. One field, a hint that says so, and no more e-mail address in
the placeholder — `user.name` is still stored in the authenticator and shown
in the picker, so a personal address stays a poor default even though it is
no longer destructive.

It matters more in this chapter than in passkey01: a private list is gated on
the owner's DID, so a replaced passkey did not merely lose an identity, it
locked the list it had created.

The three ACL suites drop the `${runId}@example.com` labels they used to keep
identities apart. Two passkeys are two identities whatever they are called,
and the specs now say so.

Verified: build succeeds, 45 unit tests pass. E2E needs the virtual
authenticator and the released provider, so it was not run locally. The
files prettier still flags (README, +page.svelte, passkey-identity.spec.js)
were already unformatted on acl01 before this change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
NiKrause added a commit that referenced this pull request Aug 16, 2026
A patch release, and nothing in it forces a coordinated move: credentials
registered under 0.5.0 keep working and the derived did:key is unchanged.

What it brings this chapter is the random WebAuthn user handle
(Le-Space/orbitdb-identity-provider-webauthn-did#45). Until now the handle
was the UTF-8 of the typed user id, and an authenticator keeps one credential
per (origin, handle) — so two people registering under the same name on one
device destroyed each other's passkey. It costs more here than in passkey01:
a private list is gated on the owner's DID, so the replaced passkey did not
merely lose an identity, it locked the list that identity had created. The
onboarding change (#199) can land once this is in.

Also in 0.5.1: largeBlob keystores actually persist their secret key, and the
credential now carries the authenticator's own answer on extension support
rather than the browser's guess.

Bumped in all three tracked places plus the untracked pnpm-workspace.yaml,
which is what a local pnpm 10/11 run actually reads. Lockfile generated with
pnpm 11.15.1 — pnpm 10 re-resolves floating ranges across babel, metro and
eslint and turns a one-package bump into hundreds of lines.

Verified: build succeeds, 45 unit tests pass, the installed provider resolves
to 0.5.1.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@NiKrause
NiKrause marked this pull request as ready for review August 17, 2026 11:32
@NiKrause
NiKrause merged commit dc1e43a into acl01 Aug 17, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant