CluPilotCloud/app
Claude 492b1925fb
tests / pest (push) Successful in 7m42s Details
tests / assets (push) Successful in 21s Details
tests / release (push) Successful in 6s Details
Land a sign-in where it was performed, not always in the customer portal
Fortify sends every successful sign-in to config('fortify.home') — /dashboard.
That is why an operator signing in ended up in the customer portal, and once
the console has a hostname to itself it stops being merely confusing:
/dashboard does not exist on that host, so signing in would land on a 404.

Three outcomes now, decided by where the sign-in happened and who signed in:
the console for an operator on the console, the portal everywhere else, and for
a non-operator on the console the session is taken away again at the moment it
was created — a guard that merely refuses each page afterwards leaves that
session in the browser.

Four things the review caught, each of which would have left a hole:

- Fortify never reaches LoginResponse when a two-factor challenge was involved.
  Binding only that one left exactly the accounts most likely to be operators
  on the old behaviour, so both exits are bound and share one decision.
- The JSON branch ran before the authorization check, so a JSON client kept a
  session a browser would have lost.
- The two exits do not share a JSON success contract — an ordinary sign-in
  answers {"two_factor":false}, a completed challenge answers an empty 204 —
  and merging them breaks a client keying off the status code.
- In shared mode everyone posts to /login, so the request never looks like the
  console even when /admin is the destination. The intended URL is read too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 06:15:16 +02:00
..
Actions fix(billing): hold only what cannot be matched, and let migrations roll back 2026-07-26 13:57:11 +02:00
Console feat(security): a way back into the console that does not need the console 2026-07-27 03:09:13 +02:00
Http Land a sign-in where it was performed, not always in the customer portal 2026-07-27 06:15:16 +02:00
Livewire Move the console off /admin, give the status page its own address, and measure monitoring 2026-07-27 06:05:40 +02:00
Mail fix(admin): confirm maintenance delivery via MessageSent (retryable until sent); guard resend/cancel on derived state; fix flaky non-unique host wg_ip 2026-07-25 16:14:01 +02:00
Models Move the console off /admin, give the status page its own address, and measure monitoring 2026-07-27 06:05:40 +02:00
Notifications fix(engine-b): default-deny firewall, disk-based capacity, synchronous credential mail 2026-07-25 12:39:15 +02:00
Policies fix(vpn): losing the operator roles closes the owner doors by itself 2026-07-25 22:50:13 +02:00
Providers Land a sign-in where it was performed, not always in the customer portal 2026-07-27 06:15:16 +02:00
Provisioning Move the console off /admin, give the status page its own address, and measure monitoring 2026-07-27 06:05:40 +02:00
Services Move the console off /admin, give the status page its own address, and measure monitoring 2026-07-27 06:05:40 +02:00
Support Land a sign-in where it was performed, not always in the customer portal 2026-07-27 06:15:16 +02:00