# Plan: Fix Flaw 1 (Service Unavailable) + Flaw 2 (Theme Layout) ## Flaw 1: "Service Unavailable" nach OIDC-Login ### Diagnose **Symptom:** Nach erfolgreichem Keycloak-Login zeigt grommunio-web "Unknown error - Service Unavailable". **Log-Evidenz:** ``` zcore[25984]: rhost=[] user= zs_logon_token rejected: Token did not validate ``` **Wichtig:** `user=` ist LEER -- zcore kann keinen User aus dem Token extrahieren. **Was funktioniert:** - PHP OIDC-Flow: `login() returned 0 (NOERROR)` -- Keycloak-Auth OK - bearer_pubkey: Korrekt, gleicher Key wie Keycloak, lesbar für gromox-User - keycloak.json: Korrekt konfiguriert mit `realm-public-key` und `principal-attribute` - Alle Services: nginx, php-fpm, gromox-http, gromox-zcore laufen **Vermutete Ursache:** Die PHP-Schicht (grommunio-web) authentifiziert sich erfolgreich bei Keycloak, aber wenn sie den Bearer-Token an gromox-zcore weiterreicht (`mapi_logon_token()`), schlaegt die Token-Validierung in zcore fehl. Der leere `user=` deutet darauf hin, dass zcore den Token nicht parsen oder die Claims nicht extrahieren kann. ### Schritt 1: gromox-zcore Neustart + Live-Test ```bash ssh root@10.0.0.23 'systemctl restart gromox-zcore && sleep 2 && systemctl status gromox-zcore --no-pager' ``` Dann im Browser einloggen und sofort Logs pruefen: ```bash ssh root@10.0.0.23 'journalctl -u gromox-zcore --since "1 min ago" --no-pager' ``` ### Schritt 2: JWT-Token aus Keycloak dekodieren Ein Token von Keycloak holen und die Claims pruefen: ```bash # Token holen (Resource Owner Password Grant fuer Test) TOKEN=$(curl -s -X POST "https://auth.egonetix.de/realms/egonetix/protocol/openid-connect/token" \ -d "grant_type=password" \ -d "client_id=grommunio" \ -d "username=robert.wiegand@egonetix.de" \ -d "password=" | jq -r '.access_token') # Token dekodieren (ohne Signatur-Check) echo "$TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null | jq . ``` Pruefen ob folgende Claims vorhanden: - `iss` = `https://auth.egonetix.de/realms/egonetix` - `aud` = enthaelt `grommunio` oder `account` - `preferred_username` = `robert.wiegand@egonetix.de` - `sub` = UUID des Users - `azp` = `grommunio` ### Schritt 3: gromox-zcore Debug-Logging erhoehen ```bash ssh root@10.0.0.23 'sed -i "s/log_level=6/log_level=1/" /etc/gromox/zcore.cfg && systemctl restart gromox-zcore' ``` Log-Level 1 = maximales Logging. Nach Test zuruecksetzen auf 6. ### Schritt 4: PHP MAPI Token-Uebergabe pruefen Pruefen was genau grommunio-web an zcore uebergibt: ```bash ssh root@10.0.0.23 'grep -n "logon_token\|mapi_logon\|bearer\|zs_logon" /usr/share/php-mapi/class.keycloak.php /usr/share/grommunio-web/server/includes/core/*.php 2>/dev/null' ``` ### Schritt 5: Direct Access Grants pruefen Falls `grant_type=password` nicht erlaubt ist (Public Client), per Browser-DevTools: 1. https://mail.egonetix.de oeffnen 2. DevTools Network-Tab 3. Login durchfuehren 4. Token-Exchange-Request finden und access_token kopieren 5. Manuell dekodieren ### Schritt 6: Fix anwenden Basierend auf Diagnose -- moegliche Fixes: **A) Token-Claim-Problem:** Keycloak Mapper anpassen (preferred_username muss E-Mail enthalten) **B) Audience-Problem:** Keycloak Client Scope anpassen **C) gromox-Config:** Fehlende Config-Option in zcore.cfg/http.cfg **D) PHP-Code:** grommunio-web uebergibt falsches Token-Format an zcore --- ## Flaw 2: Keycloak Theme Layout kaputt ### Diagnose **Screenshot-Analyse (Auswahl_2145.jpg):** - Berg-Hintergrund: OK - Login-Card (weiss/glassmorphism): Rechts positioniert, OK - **Logo "egonetix" + "IT SOLUTIONS":** LINKS neben der Card, halb verdeckt - **"Log in" Titel:** LINKS unter dem Logo, ausserhalb der Card - Nur Formularfelder (Username, Button, Passkey-Hint) sind IN der Card **Root Cause:** Keycloak v2 template.ftl rendert den DOM so: ```html
``` **Das CSS** applied Card-Styling NUR auf `.pf-v5-c-login__main-body`, NICHT auf den Parent `.pf-v5-c-login__main`. Deshalb sind Logo und Titel AUSSERHALB der visuellen Card. ### Theme-Dateien (auf srvdocker02) | Datei | Pfad | |-------|------| | CSS | `/home/icke/keycloak/themes/egonetix/login/resources/css/egonetix.css` | | login.ftl | `/home/icke/keycloak/themes/egonetix/login/login.ftl` | | login-username.ftl | `/home/icke/keycloak/themes/egonetix/login/login-username.ftl` | | logout-confirm.ftl | `/home/icke/keycloak/themes/egonetix/login/logout-confirm.ftl` | | theme.properties | `/home/icke/keycloak/themes/egonetix/login/theme.properties` | ### Fix: CSS umstrukturieren **Kern-Aenderung:** Card-Styling von `.pf-v5-c-login__main-body` auf `.pf-v5-c-login__main` verschieben. ```css /* Card auf den PARENT anwenden (umschliesst Header + Body) */ .pf-v5-c-login__main { background: var(--ego-card-background) !important; backdrop-filter: var(--ego-card-backdrop) !important; -webkit-backdrop-filter: var(--ego-card-backdrop) !important; border-radius: var(--ego-border-radius) !important; box-shadow: var(--ego-card-shadow) !important; border: 1px solid rgba(255, 255, 255, 0.3) !important; padding: var(--ego-card-padding) !important; width: var(--ego-card-width) !important; max-width: 90vw !important; margin: 0 auto !important; } /* Kinder transparent machen (kein doppelter Card-Effekt) */ .pf-v5-c-login__main-header, .pf-v5-c-login__main-body, #kc-form, #kc-content-wrapper, #kc-form-wrapper { background: transparent !important; box-shadow: none !important; border: none !important; padding: 0 !important; width: 100% !important; border-radius: 0 !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; } ``` **Zusaetzlich:** `.pf-v5-c-login__main` Layout korrigieren: ```css .pf-v5-c-login__main { display: flex; flex-direction: column; align-items: center; } ``` ### Schritt-fuer-Schritt 1. **egonetix.css** auf srvdocker02 editieren: - Card-Styling von `#kc-form, .pf-v5-c-login__main-body, #kc-content-wrapper, #kc-form-wrapper` entfernen - Card-Styling auf `.pf-v5-c-login__main` setzen - Alle Kinder (header, body, form-wrapper) transparent machen - Layout-Anpassung: `.pf-v5-c-login__main` als flex-column 2. **Keycloak-Cache leeren** (Theme-Aenderungen erfordern Cache-Clear oder Restart): ```bash ssh root@10.0.0.48 'docker restart keycloak' ``` 3. **Browser-Test:** https://auth.egonetix.de/realms/egonetix/account -> Logo + Titel + Formular alle IN der Card --- ## Reihenfolge 1. **Flaw 2 zuerst** (Theme-Fix) -- CSS-Aenderung auf srvdocker02, schnell verifizierbar 2. **Flaw 1 danach** (Service Unavailable) -- erfordert iteratives Debugging auf srvmail01 ## Verifikation - **Flaw 2:** Browser -> https://mail.egonetix.de -> Keycloak-Login-Seite zeigt Logo + Titel INNERHALB der Card - **Flaw 1:** Browser -> Login -> kein "Service Unavailable" Dialog, Mailbox oeffnet sich