From 2d7e32b13c46fabc8222fded79054ebbfd271430 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Tue, 13 Oct 2026 10:37:57 +0000 Subject: [PATCH] =?UTF-8?q?dev:=20Rollenpr=C3=BCfung=20BN-02=20auf=20Live?= =?UTF-8?q?=20erledigt,=20Juli-Abfrage=20korrigiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nachher-Liste vom 13.10.2026: ein Admin-Konto mit Passkey und TOTP, Super-Admin, keine Editoren, Zugänge außerhalb der Anwendung nur beim Inhaber. Versandfassung D3 und Klärung U13 nachgezogen. Tinker-Befehl für die Juli-Kampagnen nutzt status->value (Enum). Co-Authored-By: Claude Opus 5.5 --- .../anwaltspaket-datenschutz-2026-10-12.md | 2 +- .../klaerung-anwaltspaket-2026-10-12.md | 2 +- dev/rechtliches/nachweise/README.md | 2 +- .../bn-02-berechtigungen-2026-10-13.md | 19 +++++++++++++++++++ .../nachweise/juli-mail-versand.md | 2 +- 5 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 dev/rechtliches/nachweise/bn-02-berechtigungen-2026-10-13.md diff --git a/dev/rechtliches/anwaltspaket-datenschutz-2026-10-12.md b/dev/rechtliches/anwaltspaket-datenschutz-2026-10-12.md index 1a79e288..d3ef8c84 100644 --- a/dev/rechtliches/anwaltspaket-datenschutz-2026-10-12.md +++ b/dev/rechtliches/anwaltspaket-datenschutz-2026-10-12.md @@ -84,7 +84,7 @@ Tritt im Server oder im Browser ein technischer Fehler auf, geht ein Fehlerberic - **Passkeys:** öffentlicher Schlüssel, technische Kennungen des Authentifikators, vom Nutzer vergebener Name, Zeitpunkt der letzten Nutzung. - **Anmeldung mit Google:** Google übermittelt Name, E-Mail-Adresse und Google-Kennung; gespeichert wird die Kennung. Google Ireland Ltd.; Übermittlung an Google LLC (USA) möglich, DPF. - **Abmeldung anderer Geräte:** nur ein Zeitstempel am Konto. -- **Administratoren:** Bestand laut Datenbank (Stand 07.10.2026): ein aktives Betriebskonto mit Admin-Rolle und Passkey, ein aktives Altkonto mit Admin-Rolle (letzte Anmeldung 2012), ein aktives Altkonto mit Super-Admin-Merker und importierten, nie benutzten API-Schlüsseln, drei gesperrte Altkonten mit Admin-Rolle, keine Editoren. Die Altkonten verlieren alle Rechte, Schlüssel und Sitzungen und werden gesperrt oder gelöscht. Danach hat nur das Betriebskonto Admin-Zugriff, mit nicht öffentlicher Login-Adresse. Zweiter Faktor für Admins ist Pflicht. Datierte Liste vorher und nachher: Anlage 7 (BN-02) [Datum und Ergebnis nach Ausführung eintragen]. +- **Administratoren:** Bestand laut Datenbank (Stand 07.10.2026): ein aktives Betriebskonto mit Admin-Rolle und Passkey, ein aktives Altkonto mit Admin-Rolle (letzte Anmeldung 2012), ein aktives Altkonto mit Super-Admin-Merker und importierten, nie benutzten API-Schlüsseln, drei gesperrte Altkonten mit Admin-Rolle, keine Editoren. Die Altkonten haben alle Rechte, Schlüssel und Sitzungen verloren und sind gesperrt oder gelöscht. Zweiter Faktor für Admins ist Pflicht. Stand 13.10.2026 nach der Bereinigung: ein Konto mit Zugang zum Admin-Bereich, mit Passkey und Authenticator-App; keine Editoren; Zugänge zu Server und Hosting nur beim Inhaber (Anlage 7, BN-02). ### D4 — E-Mail-Zustellung diff --git a/dev/rechtliches/klaerung-anwaltspaket-2026-10-12.md b/dev/rechtliches/klaerung-anwaltspaket-2026-10-12.md index df1b6c0b..c17ef9b6 100644 --- a/dev/rechtliches/klaerung-anwaltspaket-2026-10-12.md +++ b/dev/rechtliches/klaerung-anwaltspaket-2026-10-12.md @@ -568,7 +568,7 @@ Als Information, keine Frage: F1, F3-Fristen, F4, F6, F7, F11, die Entscheidunge | U10 | Boost-Label „Gebuchte Platzierung“ und Tooltip; Preisseite-Satz. **Im Code seit 13.10.2026** (Tooltip am Desktop, Tipp auf Mobil, Screenreader-Text; „Top-Auswahl“ → „Aktuell“; Admin-Aktion „Boost beenden“), Deploy offen | Abschnitt 6 | | U11 | Admin-Upload nur für Meldungen mit Konto, Link an Konto-E-Mail; Self-Service-Bild-Upload nur mit Konto; Rolle und Vertragspartner im Protokoll; Einreichungsnachweis zum Einreichungszeitpunkt (RP-05) | A3 | | U12 | Erstattungs-Aktion im Admin; Hilfeseite | Abschnitt 7 | -| U13 | Altkonten bereinigen: fünf Altkonten mit Admin-Rolle bzw. Super-Admin-Merker verlieren alle Rechte; Ablauf und Befehl `audit:admins` in `nachweise/bn-02-ablauf.md` | sofort | +| ~~U13~~ | ~~Altkonten bereinigen~~ — **erledigt 13.10.2026** auf Live: ein Admin-Konto mit Passkey und TOTP, keine Editoren (`nachweise/bn-02-berechtigungen-2026-10-13.md`) | sofort | | U14 | Alte Backups prüfen und bereinigen (Roadmap 1.5) | A4 | | U15 | Umami-Rohdatenfrist 13 Monate | F6 | | U16 | Betriebsnachweise BN-01 bis BN-09 aus der Korrekturdatei liefern (Release und Schalter je Host, Berechtigungen inkl. Editor-Rollen, Backupinventar, externer Löschstand, Instanzfristen, Verträge und DPF-Status, OpenAI-Einstellungen, Juli-Mailtexte mit Versandbeleg, Lauf- und Restore-Protokolle) | alle | diff --git a/dev/rechtliches/nachweise/README.md b/dev/rechtliches/nachweise/README.md index eb6f5fc2..a41c8dc4 100644 --- a/dev/rechtliches/nachweise/README.md +++ b/dev/rechtliches/nachweise/README.md @@ -10,7 +10,7 @@ Status: ✅ liegt vor · ◐ aus Code/Daten vorbelegt, auf Live bestätigen · | Datei | Status | Hinweis | |---|---|---| -| `bn-02-berechtigungen-2026-10-XX.md` | ☐ | Vorher/Nachher-Liste mit `php artisan audit:admins`; Ablauf in [`bn-02-ablauf.md`](bn-02-ablauf.md) | +| [`bn-02-berechtigungen-2026-10-13.md`](bn-02-berechtigungen-2026-10-13.md) | ✅ | 1 Admin-Konto mit Passkey und TOTP, keine Editoren; Ablauf in [`bn-02-ablauf.md`](bn-02-ablauf.md) | | `boost-01-startseite-desktop.png` | ☐ | U10 ist im Code; erst nach dem Deploy aufnehmen. Boost danach unter Admin ▸ Pressemitteilung ▸ „Boost beenden“ beenden | | `boost-02-branchenseite-desktop.png` | ☐ | dito | | `boost-03-startseite-mobil.png` | ☐ | 390 px | diff --git a/dev/rechtliches/nachweise/bn-02-berechtigungen-2026-10-13.md b/dev/rechtliches/nachweise/bn-02-berechtigungen-2026-10-13.md new file mode 100644 index 00000000..ad19261f --- /dev/null +++ b/dev/rechtliches/nachweise/bn-02-berechtigungen-2026-10-13.md @@ -0,0 +1,19 @@ +# Berechtigungen, Stand 13.10.2026 12:27 + +**Erhoben auf Live** mit `php artisan audit:admins` (v1.9.0), nach der Bereinigung laut [bn-02-ablauf.md](bn-02-ablauf.md). Eine Vorher-Liste wurde auf Live nicht gezogen; der Ausgangsbestand steht in bn-02-ablauf.md (Kopie der Live-Datenbank vom 07.10.2026): sechs Konten mit Rechten über den Kundenbereich hinaus, davon drei mit Admin-Zugang und eines mit zweitem Faktor. + +**Ausgeführt am 13.10.2026:** Betriebskonto mit Super-Admin-Merker und zusätzlich TOTP; alter Entwicklerzugang gesperrt, ohne Rechte, Schlüssel und Sitzungen, Adresse durch Zufallsadresse ersetzt; Altkonto ohne Daten gelöscht; drei gesperrte Altkonten von `admin` auf `customer`. + +Stand 13.10.2026: 1 Konto mit Zugang zum Admin-Bereich, davon 1 mit zweitem Faktor (TOTP oder Passkey), 1 Super-Admin, 0 Editor-Konten. Gelistet sind 1 Konten mit Rechten über den Kundenbereich hinaus, einschließlich gesperrter und gelöschter. + +| ID | E-Mail | Rollen | Super-Admin | Aktiv | Gelöscht | Admin-Zugang | TOTP | Passkeys | Letzte Anmeldung | API-Tokens | Sitzungen zuletzt widerrufen | +|---|---|---|---|---|---|---|---|---|---|---|---| +| 1 | …@pressekonto.com | admin | ja | ja | nein | ja | ja | 1 | 13.10.2026 12:12 | 0 | – | + +Admin-Zugang = aktiv und Super-Admin oder Rolle `admin`/`editor` (`User::canAccessAdmin()`). Sitzungen liegen in Redis und sind je Konto nicht zählbar; ein Widerruf beendet alle älteren Sitzungen. + +**Zugänge außerhalb der Anwendung** (nur Betreiber): + +- Ploi (darüber SSH) +- Hetzner-Konsole +- SSH-Schlüssel der Entwicklungsrechner (Mac mini Server, Mac Studio) diff --git a/dev/rechtliches/nachweise/juli-mail-versand.md b/dev/rechtliches/nachweise/juli-mail-versand.md index 754203bc..e80821e1 100644 --- a/dev/rechtliches/nachweise/juli-mail-versand.md +++ b/dev/rechtliches/nachweise/juli-mail-versand.md @@ -30,7 +30,7 @@ Die Regel steht in `app/Services/Newsletter/CampaignRecipients.php`. Sie gilt f ```bash php artisan tinker --execute ' foreach (App\Models\NewsletterCampaign::query()->orderBy("id")->get() as $c) { - echo $c->id." | ".$c->status." | ".$c->subject." | total ".$c->recipients_total." | sent ".$c->sent_count." | failed ".$c->failed_count." | skipped ".$c->skipped_count." | ".$c->sent_at.PHP_EOL; + echo $c->id." | ".$c->status->value." | ".$c->subject." | total ".$c->recipients_total." | sent ".$c->sent_count." | failed ".$c->failed_count." | skipped ".$c->skipped_count." | ".$c->sent_at.PHP_EOL; echo " Protokollzeilen: ".json_encode(DB::table("newsletter_campaign_recipients")->where("newsletter_campaign_id", $c->id)->selectRaw("status, count(*) n")->groupBy("status")->pluck("n", "status")).PHP_EOL; }' ```