diff --git a/ChangeLog.md b/ChangeLog.md index bbc7f57..c7b413d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,42 @@ # Changelog NetDiag +## 1.2.0 — 2026-08-17 + +### Anmeldung nur noch über AWL-Auth — der eigene JWT-Pfad ist weg + +**Achtung, das ist ein Schnitt:** Geräte mit einer App-Fassung, die noch ein +modul-eigenes netdiag-JWT benutzt, können sich nicht mehr anmelden und brauchen +die aktuelle APK. Eddy hat den Rollout am 17.08.2026 als abgeschlossen bestätigt. + +Warum das mehr ist als Aufräumen: Der alte Pfad prüfte die Signatur eines selbst +ausgestellten Tokens und holte damit einen Benutzer aus der Datenbank — **an der +Sitzungsliste von awlauth vorbei**. „Gerät abmelden" hatte auf ein solches Token +keine Wirkung; ein verlorenes Handy blieb bis zum Ablauf der TTL angemeldet. Jetzt +gibt es genau eine Stelle, an der Sitzungen entstehen und enden. + +- `api/auth.php`: der Rückfallweg (`checkLoginPassEntity` + eigenes JWT) ist + entfernt. Ohne aktives AWL-Auth antwortet die Anmeldung mit 503 und einer + klaren Meldung, statt auf einen zweiten Weg auszuweichen. +- `api/netdiag_api.lib.php`: `netdiag_api_authenticate()` prüft nur noch + `awlauth_verify_token()`. Die Hilfsfunktionen `netdiag_jwt_encode/decode`, + `netdiag_jwt_secret` und die Base64-URL-Helfer sind ersatzlos entfallen. +- **Konstanten `NETDIAG_API_JWT_SECRET` und `NETDIAG_API_TOKEN_TTL`** sind aus + dem Modul-Descriptor raus. Bestehende Werte in `llx_const` werden bewusst + NICHT gelöscht — sie schaden nicht, und ein Löschlauf beim Modul-Update ist + das größere Risiko. +- **TTL-Feld aus `admin/setup.php` entfernt.** Die Gültigkeit kommt jetzt allein + aus `AWLAUTH_TTL` (awlauth-Setup, Standard 7 Tage, dort 1–180 Tage + einstellbar). Zwei Stellschrauben für dieselbe Sache sind eine Fehlerquelle — + die hiesige hätte nach diesem Umbau still gar nichts mehr getan. An ihrer + Stelle steht jetzt ein Verweis. +- Sprachdateien de_DE und en_US nachgezogen, beide wieder deckungsgleich + (57 Schlüssel). + +Geprüft gegen die lokale Testinstanz: Anmeldung mit falschem Passwort → sauberer +Fehler von awlauth; API mit ungültigem Token → 401 „Token ungültig oder +abgelaufen"; ohne Token → 401 „Kein Token übermittelt". Kein PHP-Fehler durch +die entfernten Funktionen. + ## 1.1.7 — 2026-08-17 ### PDF-Zweig und Feldtabelle für den Geräte-Vergleich diff --git a/admin/setup.php b/admin/setup.php index e3fc74c..e3f72af 100644 --- a/admin/setup.php +++ b/admin/setup.php @@ -70,11 +70,6 @@ $action = GETPOST('action', 'aZ09'); // Konstanten speichern if ($action == 'updateconst') { - $ttl = GETPOSTINT('NETDIAG_API_TOKEN_TTL'); - if ($ttl < 60) { - $ttl = 604800; - } - dolibarr_set_const($db, 'NETDIAG_API_TOKEN_TTL', $ttl, 'chaine', 0, '', $conf->entity); dolibarr_set_const($db, 'NETDIAG_APK_URL', GETPOST('NETDIAG_APK_URL', 'alpha'), 'chaine', 0, '', $conf->entity); setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); header("Location: ".$_SERVER["PHP_SELF"]); @@ -104,9 +99,15 @@ print ''; print '
| '.$langs->trans("Parameter").' | '.$langs->trans("Value").' |
| '.$langs->trans("NETDIAG_API_TOKEN_TTL"); -print ' '.$form->textwithpicto('', $langs->trans("NETDIAG_API_TOKEN_TTLTooltip")).' | '; -print '|
| '.$langs->trans("NetDiagTokenTTLMoved").' | '; +print ''.$langs->trans("NetDiagTokenTTLMovedValue").' |
| '.$langs->trans("NETDIAG_APK_URL"); print ' '.$form->textwithpicto('', $langs->trans("NETDIAG_APK_URLTooltip")).' | '; diff --git a/api/auth.php b/api/auth.php index b227735..39b4571 100644 --- a/api/auth.php +++ b/api/auth.php @@ -55,11 +55,25 @@ if ($login === '' || $password === '') { require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; -if (netdiag_awlauth_available()) { - // --------------------------------------------------------------------- - // Zentrale Anmeldung über awlauth (Rate-Limit, Passwortprüfung, - // SSO-Eignung) — dieselbe Prüfung wie in allen anderen AWL-Apps. - // --------------------------------------------------------------------- +/* + * Anmeldung ausschließlich über awlauth — Rate-Limit, Passwortprüfung, + * SSO-Eignung und die zentrale Sitzungsliste kommen von dort, wie in allen + * anderen AWL-Apps. + * + * Der frühere Rückfallweg mit modul-eigenem JWT ist am 17.08.2026 entfallen + * (APK-Rollout abgeschlossen). Er stellte Tokens aus, die an der + * awlauth-Geräteliste vorbeiliefen: „Gerät abmelden" hatte darauf keine + * Wirkung. Lieber ein klarer Fehler als eine zweite, unsichtbare Sitzungsart. + * + * Die Gültigkeit bestimmt jetzt allein `AWLAUTH_TTL` (awlauth-Setup, + * Standard 7 Tage) — es gibt keine konkurrierende Einstellung mehr im + * NetDiag-Setup. + */ +if (!netdiag_awlauth_available()) { + netdiag_api_error('Anmeldung nicht möglich: das Modul AWL-Auth ist nicht aktiv', 503); +} + +{ $res = awlauth_login($login, $password); if (empty($res['success'])) { netdiag_api_error($res['error'], (int) $res['http']); @@ -87,42 +101,6 @@ if (netdiag_awlauth_available()) { } $token = $issued['token']; $ttl = (int) $issued['expiresIn']; -} else { - // --------------------------------------------------------------------- - // Fallback ohne awlauth: modul-eigenes JWT (Alt-Verhalten). - // --------------------------------------------------------------------- - $entitytocheck = (int) $conf->entity; - $authmode = (getDolGlobalString('MAIN_AUTHENTICATION_MODE') ? getDolGlobalString('MAIN_AUTHENTICATION_MODE') : 'dolibarr'); - $resultlogin = checkLoginPassEntity($login, $password, $entitytocheck, explode(',', $authmode)); - - if (empty($resultlogin)) { - // Kurze Verzögerung gegen Brute-Force - sleep(1); - netdiag_api_error('Login fehlgeschlagen', 401); - } - - $user = new User($db); - if ($user->fetch('', $resultlogin, '', 0, $entitytocheck) <= 0 || empty($user->id)) { - netdiag_api_error('Benutzer nicht gefunden', 401); - } - if (!empty($user->statut) && $user->statut == 0) { - netdiag_api_error('Benutzer deaktiviert', 403); - } - $user->loadRights(); - - if (!$user->hasRight('netdiag', 'protocol', 'read')) { - netdiag_api_error('Keine Berechtigung für NetDiag', 403); - } - - $ttl = (int) getDolGlobalString('NETDIAG_API_TOKEN_TTL', '604800'); - if ($ttl < 60) { - $ttl = 604800; - } - - $token = netdiag_jwt_encode(array( - 'sub' => (int) $user->id, - 'name' => $user->getFullName($langs), - ), $ttl); } netdiag_api_respond(array( diff --git a/api/netdiag_api.lib.php b/api/netdiag_api.lib.php index bc0f8ed..692c348 100644 --- a/api/netdiag_api.lib.php +++ b/api/netdiag_api.lib.php @@ -192,94 +192,10 @@ function netdiag_api_error($message, $httpstatus = 400) netdiag_api_respond(array('error' => $message), $httpstatus); } -/** - * Base64-URL-kodieren (JWT-konform, ohne Padding). - * - * @param string $data Rohdaten - * @return string Kodierter String - */ -function netdiag_base64url_encode($data) -{ - return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); -} -/** - * Base64-URL-dekodieren. - * - * @param string $data Kodierter String - * @return string Rohdaten - */ -function netdiag_base64url_decode($data) -{ - return base64_decode(strtr($data, '-_', '+/')); -} -/** - * Geheimen JWT-Schlüssel des Moduls holen. - * - * @return string Schlüssel - */ -function netdiag_jwt_secret() -{ - $secret = getDolGlobalString('NETDIAG_API_JWT_SECRET'); - if (empty($secret)) { - // Fallback: Instanz-eindeutiger Wert (sollte nach Modulaktivierung nicht eintreten) - $secret = md5(DOL_DOCUMENT_ROOT.getDolGlobalString('MAIN_INFO_SOCIETE_NOM')); - } - return $secret; -} -/** - * JWT (HS256) erzeugen. - * - * @param array