Commit graph

14 commits

Author SHA1 Message Date
bb6681ac37 Reiter am Kunden nur bei vorhandenen Protokollen (1.3.1) [deploy]
All checks were successful
Deploy netdiag / deploy (push) Successful in 13s
Der Reiter stand auf jeder Kundenkarte; die Leiste dort traegt ueber 20
Eintraege, auf Prod gibt es 20 Protokolle bei 6 von 111 Kunden. Er
erscheint jetzt nur bei Bestand, mit Anzahl. Am AUFTRAG bleibt er fest.

Als Hook (class/actions_netdiag.class.php, completeTabsHead) statt
festem Tab, Muster wie bei Mahnung und ElektroPlanung. Uebernimmt einen
bereits vorhandenen Eintrag desselben Schluessels statt einen zweiten
anzuhaengen — kein doppelter Reiter auch vor der Reaktivierung.

Lokal verifiziert: Kunde mit 13 Protokollen zeigt 'Netzwerk-Diagnose 13'
einmalig, Kunde ohne Protokoll zeigt den Reiter gar nicht.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-07 21:27:51 +02:00
087f37afa6 1.3.0: PDF-Zweig SIP-Erreichbarkeit, Token in der URL nur noch fuer den APK-Download [deploy]
All checks were successful
Deploy netdiag / deploy (push) Successful in 14s
PDF-Zweig netdiagPdfSip()
- Eigener Zweig, weil die Aussage sonst untergeht: in einer flachen
  Schluessel/Wert-Liste sieht "401 Unauthorized" wie ein Fehler aus, ist aber
  der Beweis fuer eine erreichbare Instanz, die nur Zugangsdaten will. Erst
  Befund im Klartext, dann eine Zeile je Transportweg.
- Der Grenzhinweis steht mit im Dokument: gemessen ist die Erreichbarkeit,
  NICHT die Sprachqualitaet.
- Feldnamen-Falle wieder aufgetreten: 'port' gehoert in beiden Feldtabellen
  laengst dem SNMP-Werkzeug ("Switch-Port"). Im Kunden-PDF haette gestanden
  "Switch-Port: 5060" - deshalb 'zielPort'.

