Skip to content

docs: correct the security posture and document per-instance limits - #458

Merged
Bccorb merged 2 commits into
mainfrom
docs/security-posture-accuracy
Oct 20, 2026
Merged

Bccorb merged 2 commits into
mainfrom
docs/security-posture-accuracy

Conversation

@Bccorb

@Bccorb Bccorb commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Closes #434. Each claim below was checked against the code on main (0.19.1).

Security posture (docs/security-posture.md)

Refresh tokens described as signed (docs/production-operations.md)

Key rotation step 3 said to wait refresh_token_ttl so that "no token signed by the outgoing key" is still live. Refresh tokens are opaque and not signed. The wait is access_token_ttl, since access tokens are the longest-lived signed tokens.

Per-instance limits (docs/production-operations.md)

A new section, "Running More Than One Instance". It lists what is shared through Postgres, and what is held per process along with its effect with N instances:

  • the rate limit and slow-down counters (in-memory stores)
  • the five-minute system_config cache (a write clears only the instance that served it)
  • the OAuth state replay cache
  • the audit-degraded health flag

Owner admin grant, made to match src/lib/ownerAdmin.ts

The code grants one role: admin:write if available, else admin. The CLI smoke runs confirm it; the owner's roles were user,betaUser,admin:write.

  • The README said both roles.
  • configuration.md said admin.
  • The code comment said both signup paths prove the address "before the account is created". For email OTP that is not so. /registration/register creates the account with the role first, and an unverified account cannot sign in. All three now say that.

Smaller fixes

  • docs/admin-operations.md: GET /roles is GET /system-config/roles.
  • src/controllers/systemConfig.ts: the public config comment claimed it survives a tainted config. getSystemConfig throws on a config that fails schema validation, so it does not. Comment only, no behaviour change.
  • docs/fido-conformance.md: /conformance/* is deliberately absent from the committed openapi.json and adapter-manifest.json, which are built with the flag unset.
  • CLAUDE.md: the coverage thresholds now read 98/98/95/98, matching vitest.config.
  • ci.yml: dropped the stale sequelize audit comment. npm audit --omit=dev shows no sequelize advisories any more.

Checks

npm run typecheck, npm run lint and npm run format:check pass, and npm run test:run passes 1876 tests (1 todo). CI's audit step will fail until #456 (follow-redirects) merges. That failure is not caused by this PR.

Closes #434. Session lifetime, lockout, the owner grant, key retirement and
the roles route now match the code, and production-operations lists what is
held per process when more than one instance runs.
…ion wording

Fourteen endpoints accept an ephemeral token, register/start has needed an access
session since 0.11.0, the login floor covers the 200 pre-auth answer, refresh_token_ttl
has no server default, only a refresh extends the idle limit, and the lockout duration
is measured as the code measures it.
@Bccorb
Bccorb merged commit e15d1c9 into main Oct 20, 2026
4 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v0.19 Targets the v0.19 release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs: correct the security posture and document per-instance limits

1 participant