CluPilotCloud/resources/views/livewire
nexxo 7edd88b71c Ein Zugang zur Konsole, dessen Passwort niemand kennt
Bisher erzeugte Settings::inviteStaff() beim Einladen eines
Betreiber-Mitarbeiters ein Passwort und zeigte es dem Inhaber einmal auf dem
Bildschirm, damit er es "sicher weitergibt" -- fuer einen Zugang zur Konsole,
die die ganze Flotte verwaltet. Der Kommentar dort nannte sich selbst eine
Attrappe.

Jetzt geht eine Einladung ohne Passwort hinaus: der Eingeladene bekommt eine
Mail mit einem Link und vergibt sein Passwort selbst, ueber
App\Livewire\Auth\OperatorSetPassword. Niemand -- auch der Inhaber nicht --
kennt je ein fremdes Passwort.

Dafuer brauchte es einen eigenen Weg, den es fuer Betreiber noch nicht gab
(R21: Konsole und Portal teilen keine Identitaet). Ein eigener Broker mit
eigener Tabelle (operator_password_reset_tokens, config/auth.php), eine
eigene Route in der Gast-Gruppe der Konsole (admin.invitation), und
Operator::sendPasswordResetNotification() wirft jetzt, statt Laravels
Vorgabe zu nutzen, die auf die Portalseite verlinkt haette.

Der Einladungslink gilt 72 Stunden -- lang genug fuer ein Wochenende, kurz
genug, dass ein altes Postfach nicht auf Dauer einen Schluessel zur Konsole
haelt. Zwei-Faktor bleibt unberuehrt: die neue Seite meldet niemanden
automatisch an, der Eingeladene durchlaeuft danach die normale Anmeldung
samt ihrer bestehenden Zwei-Faktor-Pruefung. Die Route liegt hinter denselben
Netz- und Hostwaechtern wie der Rest der Konsole (RestrictAdminHost,
RestrictConsoleNetwork), ohne Sonderfall.

OperatorInvitationMail reiht sich in den Versandtakt ein (MailLane::LOCKED,
wie ResetPasswordMail und VerifyEmailMail -- ein Mensch wartet gerade) und
ist damit in der Vorschau- und Versandtakt-Uebersicht der Konsole sichtbar,
statt lautlos in die gedrosselte Spur zu fallen.

Zwei Mutationsproben gegen die tragende Zusicherung durchgefuehrt (Bericht:
.superpowers/sdd/betreiber-einladung-report.md): die erste (durch die
Vorgaengersitzung) hielt fest, dass drei Zusicherungen fallen wuerden, waere
das Konto sofort anmeldbar; die zweite -- das Passwort testweise wieder auf
die Seite gebracht -- faellt exakt an der dafuer gebauten reflektierenden
Pruefung ueber alle oeffentlichen Eigenschaften der Seite.

Suite: 2771 passed (9683 assertions).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 01:50:42 +02:00
..
admin Ein Zugang zur Konsole, dessen Passwort niemand kennt 2026-08-04 01:50:42 +02:00
auth Ein Zugang zur Konsole, dessen Passwort niemand kennt 2026-08-04 01:50:42 +02:00
backups.blade.php Match the panel to the approved template, measured rather than assumed 2026-07-27 17:08:05 +02:00
billing.blade.php Ein Ausweg wird nur angeboten, wenn er auch buchbar ist 2026-08-01 15:40:26 +02:00
checkout.blade.php Give the order a checkout page, and stop hiding what a year costs 2026-07-30 16:00:08 +02:00
cloud.blade.php Restart a machine, enforce the quota that was sold, end a route that ended 2026-07-29 18:28:28 +02:00
confirm-book-storage.blade.php Der Deckel hielt außerhalb der Transaktion, das Fenster versprach einen Block zu viel 2026-08-01 18:53:00 +02:00
confirm-cancel-addon.blade.php Ask whether they are a consumer, and let one change their mind 2026-07-29 21:06:06 +02:00
confirm-cancel-package.blade.php Take the address by field, fix the customer type, ask why they leave 2026-07-30 16:41:32 +02:00
confirm-close-account.blade.php R24: a modal is never taller than the screen 2026-07-29 23:33:57 +02:00
confirm-delete-own-account.blade.php Discard an unconfirmed registration, and sweep the abandoned ones 2026-07-30 14:08:02 +02:00
confirm-disable-two-factor.blade.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
confirm-end-other-sessions.blade.php Show where an account is signed in, and let it sign the other places out 2026-07-28 23:38:17 +02:00
confirm-release-block.blade.php Sperren sehen und aufheben: Portalseite fuer den Inhaber, Abschnitte in der Konsole 2026-08-03 15:53:24 +02:00
confirm-remove-order.blade.php feat(billing): a cart you can actually read and change 2026-07-26 05:26:49 +02:00
confirm-restart-cloud.blade.php Restart a machine, enforce the quota that was sold, end a route that ended 2026-07-29 18:28:28 +02:00
confirm-revoke-seat.blade.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
confirm-withdraw.blade.php Charge the price the website shows, and hand a withdrawal back in full 2026-07-29 22:42:02 +02:00
custom-domain.blade.php Serve the custom domain, not just announce it 2026-07-29 16:44:52 +02:00
customer-provisioning.blade.php Take the order, park it, and say when it will be delivered 2026-07-29 18:50:46 +02:00
dashboard.blade.php Let the customer buy it themselves, and tab the integrations page 2026-07-29 19:42:28 +02:00
edit-mailbox.blade.php R24: a modal is never taller than the screen 2026-07-29 23:33:57 +02:00
edit-seat.blade.php R24: a modal is never taller than the screen 2026-07-29 23:33:57 +02:00
invoices.blade.php Say the same thing to the customer, the register and the bank 2026-07-30 01:30:24 +02:00
new-support-request.blade.php R24: a modal is never taller than the screen 2026-07-29 23:33:57 +02:00
open-invoices.blade.php Portal: Karte tauschen, offene Rechnungen begleichen, Hinweis bei Faelligkeit 2026-07-31 21:12:31 +02:00
order.blade.php Fix the checkout link, and stop the switch moving under the cursor 2026-07-30 16:05:56 +02:00
payment-method.blade.php Portal: Karte tauschen, offene Rechnungen begleichen, Hinweis bei Faelligkeit 2026-07-31 21:12:31 +02:00
security.blade.php Der Aufheben-Knopf im Portal bekommt seinen Abstand zurueck 2026-08-03 15:59:07 +02:00
sessions.blade.php Show where an account is signed in, and let it sign the other places out 2026-07-28 23:38:17 +02:00
settings.blade.php Give settings the shape a settings page actually has 2026-07-30 17:59:16 +02:00
support.blade.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.blade.php Ein Knopf, der eine Mail verspricht, die niemand verschicken kann 2026-08-04 00:14:27 +02:00