Alle vier durch eine systematische Gegenpruefung des echten Codes gefunden,
nicht durch Symptome — sie waren bereits ausgeliefert und still.
1. Whitelist-Schluessel 'typ' existiert nicht. Die App liefert das
LinkInfo-Objekt durch, dort heisst das Feld 'type' (app/src/lib/types.ts).
Folge: im Kundendokument fehlte ausgerechnet beim IP-Test an der Dose die
Angabe, ob per LAN oder WLAN gemessen wurde - bei einem Abnahmebeleg die
halbe Aussage. Zusaetzlich 'rssi' aufgenommen: bei einer WLAN-Dose IST der
Empfangspegel der Messwert, er wurde bisher verworfen.
Die Rohwerte sind englisch; netdiagKundentext() bildet sie jetzt ab
('ethernet' -> 'LAN (Kabel)'), sonst stuende "Anschlussart: ethernet" im
Abnahmeprotokoll eines deutschen Handwerksbetriebs.
2. Leeres Array druckte "Offene Ports: " ohne Wert. Die Leerpruefung ist ein
elseif hinter dem Array-Zweig und wurde nie erreicht. Betraf ausgerechnet
die GUTEN Ergebnisse: Portscan ohne offenen Port, IP-Konflikt ohne
Konflikt, IP-Scan ohne Veraenderung. Jetzt "keine" - Weglassen waere
schlechter, weil der Kunde sonst nicht unterscheiden kann, ob nichts
gefunden oder nichts geprueft wurde.
3. 'error' fehlte in der Whitelist. Der IP-Konflikt gibt im Abbruchfall
{ error: ... } mit roter Ampel zurueck - im Kundendokument stand eine rote
Ampel ohne einen Buchstaben Erklaerung. Die App vereinheitlicht kuenftig
auf 'fehler', aber Altdaten lassen sich nicht aendern.
4. tool/category/label wurden beim Sync nicht auf die Spaltenlaenge gekuerzt
(varchar 64/32/255). Bei striktem SQL-Modus kippt EIN zu langes Label den
gesamten Sync per rollback() - der Techniker steht beim Kunden mit einem
Protokoll da, das sich nicht abschliessen laesst, weil eine Beschriftung zu
lang war. Die App setzt Labels durch Verketten zusammen, 255 Zeichen sind
erreichbar. found_via wurde 20 Zeilen darueber laengst gekappt.
Ausserdem:
- GET-Zweig der API prueft jetzt eine Berechtigung. Bisher konnte jeder
angemeldete Benutzer mit einer geratenen ID ein fremdes Protokoll samt
Geraeteliste, IP-Adressen und offenen Ports abrufen. 'write' wird bewusst
mit akzeptiert: die Rechte sind in Dolibarr einzeln vergebbar, und ein
Techniker mit Schreib- ohne ausdruecklichem Leserecht duerfte nicht
ausgesperrt werden - das waere erst beim Kunden aufgefallen.
- netdiagDauerLesbar: "1 Tage 0 Std" -> "1 Tag". floor() liefert einen Float,
1.0 === 1 ist in PHP false.
Geprueft: php -l, und netdiagFeldFuerKunde() mit 13 echten Faellen gegen die
lokale Instanz durchgerechnet (LAN/WLAN/Mobilfunk, leere und gefuellte Arrays,
error/fehler, tote Schluessel, Interna).