CluPilotCloud/app/Services
nexxo 07141a96bf Show where an account is signed in, and let it sign the other places out
Completes the device work: the warning mail now has somewhere to send people.
A warning whose only advice is "if this was not you, take action" names a
problem and hands back nothing to do about it.

Both sides get their own component rather than one shared with the guard passed
in. Operators and customers are two guards and two tables (R21) — a component
taking the guard as input is one forged property away from listing and ending
the other side's sessions. Every query in SessionRegistry is scoped by guard as
well as by id for the same reason, and three tests hold that line, because the
unscoped version looks exactly like a working feature while doing it.

TouchLoginSession keeps each row pointing at the session it describes. Both
sign-in paths raise the Login event BEFORE session()->regenerate(), so the row
is written against an id that is dead a moment later — and the once-a-minute
throttle would have held the correction back for the first minute of every
session, hiding the session its reader is sitting in. A changed id is therefore
never throttled.

A session counts as live only if the framework's row exists AND was touched
within the session lifetime. The join alone is not enough: Laravel collects
expired sessions by lottery, so on a quiet installation rows sit there for days
and the list would offer somebody a laptop they shut last month.

Ending the others goes through the product's own modal (R23) and leaves the
asking session alone: signing somebody out of the page they are using to sign
other people out is not what the button says.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 23:38:17 +02:00
..
Billing Measure availability, and let a customer move down again 2026-07-27 16:41:15 +02:00
Deployment Update only to a released version, never to whatever landed on main 2026-07-28 22:32:44 +02:00
Devices Show where an account is signed in, and let it sign the other places out 2026-07-28 23:38:17 +02:00
Dns fix(dns): deleting a record that is already gone is success 2026-07-25 23:54:45 +02:00
Mail Bound the mail test-send and real send to a timeout instead of hanging 2026-07-28 16:36:14 +02:00
Maintenance Keep the purpose mailer through the queue instead of losing it to the default 2026-07-28 03:50:02 +02:00
Monitoring Move the console off /admin, give the status page its own address, and measure monitoring 2026-07-27 06:05:40 +02:00
Proxmox feat(traffic): meter the monthly allowance, show it, throttle instead of blocking 2026-07-25 23:33:47 +02:00
Secrets Move the console's identity out of the customer table 2026-07-28 10:31:43 +02:00
Ssh fix(engine): long SSH command timeout; wg peer removal on privileged worker 2026-07-25 11:01:02 +02:00
Stripe Manage the Stripe key from the console, behind a password and a test 2026-07-27 09:01:16 +02:00
Traefik fix(engine-b): write Traefik route to the serving host over SSH, not locally 2026-07-25 12:55:24 +02:00
Traffic feat(billing): the plan catalogue becomes three tables, and config stops selling 2026-07-26 12:05:56 +02:00
Wireguard feat(admin): administrator access to a customer's Nextcloud 2026-07-26 05:30:59 +02:00