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

199 lines
7.0 KiB
Markdown

# 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=<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
```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
<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.
```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