Skip to content

docs(f3): a lockout anybody can cause needs a way out that is not waiting - #111

Merged
lessevv merged 1 commit into
mainfrom
spec/a-recovery-code-clears-the-sign-in-meter
Sep 13, 2026
Merged

lessevv merged 1 commit into
mainfrom
spec/a-recovery-code-clears-the-sign-in-meter

Conversation

@lessevv

@lessevv lessevv commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

What

Adds F3-R42: a valid recovery code presented at sign-in clears that username's sign-in meter and is consumed doing so.

Why

F3-R38 counts the sign-in limiter on the username as typed, which is exactly what keeps an unknown name metered like a known one — and is also what lets anybody who can reach the sign-in screen spend somebody else's meter. Five wrong passwords against a name read off an envelope and the household is held off its own ledger.

The correct password is not the way out, and must not become one. The meter is read before the credential on purpose, so that a right password and a wrong one cost the same under it; reordering the two would answer in timing the question the constant message and the equalised hash (F3-R13, F3-R34) refuse to answer in words. So the order stands and a second credential opens the meter instead — the one a stranger does not hold.

What F3-R42 pins

  • The code clears the meter and is consumed doing it.
  • The F3-R38 check order does not change: the escape is judged on the code alone, never by checking the password first.
  • The attempt is audited as a recovery attempt (F3-R12) and answers the constant mismatch message (F3-R13).
  • It is counted on the recovery sheet's own limiter — not a second allowance over the same ten secrets.
  • It does not end the session at a cap the way F3-R19 does. There is no session to end: a guesser at a settings panel is already holding an unlocked one; a guesser at the sign-in screen holds nothing, so further attempts are all there is to withhold.
  • Whatever the screen shows about the escape is shown for a throttled unknown username exactly as for a throttled known one. The refusal is decided before any account is looked up, so nothing that draws the escape has asked whether the account exists.

Also

  • Two edge-case rows: a recovery code after a run of wrong passwords, and a stranger spending somebody else's meter.
  • The behaviour section carries the reasoning above.

python3 scripts/integrity.py, scripts/manifest_check.py, typos and markdownlint-cli2 are clean.

…ting

The sign-in meter is counted on the username as typed, which is what keeps an
unknown name metered exactly like a known one -- and is also what lets anybody
who can reach the screen spend somebody else's. The correct password cannot
clear it: the meter is read before the credential on purpose, so that a right
password and a wrong one cost the same under it.

F3-R42 opens the meter with the credential a stranger does not hold. A recovery
code presented at sign-in clears that username's meter and is consumed doing
it, audited as any recovery attempt is, answering the same constant mismatch
message, and counted on the recovery sheet's own limiter rather than given a
second allowance over the same ten secrets. The escape is shown on the refusal
itself, which is decided before any account is looked up, so it is offered for
a username nobody has exactly as for one somebody does.

It does not end the session at a cap the way F3-R19 does. There is no session
to end: a guesser at a settings panel is already holding an unlocked one, and a
guesser at the sign-in screen holds nothing.

Signed-off-by: Wessel Verheij <info@nightworks.io>
@sonarqubecloud

Copy link
Copy Markdown

@github-actions github-actions Bot added documentation Docs only functional awaiting-maintainer Green PR with no review — a maintainer needs to act labels Sep 13, 2026
@lessevv
lessevv merged commit b3ede5b into main Sep 13, 2026
13 checks passed
@github-actions github-actions Bot added awaiting-maintainer Green PR with no review — a maintainer needs to act and removed awaiting-maintainer Green PR with no review — a maintainer needs to act labels Sep 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-maintainer Green PR with no review — a maintainer needs to act documentation Docs only functional

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant