Skip to content

Bug: POST /v1/dateien ignoriert stichwoerter (Datei-Objekt-Zuordnung) #245

@Avatarsia

Description

@Avatarsia

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions