Luca
b0912c7427
feat(setup): validate setup token at step 1 before advancing
...
Previously "Continue" on the token step only checked the field was
non-empty; a wrong token wasn't caught until the final submit, after the
user had filled in email + password. Add a non-burning verify:
- backend: POST /setup/verify-token constant-time compares the token
without consuming it (createInitialAdmin still claims it atomically on
submit), gated on no-admin-exists and rate-limited like /setup/admin.
- frontend: step-1 "Continue" calls verifyToken and only advances on a
valid token; a wrong token shows the invalidToken error on the field,
429 -> too-many-attempts, 409 -> redirect to login.
Adds integration tests for accept-without-burn / reject / closed-once-set.
2026-07-02 15:18:22 +02:00
..
2026-05-29 16:21:15 +02:00
2026-05-09 20:56:20 +02:00
2026-06-23 18:11:58 +02:00
2026-06-27 00:49:35 +02:00
2026-06-01 00:31:08 +02:00
2026-05-27 14:04:15 +02:00
2026-05-27 15:18:29 +02:00
2026-06-01 21:52:38 +02:00
2026-06-18 15:10:44 +02:00
2026-05-31 21:35:48 +02:00
2026-06-24 11:26:02 +02:00
2026-06-18 22:18:54 +02:00
2026-06-17 23:04:30 +02:00
2026-05-29 22:20:32 +02:00
2026-05-29 13:00:18 +02:00
2026-04-28 10:52:49 +02:00
2026-06-01 00:31:08 +02:00
2026-06-02 13:00:13 +02:00
2025-11-28 17:53:56 +01:00
2026-05-26 18:18:51 +02:00
2026-05-26 18:18:15 +02:00
2026-06-26 23:48:12 +02:00
2026-06-23 12:37:50 +02:00
2026-06-29 20:20:13 +02:00
2026-06-18 18:40:22 +02:00
2026-05-30 03:35:08 +02:00
2026-05-26 18:18:51 +02:00
2026-05-14 23:11:00 +02:00
2026-05-14 23:11:00 +02:00
2026-06-16 18:36:35 +02:00
2026-06-25 19:50:08 +02:00
2026-06-29 20:20:13 +02:00
2026-06-29 19:39:40 +02:00
2026-05-26 18:18:15 +02:00
2026-01-02 09:56:19 +01:00
2026-06-23 14:58:48 +02:00
2026-06-24 13:52:42 +02:00
2026-06-11 00:04:16 +02:00
2026-06-18 18:40:11 +02:00
2026-06-23 23:35:56 +02:00
2026-06-11 00:04:16 +02:00
2026-06-22 22:02:13 +02:00
2026-05-11 09:58:08 +02:00
2026-05-04 22:27:52 +02:00
2026-06-30 16:03:49 +02:00
2026-06-30 16:30:13 +02:00
2026-04-11 07:48:23 +02:00
2026-05-14 22:30:39 +02:00
2026-06-28 14:30:26 +02:00
2026-06-28 22:17:07 +02:00
2026-06-16 18:21:02 +02:00
2026-06-28 15:53:44 +02:00
2026-06-28 15:53:44 +02:00
2026-05-26 18:18:51 +02:00
2026-06-17 22:25:12 +02:00
2026-05-02 22:56:04 +02:00
2026-04-28 10:06:36 +02:00
2026-04-28 10:06:36 +02:00
2026-01-17 14:01:29 +01:00
2026-06-13 13:12:58 +02:00
2026-05-05 16:04:43 +02:00
2026-06-28 22:17:07 +02:00
2026-06-16 18:33:47 +02:00
2026-03-22 12:40:01 +01:00
2026-03-22 12:40:01 +01:00
2026-06-01 22:56:02 +02:00
2026-02-06 23:26:01 +01:00
2026-05-11 09:58:08 +02:00
2026-01-12 13:20:39 +01:00
2026-01-02 10:16:55 +01:00
2026-07-02 15:18:22 +02:00
2026-04-08 11:42:38 +02:00
2026-06-18 18:40:22 +02:00
2026-06-29 20:20:13 +02:00
2026-06-29 20:20:13 +02:00
2026-03-01 14:36:34 +01:00
2026-05-29 22:49:01 +02:00
2026-05-04 09:04:38 +02:00
2026-04-28 10:06:36 +02:00
2026-04-28 10:06:36 +02:00
2026-04-28 10:07:39 +02:00
2026-06-25 18:44:27 +02:00
2026-06-21 20:51:20 +02:00
2026-06-18 22:57:22 +02:00
2025-11-19 21:59:27 +00:00
2026-01-21 16:47:13 +01:00