Skip to content

fix: reject corrupt stored credentials in the hosted service - #1193

Merged
rowkav09 merged 1 commit into
mainfrom
fix/redis-corrupt-v3
Oct 13, 2026
Merged

rowkav09 merged 1 commit into
mainfrom
fix/redis-corrupt-v3

Conversation

@rowkav09

Copy link
Copy Markdown
Member

The hosted service's authenticate, GitHub sign-in, legacy-token alias path and card presence reader each parsed their Redis value with a bare JSON.parse. One corrupt entry (a bad manual edit, an interrupted write during failover) crashed every request that touched it with a 500 until the key was cleared by hand.

  • Token entries must match one of the two shapes this service writes (legacy { cardId, deviceId } or signed-in { userId, deviceId }). Anything else is rejected with 401 and can no longer steer ingest's state keys (np:state:undefined and friends).
  • An unreadable or malformed user record fails sign-in with 409 account_needs_repair. The record and the old public handle mapping are left untouched for manual repair, with no auto-repair and no old-mapping cleanup. Sign-in rate counters still count the attempt.
  • An unreadable card state renders the idle card.
  • An unreadable legacy token is skipped instead of aliased.

11 regression tests cover each entry point. They fail without the change and pass with it; the full suite passes 2149 tests with 0 failures and 23 skipped on a clean tree, and the syntax check is clean. They use an in-memory Redis stand-in, not a live Redis.

authenticate, GitHub sign-in, the legacy-token alias path and the card
presence reader each parsed their Redis value with a bare JSON.parse.
One corrupt entry (a bad manual edit, an interrupted write during
failover) crashed every request that touched it with a 500 until the
key was cleared by hand.

- token entries must match one of the two shapes this service writes
  (legacy { cardId, deviceId } or signed-in { userId, deviceId });
  anything else rejects 401 and can no longer steer ingest's state
  keys (np:state:undefined and friends)
- an unreadable or malformed user record fails sign-in with 409
  account_needs_repair; the record and the old public handle mapping
  are left untouched for manual repair, with no auto-repair and no
  old-mapping cleanup. Sign-in rate counters still count the attempt.
- an unreadable card state renders the idle card
- an unreadable legacy token is skipped instead of aliased

11 regression tests cover each entry point.
@codecov

codecov Bot commented Oct 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

@rowkav09
rowkav09 merged commit c27ab8c into main Oct 13, 2026
20 checks passed
@github-project-automation github-project-automation Bot moved this from Backlog to Done in nowplaying Oct 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant