Modul-Changelog

CW Customers

Zentrale Customer-/Contact- und Frontend-Identity-Schicht für CW mit Accounts, Account-Gruppen, Account-Lifecycle, neutralen Erweiterungspunkten und optionaler CW-2FA-Login-Challenge für Frontend-Module.

Releases18
Erstes Release24.09.2026
Letztes Release15.10.2026
Aktuelle Version0.1.0-dev19

Changelog

Neueste Veröffentlichung zuerst. Die Inhalte werden direkt aus den beim Release gespeicherten Release Notes erzeugt.

v0.1.0-dev19 15.10.2026 Stable

Version 0.1.0-dev19

  • Login verbessert: eindeutigeres Autocomplete fuer Passwortmanager und getrennte Checkbox „E-Mail-Adresse auf diesem Gerät merken“.
  • Geraetebezogene Vorbelegung der Login-E-Mail per Cookie (180 Tage), getrennt von „Eingeloggt bleiben“.
  • Sicherheitsfrage/Captcha optisch als klarer Formelblock mit groesserer Aufgabe und optionalem Hinweis „Punkt vor Strich“ bei gemischten Rechenarten.
CW ≥ 3.0.0-beta11.9 PHP ≥ 8.3.0
v0.1.0-dev18 15.10.2026 Stable

Version 0.1.0-dev18

