CluPilotCloud/app/Livewire/Admin
nexxo 5de1f45703 Close two ways a mail.manage session could take over outgoing mail
I3: nothing stopped an operator unchecking Aktiv on the mailbox that
mail.purpose.system points at. MailboxResolver::active() filters an
inactive mailbox at BOTH the direct lookup and the system fallback, so
that one checkbox could take mail.purpose.system to null and every
purpose without its own mapping down with it — the existing
system_required guard on savePurposes() reads as if this were covered,
but it only blocks the empty-mapping path, not this one.
EditMailbox::save() now refuses active=false against the mailbox 'system'
currently points at, the same way savePurposes() already refuses to leave
'system' empty.

I4: Admin\Mail::saveServer() writes mail.host — the platform's outbound
relay for every purpose mailbox at once — and CloudReady::toMail() puts a
customer's Nextcloud admin password in cleartext in the message body. So a
signed-in mail.manage session was already a credential-interception
primitive, the same threat Admin\Secrets' second gate exists for. Both
saveServer() and EditMailbox::save() (only when a new password is actually
being typed) now also require passwordRecentlyConfirmed(), following the
ConfirmsPassword pattern Secrets.php and Settings.php's two-factor actions
already use — including their per-action UI shape (an inline confirm form
scoped to the gated action), not a whole-page lock, so address, display
name, username, no-reply, active and the purpose mapping stay reachable
without confirming, per the brief's capability split.

Both gated and ungated paths are covered by tests, and both guards were
mutated away and confirmed to fail before being restored.
2026-07-28 03:50:19 +02:00
..
ConfirmDeleteDatacenter.php fix(admin): authorize datacenter modal mounts; stale threshold uses step maxDuration 2026-07-25 18:23:44 +02:00
ConfirmDeletePlanDraft.php feat(admin): a console for creating, pricing and scheduling plans 2026-07-26 12:41:51 +02:00
ConfirmDeleteVpnPeer.php feat(vpn): ownership, a Developer role, and password-gated config retrieval 2026-07-25 22:31:54 +02:00
ConfirmRemoveHost.php feat(admin): staff RBAC (spatie) + admin settings page 2026-07-25 15:47:42 +02:00
Customers.php feat(billing): the plan catalogue becomes three tables, and config stops selling 2026-07-26 12:05:56 +02:00
Datacenters.php fix(datacenters): a code becomes a DNS label, so validate it as one 2026-07-25 23:56:50 +02:00
EditDatacenter.php Let people change their own password, and a location be switched off while editing it 2026-07-27 07:49:07 +02:00
HostCreate.php feat(admin): staff RBAC (spatie) + admin settings page 2026-07-25 15:47:42 +02:00
HostDetail.php feat(admin): staff RBAC (spatie) + admin settings page 2026-07-25 15:47:42 +02:00
Hosts.php feat(admin): scalable host list (search/filter/health) + host detail redesign 2026-07-25 14:27:53 +02:00
InstanceAdminAccess.php fix(admin): the admin password is shown once, and means it 2026-07-26 05:34:57 +02:00
Instances.php Report the estate from the database, and print the traffic that is sold 2026-07-27 04:48:51 +02:00
Mail.php Close two ways a mail.manage session could take over outgoing mail 2026-07-28 03:50:19 +02:00
Maintenance.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
Overview.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
PlanVersions.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
Plans.php feat(admin): a console for creating, pricing and scheduling plans 2026-07-26 12:41:51 +02:00
Provisioning.php fix(admin): authorize datacenter modal mounts; stale threshold uses step maxDuration 2026-07-25 18:23:44 +02:00
Revenue.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
Secrets.php Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
Settings.php Let people change their own password, and a location be switched off while editing it 2026-07-27 07:49:07 +02:00
Vpn.php Serve the console inside the tunnel, without publishing the internal network 2026-07-27 10:14:33 +02:00
VpnConfigAccess.php fix(vpn): count downloads in the database; repair the race test 2026-07-25 22:48:38 +02:00