BillTracker/routes
null 3c82c30f3c fix(auth): handle requires_webauthn in POST /login — was a 500 self-lockout
authService.login returns a requires_webauthn payload for webauthn-enabled
users, but the login route only handled requires_totp and fell through to
result.user.id (undefined) -> TypeError -> 500 on every attempt. Any user who
enabled WebAuthn via the API (reachable today) was permanently locked out.

- routes/auth.cts: return the two-step requires_webauthn payload (mirrors TOTP)
- services/authService.cts: stale-flag guard — webauthn_enabled with no usable
  credentials falls through to password login instead of hard-failing
- tests/authLoginWebauthnRoute.test.js: pins both paths + wrong-password 401

(QA-B1-01, lockout part)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 16:29:08 -05:00
..
about.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
aboutAdmin.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
admin.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
analytics.cts refactor(routes): analytics + tracker → throw pattern (batch 1) 2026-07-06 14:59:29 -05:00
auth.cts fix(auth): handle requires_webauthn in POST /login — was a 500 self-lockout 2026-07-10 16:29:08 -05:00
authOidc.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
bills.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
calendar.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
calendarFeed.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
categories.cts refactor(categories): adopt Kysely for the /groups query (real production use) 2026-07-06 16:25:30 -05:00
dataSources.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
export.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
import.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
matches.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
monthly-starting-amounts.cts refactor(routes): monthly-starting-amounts → throw pattern; doc exemplar 2026-07-06 15:03:52 -05:00
notifications.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
payments.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
privacy.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
profile.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
settings.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
snowball.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
spending.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
status.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
subscriptions.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
summary.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
tracker.cts refactor(routes): analytics + tracker → throw pattern (batch 1) 2026-07-06 14:59:29 -05:00
transactions.cts feat(logging): redacted, level-gated logger; migrate all server console.* (Pillar D) 2026-07-06 16:05:18 -05:00
user.cts style: apply Prettier across client + server (no behavior change) 2026-07-06 14:23:53 -05:00
version.cts refactor(routes): version → throw pattern; keep graceful update-status fallback 2026-07-06 15:01:35 -05:00