TLS-Gate v3.8.0: Dashboard-Seite mit Kacheln aus Stammdaten (nur lesend)

Von: Branko → OZMAI
Stand: 6. Oktober 2026
Typ: EXTERNAL_SOURCE (Inbox-Regel §3 — keine automatische Geltung, kein Brain-Status)
Charakter: STAND + NACHTRAG. Setzt 2026-10-06_TLS-GATE-DEMO-STAMMDATEN-MOCKUP-SQL-UND-BEFUND-UNIQUE-NULL-NACHTRAG_BRANKO.md fort. Ersetzt eine Aussage dieser Datei: Dort steht „Es gibt noch keine Dashboard-Seite“ (§2 und §5). Seit v3.8.0 gibt es eine, aber nur lesend und ohne Sperre (siehe §1 und §3). Alles andere gilt unverändert.
Quelle: Repo TLS-Gate-Mock-Pipeline (git.crumbforest.org). Tag v3.8.0 = Commit 8c50578 (Vorgänger v3.7.0 = be42eff).
Belege: tests/test_dashboard_tiles.sh (27), docker_vm/tests/run.sh (58, davon 6 neu gegen MariaDB), p3 48, p4 54, p5 31, p6 22 grün nach Neubau.

Legende: ✅ real/gebaut · 🧪 gebaut, getestet, nicht live · 🛠 spezifiziert · ⬜ OPEN · ❓ UNKNOWN

Keine Zugangsdaten, keine Kunden-Domains, keine Reseller-IDs (Demo-Daten: *.invalid).


1. Was gebaut ist

  • 🧪 public/dashboard.php (nur lesend, kein POST, strikte CSP, kein Inline-JS) und src/Modules/Tiles.php (reine Auswertung, schreibt nichts, kein Audit). Kopfzeile verlinkt „Dashboard“. Die SSL-Konsole index.php bleibt unverändert und weiter das Ziel nach dem Login.
  • 🧪 Drei Teile, alle aus den Stammdaten der eigenen Gruppe:
  • Kette: Zustände aus Chain::status, nur Anzeige, die Seiten werden dadurch nicht gesperrt.
  • Module: vorhandene Seiten (SSL-Konsole, SOAP-Zugänge, Benutzer, Audit, 2FA) mit Schnelllink; sichtbar nach Rolle, SSL-Konsole nur Gruppentyp eigen (wie Auth::sslAllowed()). Nicht erlaubte Kacheln ohne Link.
  • Produkte: je aktive Freigabe eines aktiven Produkts der eigenen Gruppe: ready oder pending („noch n min/Std/Tage“), Verbrauch der jüngsten Periode, Preisreferenz, SOT-Verweis.
  • ✅ Preis: Es wird nur die Referenz (price_ref) angezeigt, nie ein berechneter Preis.
  • 🧪 Test mit Demo-Daten: mockup_freigaben_fuer_gruppe.sql gibt einer bestehenden Gruppe die Demo-Produkte frei (Klicktest mit echtem Konto auf ozm03).

2. Was die Prüfungen belegen

  • 🧪 Gruppentrennung (crew sieht kein NetBox, kunde keinen Container), deaktivierte Freigabe bei aktivem Produkt erscheint nicht, Start in der Zukunft = pending, Produktname mit <script> wird maskiert, Seite ohne Anmeldung leitet auf login.php um.
  • 🧪 Gegenprobe mit drei absichtlich kaputten Fassungen (inaktive Freigabe sichtbar, Link für jedes Produkt, Name ohne Maskierung): je rot. Die erste Fassung hat der Test zunächst nicht bemerkt: die Demo-Daten enthielten nur den Fall „Produkt inaktiv“, nicht „Freigabe inaktiv“. Der Fall wurde ergänzt, dann war die Fassung rot. Das ist die Lücke, die ohne die Gegenprobe geblieben wäre.
  • 🧪 Gegen MariaDB (run.sh): Freigabe einfügen, Kachel erscheint mit Preisreferenz und Link auf die Konsole, Freigabe entfernen, Kachel verschwindet.
  • ❓ Nicht belegt: Aussehen im Browser (CSS), die Seite wurde nicht von Hand geklickt; ein Login mit TOTP gegen ozm03 lief nicht automatisiert.

3. Vorläufige Festlegungen (NICHT von der Crew bestätigt)

Festlegung Quelle
Ein Produkt hat noch kein Ziel-Feld; verlinkt wird nur ssl → index.php, und nur wenn verfügbar. Alle anderen Kacheln zeigen „kein Ziel hinterlegt“ statt eines erfundenen Links Annahme des Entwicklers (products.target_url ist im Entwurf offen)
Dienste (NetBox, Container, qdrant) erscheinen als Kachel ohne Link Annahme des Entwicklers
Die Kette wird angezeigt, aber nicht erzwungen Vorgabe aus v3.6.0 („in keiner Seite verdrahtet“)
Rolle bestimmt die Modulkacheln, nicht die Kette Annahme des Entwicklers

4. Einordnung als Prüffall (Branko, nicht OZMAI-Geltung)

Eine Kachel „verfügbar“ ist Anzeige, keine Berechtigung: Wer die Kachel sieht, hat damit keinen Zugang zu einem Dienst erlangt, und die Anzeige erzeugt keine stärkere Bindung. Im Sinn des Identitäts-Prüffalls bleibt Zugang eine Aussage der Seite selbst (Rolle, Gruppe, Audit), nicht der Darstellung. ❓ Mit der Crew nicht besprochen.

5. Offene Punkte

  • ⬜ Weiterleitung nach dem Login auf das Dashboard (heute landet man auf der SSL-Konsole).
  • ⬜ Zielfeld products.target_url und wer es pflegt; ohne es bleiben die Dienstkacheln ohne Link.
  • ⬜ Kette als Sperre verdrahten (Chain::requireModule); Entscheidung steht aus, ob schluessel für Hosting Voraussetzung sein soll.
  • ⬜ Kategorie-Layer, Domains und Orders (Entwurf, Fragen an die Crew).
  • ❓ Klicktest im Browser steht aus.