CluPilotCloud/app/Livewire
nexxo 92dd6cc2d8 Refuse a two-factor completion for a revoked operator
completeLogin() re-checks isActive()/isOperator() immediately before signing
in, not only at the password step. The two-factor challenge previously only
confirmed the operator row still existed (Operator::find() + a null check),
so disabling an operator or revoking every console role in the window between
the password step and the pending code did not stop the login from
completing — the realistic case is an owner locking someone out mid-login,
not a contrived one.

One check, in the static method both OperatorLogin's direct exit and
OperatorTwoFactorChallenge::verify() already share, rather than a second copy
in the challenge. completeLogin() now returns bool instead of void: false
means refused, and neither the guard nor the session was touched. Each caller
turns that into a ValidationException in its own vocabulary — 'email' /
auth.failed for the direct exit (already unreachable in practice, since
authenticate() just checked the same two conditions synchronously; kept for
defense in depth), 'code' / auth.not_an_operator for the challenge, since the
code entered may be genuinely correct and reusing "wrong code" would mislead.
2026-07-28 15:47:39 +02:00
..
Admin Check users directly for the reverse operator-identity collision, not just customers 2026-07-28 15:36:29 +02:00
Auth Refuse a two-factor completion for a revoked operator 2026-07-28 15:47:39 +02:00
Concerns Key the password-confirmation marker by guard and identity 2026-07-28 15:00:46 +02:00
Backups.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
Billing.php Measure availability, and let a customer move down again 2026-07-27 16:41:15 +02:00
Cloud.php Measure availability, and let a customer move down again 2026-07-27 16:41:15 +02:00
ConfirmCancelPackage.php fix(portal): no silent no-ops without a customer; maintenance visible per instance; maintenance form redesign 2026-07-25 19:10:44 +02:00
ConfirmCloseAccount.php fix(portal): no silent no-ops without a customer; maintenance visible per instance; maintenance form redesign 2026-07-25 19:10:44 +02:00
ConfirmRemoveOrder.php feat(billing): a cart you can actually read and change 2026-07-26 05:26:49 +02:00
CustomerProvisioning.php fix(engine-b): stop customer dashboard polling once provisioning failed 2026-07-25 13:06:31 +02:00
Dashboard.php Measure availability, and let a customer move down again 2026-07-27 16:41:15 +02:00
EditMailbox.php Confirm a console password against the console's own record 2026-07-28 11:17:34 +02:00
EditSeat.php Editing in modals, an update button that is not gated on a stale reading, and a support page that is real 2026-07-27 17:55:49 +02:00
Invoices.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
NewSupportRequest.php Editing in modals, an update button that is not gated on a stale reading, and a support page that is real 2026-07-27 17:55:49 +02:00
Settings.php Give customers two-factor, and stop every button on the settings page reacting at once 2026-07-27 08:48:34 +02:00
Support.php Editing in modals, an update button that is not gated on a stale reading, and a support page that is real 2026-07-27 17:55:49 +02:00
Users.php Editing in modals, an update button that is not gated on a stale reading, and a support page that is real 2026-07-27 17:55:49 +02:00