CluPilotCloud/app/Services
nexxo 0be9c61484 Make a deactivated mailbox fall back like a deleted one
Review of Task 4: MailboxResolver::for() only fell back on a missing
mapping or a missing row. Deactivating a mailbox — the operator's
explicit "do not use this" — left it resolvable anyway, so
MailboxTransport reached it, found isConfigured() false, and threw
instead of quietly using the next candidate the way every other
"this mailbox is unusable" case does. Worse, __toString() still
reported the deactivated address as though it were healthy.

named() now runs through a new active() filter at BOTH lookup sites —
the purpose's own mapping and the system fallback — so an inactive
system mailbox is refused exactly like a missing one, not handed out
as the last resort. A missing password stays deliberately unfiltered
here: that is a MailboxTransport concern (loud failure naming the
mailbox), not a resolver fallback trigger — silently rerouting mail
because a password hasn't been typed yet would hide the gap instead
of surfacing it.

Added two tests and mutated active() to a no-op filter to confirm they
catch it: both failed (one expected the system mailbox, got null; the
other expected null, got the inactive mailbox's full attribute dump).
Reverted, reran, both pass again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 22:57:22 +02:00
..
Billing Measure availability, and let a customer move down again 2026-07-27 16:41:15 +02:00
Deployment Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
Dns fix(dns): deleting a record that is already gone is success 2026-07-25 23:54:45 +02:00
Mail Make a deactivated mailbox fall back like a deleted one 2026-07-27 22:57:22 +02:00
Maintenance fix(admin): catch racing ledger insert and re-fetch (idempotent under concurrency) 2026-07-25 16:31:43 +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 Drop the stray path comment after the opening PHP tag 2026-07-27 21:19:32 +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