feature/security-recovery-support #16

Merged
patillacode merged 23 commits from feature/security-recovery-support into main 2026-04-28 16:23:04 +02:00
Owner

Adding recovery codes, forgot-password, legal pages, landing polish

Summary

  • Recovery codes: users can generate one-time recovery codes at signup and regenerate them from the security
    settings tab; codes are hashed at rest, rate-limited, and CSRF-protected
  • Forgot-password flow: self-service password reset via recovery code (no email required); invalidates all
    existing sessions on success
  • Legal pages: Privacy Policy (/privacy) and Terms of Service (/terms) with bot-proof email obfuscation;
    linked from footer and signup consent line
  • Admin cleanup: removed password reset from the admin panel (users now own their own recovery path); removed
    the associated hidden form and route
  • Landing page redesign: free-forever pricing block, feature sections styled as cards, auth-aware hero CTAs,
    Ko-fi support button, footer with Privacy/Terms links
  • Auth page polish: login, signup, forgot-password, and signup-closed pages get the logo + wordmark header,
    consistent accent-colored links, and i18n coverage
  • i18n: full Spanish/English coverage for all new strings (recovery, auth, legal, landing pricing)
  • CSS cleanup: extracted inline styles to static files, fixed .btn-danger sizing regression, added
    .card-brand, .login__subtitle, .legal-* component classes
Adding recovery codes, forgot-password, legal pages, landing polish **Summary** - **Recovery codes**: users can generate one-time recovery codes at signup and regenerate them from the security settings tab; codes are hashed at rest, rate-limited, and CSRF-protected - **Forgot-password flow**: self-service password reset via recovery code (no email required); invalidates all existing sessions on success - **Legal pages**: Privacy Policy (/privacy) and Terms of Service (/terms) with bot-proof email obfuscation; linked from footer and signup consent line - **Admin cleanup**: removed password reset from the admin panel (users now own their own recovery path); removed the associated hidden form and route - **Landing page redesign**: free-forever pricing block, feature sections styled as cards, auth-aware hero CTAs, Ko-fi support button, footer with Privacy/Terms links - **Auth page polish**: login, signup, forgot-password, and signup-closed pages get the logo + wordmark header, consistent accent-colored links, and i18n coverage - **i18n**: full Spanish/English coverage for all new strings (recovery, auth, legal, landing pricing) - **CSS cleanup**: extracted inline styles to static files, fixed `.btn-danger` sizing regression, added `.card-brand`, `.login__subtitle`, `.legal-*` component classes
- GET/POST /forgot-password: reset password via recovery code (rate-limited, login-CSRF protected)
- GET/POST /signup: self-registration, generates 12 recovery codes on success
- GET /account/recovery-codes: shows codes once via signed flash cookie, then clears them
- POST /account/recovery-codes/regenerate: regenerates codes after password verification
- GET /account: adds recovery_remaining count to security tab context
- app/recovery_flash.py: signed cookie helper for one-time code display
- Stub templates for signup, forgot_password, recovery_codes
- 17 new route tests, all 177 passing
Complete recovery_codes.html (one-time display + revisit views), security.html (password + recovery section), forgot_password.html, signup.html (with confirm-password validation), and add forgot-password link to login.html.
polish: verify CSRF/rate-limiting on recovery routes, add i18n strings
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m31s
Test and publish Docker image / e2e (pull_request) Failing after 2m10s
Test and publish Docker image / build (pull_request) Has been skipped
737d57e4e3
merge origin/main into feature/security-recovery-support
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m29s
Test and publish Docker image / e2e (pull_request) Failing after 4m8s
Test and publish Docker image / build (pull_request) Has been skipped
afaaf91dcf
wip
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m33s
Test and publish Docker image / e2e (pull_request) Failing after 3m57s
Test and publish Docker image / build (pull_request) Has been skipped
d8abe284df
wip
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m34s
Test and publish Docker image / build (pull_request) Waiting to run
Test and publish Docker image / e2e (pull_request) Has been cancelled
2cd97a9569
wip
Some checks failed
Test and publish Docker image / e2e (pull_request) Blocked by required conditions
Test and publish Docker image / build (pull_request) Blocked by required conditions
Test and publish Docker image / test (pull_request) Has been cancelled
e9853e5a22
wip
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m33s
Test and publish Docker image / build (pull_request) Waiting to run
Test and publish Docker image / e2e (pull_request) Has been cancelled
6dd561051d
wip
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m35s
Test and publish Docker image / e2e (pull_request) Failing after 4m17s
Test and publish Docker image / build (pull_request) Has been skipped
8702542233
wip
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m33s
Test and publish Docker image / e2e (pull_request) Failing after 4m20s
Test and publish Docker image / build (pull_request) Has been skipped
0a5af91cb6
wip
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m41s
Test and publish Docker image / e2e (pull_request) Failing after 4m1s
Test and publish Docker image / build (pull_request) Has been skipped
fcc5c4c32a
wip
Some checks failed
Test and publish Docker image / test (pull_request) Successful in 1m41s
Test and publish Docker image / e2e (pull_request) Failing after 3m49s
Test and publish Docker image / build (pull_request) Has been skipped
afe5f9ab63
wip
All checks were successful
Test and publish Docker image / test (pull_request) Successful in 1m40s
Test and publish Docker image / e2e (pull_request) Successful in 3m34s
Test and publish Docker image / build (pull_request) Has been skipped
e2c56289d7
patillacode deleted branch feature/security-recovery-support 2026-04-28 16:23:04 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
patillacode/piruetas!16
No description provided.