WLAN-Kanalanalyse: Warnungen nicht mehr abschneiden
- dol_trunc(..., 160) kappte genau die Begruendung ("... In dicht besiedelter
  Umgebung meist ein Fehle..."). Eine Warnung ohne ihren Grund ist im
  Kundendokument wertlos; MultiCell bricht ohnehin um.

Token in der Adresszeile
- netdiag_api_read_token() nimmt ?jwt= nur noch an, wenn der Endpunkt es
  ausdruecklich erlaubt. Einzige Stelle: update.php?download=1.
- Grund: ein Token in der URL steht in jedem Zugriffs- und Proxy-Log und gilt
  sieben Tage fuer die GESAMTE Kunden-API.
- Warum die Ausnahme bleibt: die App-Fassungen im Feld bauen die
  Download-Adresse mit dem Token darin. Sofort schliessen hiesse, genau die
  Geraete vom Update auszusperren, die die neue APK brauchen. Zu entfernen,
  sobald Eddy den Rollout bestaetigt (Hinweis steht im Code).
- pdf.php nimmt ab sofort ausschliesslich den Authorization-Header.

Gegen die Testinstanz gemessen: ?jwt= liefert bei orders/customers/protocols/
pdf/update-Version jetzt 401, mit Bearer weiterhin 200.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 21:40:26 +02:00
219d489951 Anmeldung nur noch ueber AWL-Auth - eigener JWT-Pfad entfernt
ACHTUNG, Schnitt: Geraete mit einer App-Fassung, die noch ein modul-eigenes
netdiag-JWT benutzt, koennen sich nicht mehr anmelden. Eddy hat den
APK-Rollout am 17.08.2026 als abgeschlossen bestaetigt.

Mehr als Aufraeumen: Der alte Pfad pruefte die Signatur eines selbst
ausgestellten Tokens und holte damit einen Benutzer aus der Datenbank - an der
Sitzungsliste von awlauth vorbei. "Geraet abmelden" hatte darauf keine
Wirkung; ein verlorenes Handy blieb bis zum Ablauf der TTL angemeldet. Jetzt
gibt es genau eine Stelle, an der Sitzungen entstehen und enden.

Entfernt: der Rueckfallweg in auth.php (ohne aktives AWL-Auth jetzt 503 statt
zweitem Weg), netdiag_jwt_encode/decode/secret samt Base64-URL-Helfern, die
Konstanten NETDIAG_API_JWT_SECRET und NETDIAG_API_TOKEN_TTL aus dem
Descriptor, das TTL-Feld aus dem Setup. Bestehende llx_const-Werte bleiben
stehen - ein Loeschlauf beim Modul-Update waere das groessere Risiko.

Die Gueltigkeit kommt jetzt allein aus AWLAUTH_TTL (awlauth-Setup, Standard
7 Tage). Genau darauf hat Eddy hingewiesen: das ist im Auth-Modul geregelt.

Sprachdateien de_DE und en_US nachgezogen, beide wieder deckungsgleich.

Geprueft gegen die Testinstanz: falsches Passwort -> sauberer awlauth-Fehler,
ungueltiges Token -> 401, kein Token -> 401. Kein PHP-Fehler durch die
entfernten Funktionen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 17:55:53 +02:00
4fcd356972 PDF-Zweig und Feldtabelle fuer den Geraete-Vergleich
netdiagPdfGeraeteDiff() gibt die Listen getrennt aus: neu, nicht mehr
erreichbar, mit neuer IP-Adresse, gleiche Adresse mit anderen offenen Ports.
Beim Wiederholungstermin zaehlt, WELCHES Geraet neu ist, nicht nur wie viele.

An jeder Zeile steht, worueber das Geraet wiedererkannt wurde - "erkannt ueber
IP und Portmuster" ist eine schwaechere Aussage als "ueber Netzwerkname", und
der Unterschied gehoert ins Dokument statt in eine Fussnote.

Geprueft im Durchstich: in der App gegen echte Serverdaten gemessen
(ND2026-0016 gegen ND2026-0006), synchronisiert, PDF erzeugt und angesehen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 17:13:41 +02:00
75c1446e76 PDF-Zweig fuer die DNS-Pruefung
netdiagPdfDns(): je befragtem Server eine eigene Zeile statt einer
|-getrennten Kette. Bei zwei Servern ging die generische Darstellung noch,
bei den vier bis fuenf Eintraegen eines Firmennetzes waere die eigentliche
Aussage - welcher Server antwortet und welcher nicht - nicht mehr auffindbar
gewesen. Damit hat jedes Werkzeug mit Listenergebnis einen eigenen Renderer.

Geprueft im vollstaendigen Durchstich: in der App gemessen (Emulator gegen die
lokale Testinstanz), synchronisiert, PDF aus ND2026-0016 erzeugt und angesehen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 06:54:55 +02:00
2c5f7cf11b Feldtabelle fuer das Werkzeug "DNS-Pruefung"
gefragteServer und antworten in die Kunden-Whitelist, dnscheck in die
Werkzeugliste. Ohne diese drei Zeilen stuende im Kundendokument nur die
Ampel - die einzelnen Serverzeilen sind das eigentliche Ergebnis.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 23:24:47 +02:00
0f37cae9e5 Drei Falschaussagen im Kundendokument, alle aus Altdaten
"0 DHCP-Server (!)" in Rot: In der Produktionsdatenbank stehen drei
ausgelieferte Messungen des entfernten Werkzeugs dhcpcheck mit Ergebnis
{"count":0,"server":[],"hinweis":""} und Status 2. Bei Kabelverbindung gibt
Android die DHCP-Angaben aber grundsaetzlich nicht heraus (nur DhcpInfo, nur
WLAN, deprecated) - gemessen wurde also nichts, "0 gefunden" war der
Rueckgabewert fuer "nicht ermittelbar". netdiagAltlastKorrektur() zeigt diese
Messungen jetzt als "nicht messbar" mit Erklaerung, in PDF und
Technikeransicht. Rohdaten bleiben unangetastet, korrigiert wird nur die
Darstellung - und die wird bei jedem Abruf neu erzeugt. Die Ergebniszahlen
werden dabei unterdrueckt: "Gefundene Geraete: 0" widerspraeche der Aussage
direkt darueber.

"Lease-Dauer: 864000 s s": aeltere App-Fassungen haben die Einheit in den Wert
geschrieben, die Feldtabelle haengt sie erneut an (Prod-Messung #42).

Adress- und Lease-Felder mit dem Wert 0 erscheinen jetzt als "nicht
ermittelbar" statt als "0" - das war nie eine Messung, sondern das
"nichts ermittelt" der alten Android-API.

Neu in der Whitelist: dhcpQuelle (system = LinkProperties ab Android 11 fuer
jeden Anschlusstyp, wlan = alter Weg nur fuer WLAN). Damit ist klaerbar, ob
eine fehlende DHCP-Angabe an der Leitung lag oder an der Android-Version.

Geprueft gegen die lokale Testinstanz mit einer Kopie der echten
Prod-Messungen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 23:11:07 +02:00
b2ab430ae7 Internet-Kette im PDF + Pfeile wurden als "?" gedruckt
netdiagPdfKette() fuer das neue App-Werkzeug: Fehlerglied als eigene
hervorgehobene Zeile, darunter die vier Stufen einzeln, dann Systemurteil
und Hinweis. Ohne eigenen Zweig stuenden die Stufen als |-Kette in einer
Zelle und das Fehlerglied - die eigentliche Aussage - mittendrin.

Dabei ein Fehler gefunden, der jedes Protokoll betrifft: pdf_getPDFFont()
liefert Helvetica, einen Core-Font mit WinAnsi-Kodierung. Alles ausserhalb
dieses Zeichenvorrats setzt TCPDF wortlos als "?" (KB #1025). Aufgefallen
an "www.google.de -> 142.250.185.67", das im Kundendokument als
"www.google.de ? 142.250.185.67" ankam. netdiagPdfText() ersetzt die
betroffenen Zeichen jetzt in ALLEN PDF-Zweigen, also auch fuer Altdaten.
Bewusst keine Unicode-Schrift: dejavusans wuerde Schriftbild und Dateigroesse
aller Protokolle aendern. Gedankenstrich, Mittelpunkt und Anfuehrungszeichen
sind in WinAnsi enthalten und bleiben unangetastet (nachgeprueft).

Feld-Whitelist um fehlerglied, stufen, systemUrteil, validated und
captivePortal erweitert. Die letzten beiden kommen aus dem LinkInfo-Objekt
und erscheinen damit auch beim IP-Test an der Dose.

Geprueft an vier Faellen gegen die lokale Testinstanz, zwei davon die echten
Emulator-Messungen dieser Nacht (Gutfall und Flugmodus).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 22:59:49 +02:00
90cbee6e81 Geraete-Monitor: eigener PDF-Zweig statt einer Sammelzelle
Die Dauerueberwachung lief im generischen else-Zweig und wurde von
netdiagPdfFlattenResult() zu EINER |-getrennten Zeile zusammengeschoben.
Bei zehn ueberwachten Geraeten standen damit die zehn Geraete-Zeilen und
saemtliche Einzelausfaelle in einer einzigen Tabellenzelle - vollstaendig,
aber beim Kunden nicht lesbar. Dauertest und WLAN-Kanal hatten laengst je
einen Tabellen-Renderer, der Monitor nicht.

netdiagPdfMonitor() gibt jetzt aus: Kennzahlenzeile, Tabelle "Ueberwachte
Geraete", Tabelle "Einzelne Ausfaelle" mit Uhrzeiten, Hinweis zum
Messverfahren am Schluss. Tabellenkoepfe wiederholen sich nach einem
Seitenumbruch.

Die Falle dabei, gegen die im Code ein Kommentar steht: beim Dauertest
fuehrt ein gesetztes 'hinweis' zum sofortigen Abbruch der Ausgabe. Der
Monitor legt aber IMMER einen Hinweis an (das Messverfahren gehoert zur
Aussage dazu) - derselbe Aufbau haette hier bei jedem Lauf alle Zahlen
verschluckt. Nur 'fehler' bricht ab.

Obergrenze 200 Ausfallzeilen gegen ein im Sekundentakt flappendes Geraet.
Gekuerzt wird sichtbar ("... und N weitere Ausfaelle") - stilles Kuerzen
waere bei einem Abnahmebeleg eine Falschaussage.

Ausserdem: 'ausfallzeitSek' heisst jetzt "Ausfallzeit (schlechtestes
Geraet)". Der Wert ist der des schlechtesten Geraets, nicht die Summe -
bei zehn Geraeten las sich "Ausfallzeit: 8 min" wie eine Gesamtaussage.

Geprueft gegen die lokale Testinstanz mit vier konstruierten Faellen
(10 Geraete mit Aussetzern, ein durchgehend totes Geraet, 250 Ausfaelle
ueber sechs Seiten, abgerissener Lauf) und gegen die echte Monitor-
Messung aus ND2026-0016. PDF gerendert und angesehen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 22:22:02 +02:00
9f07896b05 Doku + Version 1.1.1: die Whitelist-Falle steht jetzt im README [deploy]
All checks were successful
Deploy netdiag / deploy (push) Successful in 13s
Version auf 1.1.1 gezogen — auf Prod lief sonst eine 1.1.0, die nicht der
1.1.0 im Repo entspricht (die vier Bugfixes gingen ohne Versionssprung raus).

ChangeLog 1.1.1 mit allen vier Fehlern, der Rechtelücke im GET-Zweig und den
neuen Monitor-Feldern.

README:
- Neuer Abschnitt "Neue Messart aus der App aufnehmen" mit den DREI Stellen in
  netdiag.lib.php und der Spalte "wenn vergessen". Das ist die Falle, in die
  hier schon zweimal getappt wurde - einmal mit erfundenen Testdaten, einmal
  mit 'typ' statt 'type'. Feldnamen immer aus dem erzeugenden App-Code ablesen.
- Anmeldung laeuft ueber awlauth (stand noch "JWT-Auth")
- Rechteprüfung je Endpunkt dokumentiert, inkl. der Begruendung, warum der
  GET-Zweig auch 'write' akzeptiert
- Hinweis, dass '?jwt=' nur fuer den PDF-Download existiert und in Logs landet
2026-08-16 19:56:10 +02:00
f2a5958adb Anmeldung ueber das zentrale Auth-Modul awlauth — v1.1.0 [deploy]
All checks were successful
Deploy netdiag / deploy (push) Successful in 14s
NetDiag war die letzte AWL-App mit eigenem Login: eigenes JWT, eigener Schluessel,
eigene Gueltigkeitsdauer, keine Moeglichkeit ein verlorenes Handy gezielt abzumelden.

- api/auth.php prueft das Passwort ueber awlauth_login(). Damit greifen dort auch die
  Brute-Force-Bremse (5 Fehlversuche je IP in 15 min, 10 je Benutzername in 30 min)
  und die einheitliche, nicht-verraeterische Fehlermeldung. Das Token kommt aus
  awlauth_issue_bearer() und legt eine Sitzungszeile an: das Geraet erscheint als
  "NetDiag-App · Android" in der awlauth-Geraeteliste und ist dort einzeln abmeldbar.
- netdiag_api_authenticate() prueft zuerst das awlauth-Token; ein widerrufenes Token
  fuehrt sofort zu 401, auch wenn die Signatur noch stimmt.
- Uebergangsweise gilt ein bereits ausgestelltes altes netdiag-JWT weiter, damit die
  Umstellung niemanden mitten im Einsatz aussperrt. Faellt weg, sobald alle Geraete
  einmal neu angemeldet sind.
- Ohne aktives awlauth laeuft das Modul unveraendert mit dem eigenen JWT weiter.

Die Antwortform von auth.php bleibt bewusst {token, expiresIn, user}: bereits
installierte APKs laufen nach einer einmaligen Neuanmeldung ohne Update weiter.
Haette man sie geaendert, waeren alle Geraete ausgesperrt — und die neue APK gibt es
nur ueber update.php, das Anmeldung verlangt.

CORS: Wildcard-Origin raus. Die API liefert Kundendaten aus; ein * erlaubt jeder
Webseite die Antwort auszulesen, sobald sie an ein Token kommt. Erlaubt sind jetzt nur
die App-Origins und der Vite-Dev-Server, dazu Vary: Origin. Anfragen ohne Origin
(nativer Client, APK-Downloader im Plugin, curl) sind unveraendert.

Lokal gegen das Test-Dolibarr geprueft: Login liefert awlauth-Token, Sitzungszeile
entsteht, orders.php mit Bearer = 200, falsches Passwort = 401, kein/manipuliertes
Token = 401, 4. Fehlversuch = 429 mit Wartezeit, Alt-Token = 200 (Fallback),
fremder Origin bekommt keinen CORS-Header. Anschliessend im Emulator durchgespielt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 18:23:29 +02:00
68bef9ae5a modNetDiag: Top-Menü-Eintrag im Header deaktiviert [deploy]
All checks were successful
Deploy netdiag / deploy (push) Successful in 14s
Zugriff auf NetDiag erfolgt ausschließlich über die Tabs an Kunde/Auftrag.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 07:52:25 +02:00
Eduard Wisch
44abdbbc95 Modul-ID auf 500300 — 500100 kollidierte mit globalnotify [deploy]
All checks were successful
Deploy netdiag / deploy (push) Successful in 18s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 12:15:33 +02:00
Eduard Wisch
c576726a26 Initiales Commit — Dolibarr-Modul NetDiag [deploy]
Some checks are pending
Deploy netdiag / deploy (push) Waiting to run
Netzwerk-Diagnose-Modul mit JSON-API für die NetDiag-App:
- 3 Tabellen (protocol/device/measurement), generisches JSON-result
- JSON-API: auth, customers, orders, protocols (idempotenter Sync), pdf
- JWT-Auth (HS256), CORS für die Capacitor-App
- Tabs an Thirdparty + Auftrag, Protokoll-Card, PDF-Generator
- QR-Code zum App-Download in der Modul-Konfiguration
- de_DE + en_US, Rechtesystem netdiag->protocol read/write/delete

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 12:12:11 +02:00