Kanbanize Kartenerstellung dokumentiert: Arrival-Rule-Workaround, Board-Struktur
- Neuer Abschnitt "Karten erstellen (Aufgaben-Workflow)" mit Workflow A/B - Bekannte Struktur erweitert: Workflows, Columns, Lanes für Board 1 - Pitfalls ergänzt: Arrival Rule, Parent-Link API, linkedCards read-only - Settings und Plans aktualisiert Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,136 +1,71 @@
|
||||
# Plan: Fix Flaw 1 (Service Unavailable) + Flaw 2 (Theme Layout)
|
||||
# Plan: Keycloak Theme CSS Fix — Alle Login-Seiten
|
||||
|
||||
## Flaw 1: "Service Unavailable" nach OIDC-Login
|
||||
## Status
|
||||
|
||||
### Diagnose
|
||||
- ~~Flaw 1 (Service Unavailable)~~: **ERLEDIGT** — Ursache war das Files-Plugin, vom User deaktiviert
|
||||
- **Flaw 2 (Theme Layout)**: Offen — CSS-Fix war unvollständig, PatternFly-Overrides fehlen
|
||||
|
||||
**Symptom:** Nach erfolgreichem Keycloak-Login zeigt grommunio-web "Unknown error - Service Unavailable".
|
||||
## Problem-Analyse (aus 4 Screenshots)
|
||||
|
||||
**Log-Evidenz:**
|
||||
```
|
||||
zcore[25984]: rhost=[] user= zs_logon_token rejected: Token did not validate
|
||||
```
|
||||
### Screenshot 1 — Username-Eingabe
|
||||
- Logo "egonetix / IT Solutions" + "Log in" Titel LINKS neben der Card, kaum lesbar
|
||||
- Card enthält nur: Username-Feld, Sign In Button, Passkey-Hint
|
||||
|
||||
**Wichtig:** `user=` ist LEER -- zcore kann keinen User aus dem Token extrahieren.
|
||||
### Screenshot 2 — Passkey Login
|
||||
- "Passkey Login" Text LINKS, kaum lesbar
|
||||
- Card enthält nur: Username, "Sign in with Passkey" Button, "Try Another Way"
|
||||
|
||||
**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
|
||||
### Screenshot 3 — Login-Methode wählen
|
||||
- "Select login method" Text LINKS, kaum lesbar
|
||||
- Card enthält: Username, Passkey-Button, Password-Button
|
||||
|
||||
**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.
|
||||
### Screenshot 4 — Passwort-Eingabe
|
||||
- **Mehrere Cards übereinandergestapelt!**
|
||||
- Eine Card zeigt "robert.wiegand", eine andere das Passwort-Feld
|
||||
- "Try Another Way" außerhalb beider Cards
|
||||
|
||||
### Schritt 1: gromox-zcore Neustart + Live-Test
|
||||
## Root Cause
|
||||
|
||||
```bash
|
||||
ssh root@10.0.0.23 'systemctl restart gromox-zcore && sleep 2 && systemctl status gromox-zcore --no-pager'
|
||||
```
|
||||
PatternFly v5 `.pf-v5-c-login__main` nutzt intern **CSS Grid** mit grid-template-areas. Das egonetix CSS setzt `display: flex` OHNE `!important`, wodurch PatternFly's Grid gewinnt. Die Kinder (header, body, footer) werden in separate Grid-Areas platziert statt als Flex-Column innerhalb einer Card.
|
||||
|
||||
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'
|
||||
```
|
||||
Zusätzlich fehlen Grid-Overrides für `.pf-v5-c-login__container` und PatternFly-Transparenz-Regeln für Footer und innere Wrapper.
|
||||
|
||||
### Schritt 2: JWT-Token aus Keycloak dekodieren
|
||||
## Betroffene Datei
|
||||
|
||||
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')
|
||||
`/home/icke/keycloak/themes/egonetix/login/resources/css/egonetix.css` auf srvdocker02 (10.0.0.48)
|
||||
|
||||
# Token dekodieren (ohne Signatur-Check)
|
||||
echo "$TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null | jq .
|
||||
```
|
||||
## Fix: CSS-Änderungen
|
||||
|
||||
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.
|
||||
### Änderung 1 — Layout-Section: PatternFly-Grid killen
|
||||
|
||||
Ersetze den bestehenden Layout-Block:
|
||||
```css
|
||||
/* Card auf den PARENT anwenden (umschliesst Header + Body) */
|
||||
/* === Layout === */
|
||||
.pf-v5-c-login,
|
||||
.login-pf {
|
||||
background: transparent !important;
|
||||
min-height: 100vh;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
}
|
||||
|
||||
.pf-v5-c-login__container {
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
width: 100% !important;
|
||||
max-width: none !important;
|
||||
grid-template-columns: unset !important;
|
||||
grid-template-rows: unset !important;
|
||||
}
|
||||
```
|
||||
|
||||
### Änderung 2 — Card-Section: `!important` auf alle Display/Grid-Properties
|
||||
|
||||
Ersetze den Card-Block:
|
||||
```css
|
||||
/* === Card (Glassmorphism) === */
|
||||
.pf-v5-c-login__main {
|
||||
background: var(--ego-card-background) !important;
|
||||
backdrop-filter: var(--ego-card-backdrop) !important;
|
||||
@@ -142,14 +77,28 @@ Basierend auf Diagnose -- moegliche Fixes:
|
||||
width: var(--ego-card-width) !important;
|
||||
max-width: 90vw !important;
|
||||
margin: 0 auto !important;
|
||||
/* Kill PatternFly grid, force flex column */
|
||||
display: flex !important;
|
||||
flex-direction: column !important;
|
||||
align-items: center !important;
|
||||
grid-template-columns: unset !important;
|
||||
grid-template-rows: unset !important;
|
||||
grid-template-areas: unset !important;
|
||||
}
|
||||
```
|
||||
|
||||
/* Kinder transparent machen (kein doppelter Card-Effekt) */
|
||||
### Änderung 3 — Children-Section: Footer + Grid-Area-Overrides hinzufügen
|
||||
|
||||
Ersetze den Children-Block (`.pf-v5-c-login__main-footer` und `grid-column/grid-row` fehlten):
|
||||
```css
|
||||
/* === Children transparent (no double card) === */
|
||||
.pf-v5-c-login__main-header,
|
||||
.pf-v5-c-login__main-body,
|
||||
.pf-v5-c-login__main-footer,
|
||||
#kc-form,
|
||||
#kc-content-wrapper,
|
||||
#kc-form-wrapper {
|
||||
#kc-form-wrapper,
|
||||
#kc-header-wrapper {
|
||||
background: transparent !important;
|
||||
box-shadow: none !important;
|
||||
border: none !important;
|
||||
@@ -158,41 +107,66 @@ Basierend auf Diagnose -- moegliche Fixes:
|
||||
border-radius: 0 !important;
|
||||
backdrop-filter: none !important;
|
||||
-webkit-backdrop-filter: none !important;
|
||||
/* Kill PatternFly grid-area assignments */
|
||||
grid-column: unset !important;
|
||||
grid-row: unset !important;
|
||||
}
|
||||
```
|
||||
|
||||
**Zusaetzlich:** `.pf-v5-c-login__main` Layout korrigieren:
|
||||
### Änderung 4 — Neue Regel: PatternFly-interne Card-Elemente transparent
|
||||
|
||||
Hinzufügen nach Children-Block:
|
||||
```css
|
||||
.pf-v5-c-login__main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
/* === Kill PatternFly card styling inside login === */
|
||||
.pf-v5-c-login__main .pf-v5-c-card,
|
||||
.pf-v5-c-login__main .pf-v5-c-card__body,
|
||||
.pf-v5-c-login__main fieldset,
|
||||
.pf-v5-c-login__main legend {
|
||||
background: transparent !important;
|
||||
box-shadow: none !important;
|
||||
border: none !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
```
|
||||
|
||||
### Schritt-fuer-Schritt
|
||||
### Änderung 5 — Page-Title-Regel erweitern
|
||||
|
||||
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
|
||||
Ersetze den Title-Block mit breiterer Abdeckung:
|
||||
```css
|
||||
/* === Page Title === */
|
||||
#kc-page-title,
|
||||
.pf-v5-c-login__main-header h1,
|
||||
.pf-v5-c-login__main-header-desc,
|
||||
h1#kc-page-title,
|
||||
h1.pf-v5-c-title {
|
||||
text-align: center !important;
|
||||
font-size: 18px !important;
|
||||
font-weight: 600 !important;
|
||||
color: var(--ego-text-primary) !important;
|
||||
margin: 0 0 var(--ego-spacing-lg) 0 !important;
|
||||
padding: 0 !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
```
|
||||
|
||||
2. **Keycloak-Cache leeren** (Theme-Aenderungen erfordern Cache-Clear oder Restart):
|
||||
```bash
|
||||
ssh root@10.0.0.48 'docker restart keycloak'
|
||||
```
|
||||
## Deployment
|
||||
|
||||
3. **Browser-Test:** https://auth.egonetix.de/realms/egonetix/account -> Logo + Titel + Formular alle IN der Card
|
||||
```bash
|
||||
# 1. CSS lokal editieren und per SCP deployen
|
||||
scp egonetix.css root@10.0.0.48:/home/icke/keycloak/themes/egonetix/login/resources/css/egonetix.css
|
||||
|
||||
---
|
||||
|
||||
## Reihenfolge
|
||||
|
||||
1. **Flaw 2 zuerst** (Theme-Fix) -- CSS-Aenderung auf srvdocker02, schnell verifizierbar
|
||||
2. **Flaw 1 danach** (Service Unavailable) -- erfordert iteratives Debugging auf srvmail01
|
||||
# 2. Keycloak neustarten (Theme-Cache leeren)
|
||||
ssh root@10.0.0.48 'docker restart keycloak'
|
||||
```
|
||||
|
||||
## 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
|
||||
Alle 4 Seiten im Inkognito-Fenster testen:
|
||||
|
||||
| Seite | Was prüfen |
|
||||
|-------|-----------|
|
||||
| Username-Eingabe | Logo + "Log in" INNERHALB der Card, zentriert |
|
||||
| Passkey Login | "Passkey Login" Titel INNERHALB der Card |
|
||||
| Login-Methode wählen | "Select login method" Titel INNERHALB der Card |
|
||||
| Passwort-Eingabe | NUR EINE Card, Passwort-Feld darin, kein Stacking |
|
||||
| Responsive (Handy) | Card füllt Bildschirm, kein Overflow |
|
||||
|
||||
Reference in New Issue
Block a user