Files
claude_settings/plans/cheerful-churning-hejlsberg.md
2026-01-29 22:46:19 +01:00

7.0 KiB

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

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:

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:

# 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=<pw>" | 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

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:

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:

<div class="pf-v5-c-login__main">
  <div class="pf-v5-c-login__main-header">  <-- Header-Section (Logo + Titel)
    <h1 id="kc-page-title">...</h1>
  </div>
  <div class="pf-v5-c-login__main-body">    <-- Body-Section (Formular)
    ...
  </div>
</div>

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.

/* 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:

.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):

    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