Basis: **0.1.0-dev17**, sämtliche bisherigen Dateien bleiben erhalten. Neue Datei: `lib/security-hardening.php`.

  • ## Authentifizierung
  • Loginversuche werden **serverseitig in SQLite** für normalisierte, HMAC-geschützte Account-Kennung und Remote-IP registriert. Voreinstellung: acht erfolglose Versuche pro Account beziehungsweise 40 pro IP in 15 Minuten; 15-minütige Sperre. Der Account-Zähler wird bei erfolgreicher Passwortprüfung gelöscht, der gemeinsame IP-Zähler nicht. CAPTCHA bleibt separat adaptiv (standardmäßig ab drei Fehlschlägen); Voraussetzung: funktionierende CW-Frontend-CAPTCHA-Bridge.
  • Gemeinsame Login-Logik für `/account/login` und externe Module wie MediPlan; keine separaten Passwortbestände.
  • „Eingeloggt bleiben“ (maximal 30 Tage) speichert **keine Passwörter**. Es verwendet ein `Secure`, `HttpOnly`, `SameSite=Lax`, hostgebundenes Cookie `__Host-cw_customers_remember` mit zufälligem Selector und Verifier. In SQLite liegt ausschließlich dessen SHA-256-Prüfsumme. Beim Wiederanmelden wird der Verifier atomar rotiert. Kein Ausstellen über HTTP.
  • Abmelden widerruft den aktuellen Dauertoken; Passwortänderung und Passwortreset widerrufen **alle** Dauertokens des Kontos. Deaktivierte/gesperrte Konten sind nicht wiederherstellbar, selbst wenn ein Cookie existiert. E-Mail-Änderung widerruft Dauerlogins. Abschalten der Funktion in den Einstellungen entfernt alle Dauerlogins.
  • Eine optionale 2FA-Challenge bleibt vorgeschaltet: Der Dauertoken wird erst von `cw_customers_login_session()` **nach** erfolgreichem 2FA-Abschluss ausgestellt. Fehlt ein gültiges Challenge-Weiterleitungsziel, erfolgt **kein** Login. Der 2FA-Adapter muss seine Verifizierung abschließend mit `cw_customers_login_session()` beenden; andere Integrationen erfordern Anpassung.
  • Checkbox ist standardmäßig **nicht** aktiviert. Passwortspeicherung kann nur der Browser/Passwortmanager übernehmen; CW speichert dafür keine Zugangsdaten.
  • ## Installation und Sicherheit
  • 1. Vor dem Update `project/storage/customers/` vollständig sichern (einschließlich WAL/SHM bei SQLite).
  • 2. Customers **vor** MediPlan aktualisieren. Danach Customers im CW Backend aktivieren / aufrufen, damit die Migration der Tabellen `frontend_login_limits` und `frontend_remember_tokens` ausgeführt wird.
  • 3. In CW Customers → Einstellungen CAPTCHAs prüfen, Limits und Erinnerungsdauer konfigurieren; empfohlen Login-CAPTCHA adaptiv, Registrierung immer. Funktioniert die CAPTCHA-Bridge nicht, muss sie zuerst repariert werden.
  • 4. Auf dem **HTTPS-Host** echte Loginversuche testen, anschließend gesperrte Anmeldungen, 2FA, Passwortwechsel, Logout, Cookies mit Browser-Devtools kontrollieren.
  • 5. Separater PHP-/SQLite-Test: `php tests/security-hardening.php`. Dieser Test arbeitet mit einer In-Memory-Datenbank und verändert keine echten Konten.
  • *Bekannte Grenzen:** Keine Produktions-/Hosting-Tests in der Buildumgebung (`pdo_sqlite` ist dort nicht installiert). Dieser Release fügt keine vollständige Verwaltung einzelner Geräte im Profil hinzu. Bestehende bereits eingeloggte PHP-Sitzungen anderer Geräte werden bei Passwortwechsel weiterhin bis zu ihrem regulären Ablauf akzeptiert; **nur Dauerlogin-Tokens** werden widerrufen. Für sensibles Hosting sollten Sitzungslaufzeiten, WAF, TLS, HTTPS-Redirect und Zugriffsverbote auf `/project/stor
CW ≥ 3.0.0-beta11.9 PHP ≥ 8.3.0
v0.1.0-dev17 08.10.2026 Stable

Version 0.1.0-dev17

  • Optionaler Login-Challenge-Hook für CW 2FA.
  • Erfolgreiche Passwortprüfung kann vor Session-Aufbau an CW 2FA übergeben werden.
  • Ohne installiertes/aktives CW 2FA unverändertes Loginverhalten.
  • last_login_at wird erst nach vollständig abgeschlossener Anmeldung gesetzt.
CW ≥ 3.0.0-beta11.9 PHP ≥ 8.3.0
v0.1.0-dev16 07.10.2026 Stable

Version 0.1.0-dev16

  • generische Dashboard-Widget-API für das Frontend-Kundenkonto
  • generische Backend-Tab-API für Kundenstammsätze
  • bootreihenfolge-sichere Pending-Registrierung für optionale Module
  • Account-Startseite rendert echte Modul-Widgets statt fest codierter Zukunftsplatzhalter
  • Kundenbearbeitung erhält dynamische Fach-Tabs, sobald Module sie registrieren
  • keine Learning-, Shop- oder Appointments-Geschäftslogik in Customers
  • keine Datenbankmigration erforderlich
CW ≥ 3.0.0-beta11.9 PHP ≥ 8.3.0
v0.1.0-dev15 07.10.2026 Stable

Version 0.1.0-dev15

NEU

  • zentrale Frontend Identity API v1 für andere CW-Module
  • Account-Gruppen als eigene Autorisierungsschicht, getrennt von CRM-Kundenprofilen
  • Backend-Seite „Account-Gruppen“ mit Zuordnung vorhandener Frontend-Konten
  • API zum Lesen aktueller Identität und Account-Gruppen
  • sicherer lokaler return-Parameter für Login und Registrierung
  • vorbereitet für CW Learning, Shop, Appointments, Events und weitere Frontend-Module
  • UPDATE
  • bestehende Customers-, Account-, Profil-, Adress- und Template-Daten bleiben erhalten
  • neue Tabellen werden additiv in project/storage/customers/customers.sqlite angelegt
  • keine .htaccess im Modulpaket
CW ≥ 3.0.0-beta11.9 PHP ≥ 8.3.0
v0.1.0-dev14 25.09.2026 Stable

Version 0.1.0-dev14

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.9 PHP ≥ 8.3.0
v0.1.0-dev13 25.09.2026 Stable

Version 0.1.0-dev13

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev12 24.09.2026 Stable

Version 0.1.0-dev12

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev11 24.09.2026 Stable

Version 0.1.0-dev11

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev10 24.09.2026 Stable

Version 0.1.0-dev10

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev9 24.09.2026 Stable

Version 0.1.0-dev9

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev7 24.09.2026 Stable

Version 0.1.0-dev7

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev6 24.09.2026 Stable

Version 0.1.0-dev6

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev5 24.09.2026 Stable

Version 0.1.0-dev5

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev4 24.09.2026 Stable

Version 0.1.0-dev4

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev3 24.09.2026 Stable

Version 0.1.0-dev3

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev2 24.09.2026 Stable

Version 0.1.0-dev2

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0
v0.1.0-dev1 24.09.2026 Stable

Version 0.1.0-dev1

Für dieses Release wurden keine ausführlichen Release Notes gespeichert.

CW ≥ 3.0.0-beta11.8 PHP ≥ 8.3.0