Bug: POST /v1/dateien ignoriert stichwoerter (Datei-Objekt-Zuordnung)
Problem
Beim Hochladen einer Datei über die REST v1 API (POST /v1/dateien) werden die stichwoerter-Felder (Objekt-Zuordnung zu Auftrag, Kunde, Artikel etc.) stillschweigend ignoriert. Die Datei wird erstellt, aber ohne Zuordnung zu einem ERP-Objekt. Im UI erstellte Dateien haben die Zuordnung korrekt.
Reproduktion
curl -X POST "http://localhost/api/index.php/v1/dateien" \
--digest -u "user:pass" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "dateiname=test.txt&titel=Test&file_content=dGVzdA==&stichwoerter[0][modul]=auftrag&stichwoerter[0][id]=1&stichwoerter[0][stichwort]=Sonstige"
Ergebnis: Datei wird erstellt (HTTP 201), aber datei_stichwoerter-Tabelle enthält keinen Eintrag. Die Datei taucht im UI nicht beim zugeordneten Auftrag auf.
Root Cause
Zwei Bugs in classes/Modules/Api/Controller/Version1/FileController.php:
Bug A: Variable-Scoping (Zeile 130-176)
// Zeile 130 — $stichwoerter wird NUR innerhalb des if-Blocks definiert
if (is_array($input['stichwoerter'])) {
$stichwoerter = array(); // ← nur hier definiert
// ... validation ...
}
// ... CreateDatei() ...
// Zeile 176 — aber AUSSERHALB verwendet
foreach ($stichwoerter as $stichwort) { // ← undefined wenn if nicht betreten
$erp->AddDateiStichwort(...);
}
Wenn $input['stichwoerter'] nicht existiert oder kein Array ist, wird $stichwoerter nie initialisiert. Der foreach iteriert über eine undefinierte Variable — das erzeugt eine PHP-Warning, die aber durch error_reporting(E_ERROR) in www/api/index.php unterdrückt wird. Ergebnis: stille Fehlschlag.
Bug B: Fehlender isset()-Check (Zeile 130)
if (is_array($input['stichwoerter'])) { // ← PHP Notice wenn Key nicht existiert
Sollte isset() verwenden:
if (isset($input['stichwoerter']) && is_array($input['stichwoerter'])) {
Zusätzlich: getDateiTypen() fehlt auftrag-Case
getDateiTypen('auftrag') in class.erpapi.php:37222 hat keinen case 'auftrag' im Switch und gibt nur die Standard-Typen (Sonstige, Deckblatt, anhang) zurück. Werte wie Anlage werden abgelehnt, obwohl das UI sie akzeptiert.
Vergleich: UI vs API
| Aspekt |
UI (class.yui.php:14596) |
API (FileController.php) |
| Stichwort-Validierung |
Keine — alles akzeptiert |
Streng gegen getDateiTypen() |
| Variable-Init |
Nicht noetig (direkter Aufruf) |
Nur im if-Block definiert |
| Error Reporting |
Standard |
E_ERROR (Warnings unterdrueckt) |
| AddDateiStichwort |
Immer aufgerufen |
Nur wenn $stichwoerter definiert |
Vorgeschlagener Fix
Minimaler Fix (2 Zeilen):
In classes/Modules/Api/Controller/Version1/FileController.php:
+ $stichwoerter = array(); // Vor den if-Block verschieben
- if (is_array($input['stichwoerter'])) {
- $stichwoerter = array();
+ if (isset($input['stichwoerter']) && is_array($input['stichwoerter'])) {
// ... bestehende Validierung ...
}
Optionaler erweiterter Fix:
In www/lib/class.erpapi.php, Funktion getDateiTypen() (Zeile 37222) — auftrag-Case ergaenzen:
case 'auftrag':
$typen[] = 'Auftragsbestaetigung';
$typen[] = 'Anlage';
$typen[] = 'Zeichnung';
break;
Betroffene Dateien
| Datei |
Zeile |
Beschreibung |
classes/Modules/Api/Controller/Version1/FileController.php |
130-176 |
Variable-Scoping + fehlender isset() |
www/api/index.php |
~ |
error_reporting(E_ERROR) maskiert den Bug |
www/lib/class.erpapi.php |
37222 |
getDateiTypen() fehlt auftrag-Case |
phpwf/plugins/class.yui.php |
14596 |
UI-Code der korrekt funktioniert (zum Vergleich) |
Umgebung
- OpenXE v1.12
- PHP 8.1
- Gefunden durch MCP-Server Live-Tests
Bug: POST /v1/dateien ignoriert stichwoerter (Datei-Objekt-Zuordnung)
Problem
Beim Hochladen einer Datei über die REST v1 API (
POST /v1/dateien) werden diestichwoerter-Felder (Objekt-Zuordnung zu Auftrag, Kunde, Artikel etc.) stillschweigend ignoriert. Die Datei wird erstellt, aber ohne Zuordnung zu einem ERP-Objekt. Im UI erstellte Dateien haben die Zuordnung korrekt.Reproduktion
Ergebnis: Datei wird erstellt (HTTP 201), aber
datei_stichwoerter-Tabelle enthält keinen Eintrag. Die Datei taucht im UI nicht beim zugeordneten Auftrag auf.Root Cause
Zwei Bugs in
classes/Modules/Api/Controller/Version1/FileController.php:Bug A: Variable-Scoping (Zeile 130-176)
Wenn
$input['stichwoerter']nicht existiert oder kein Array ist, wird$stichwoerternie initialisiert. Derforeachiteriert über eine undefinierte Variable — das erzeugt eine PHP-Warning, die aber durcherror_reporting(E_ERROR)inwww/api/index.phpunterdrückt wird. Ergebnis: stille Fehlschlag.Bug B: Fehlender isset()-Check (Zeile 130)
Sollte
isset()verwenden:Zusätzlich: getDateiTypen() fehlt auftrag-Case
getDateiTypen('auftrag')inclass.erpapi.php:37222hat keinencase 'auftrag'im Switch und gibt nur die Standard-Typen (Sonstige,Deckblatt,anhang) zurück. Werte wieAnlagewerden abgelehnt, obwohl das UI sie akzeptiert.Vergleich: UI vs API
Vorgeschlagener Fix
Minimaler Fix (2 Zeilen):
In
classes/Modules/Api/Controller/Version1/FileController.php:Optionaler erweiterter Fix:
In
www/lib/class.erpapi.php, FunktiongetDateiTypen()(Zeile 37222) —auftrag-Case ergaenzen:Betroffene Dateien
classes/Modules/Api/Controller/Version1/FileController.phpwww/api/index.phpwww/lib/class.erpapi.phpphpwf/plugins/class.yui.phpUmgebung