Warenwirtschaft: Review-Fix — AP-32-Label als Base64 übertragen (Connector 1.5.0)

Die Brücke hätte live nicht funktioniert: Connector 1.4.0 sendete die
label_url aus dem per 'deny from all' geschützten DHL-Ordner (403), dazu
SSRF-Risiko durch serverseitigen Abruf einer Client-URL und Timeout-
Mismatch (20 s Download vs. 5 s WordPress-Default). Der Connector liest
die PDF jetzt vom Shop-Dateisystem (realpath-Pinning auf wp-uploads) und
sendet sie Base64; storeWpLabel() validiert und speichert ohne Http::get;
tote Shop-Link-Fallbacks aus den Views entfernt; Connector-Timeout 30 s.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-20 10:06:39 +00:00
parent ddd6dde593
commit 1b9b6adc44
11 changed files with 173 additions and 83 deletions

View file

@ -127,17 +127,21 @@
im Tabellenkopf = alle sichtbaren) und mit **„Lieferscheine drucken"** bzw.
**„+ Rechnungen"** ein einziges PDF für den Stapeldruck erzeugen — fehlende
Dokumente werden dabei automatisch miterstellt (ohne E-Mail).
- **DHL-Label aus dem Shop (Brückenlösung, neu 17.07.2026):** Wird das
Versandetikett im WooCommerce-Shop erstellt (Plugin „DHL for WooCommerce")
und die Bestellung danach übertragen, kommen **Label und Sendungsnummer
mit**: Das System lädt eine **eigene Kopie der Label-PDF** herunter (bleibt
verfügbar, auch wenn das Label im Shop gelöscht wird) und zeigt in der
Abwicklung und den Bestell-Details einen **„Label"-Download** plus die
Sendungsnummer. Wird das Label im Shop erst später (neu) erstellt, reicht
der Shop es automatisch nach. Die Sendungsnummer wird über die
Status-Abfrage auch an den Shop zurückgemeldet (Tracking-Link für den
Endkunden). Die vollständige DHL-Anbindung im Partnercenter (Labels direkt
hier erzeugen, AP-32) bleibt geplant.
- **DHL-Label aus dem Shop (Brückenlösung, neu 17.07.2026, überarbeitet
20.07.2026):** Wird das Versandetikett im WooCommerce-Shop erstellt (Plugin
„DHL for WooCommerce") und die Bestellung danach übertragen, kommen **Label
und Sendungsnummer mit**: Der Shop-Connector (ab **Version 1.5.0**) schickt
die **Label-PDF direkt mit** (der Label-Ordner im Shop ist zugriffsgeschützt,
daher kein Link/Download über die Shop-URL); das System speichert eine
**eigene Kopie** (bleibt verfügbar, auch wenn das Label im Shop gelöscht
wird) und zeigt in der Abwicklung und den Bestell-Details einen
**„Label"-Download** plus die Sendungsnummer. Wird das Label im Shop erst
später (neu) erstellt, reicht der Shop es automatisch nach. Die
Sendungsnummer wird über die Status-Abfrage auch an den Shop zurückgemeldet
(Tracking-Link für den Endkunden). **Wichtig fürs Deployment:** Das Label
kommt erst an, wenn im Shop der Connector 1.5.0 installiert ist. Die
vollständige DHL-Anbindung im Partnercenter (Labels direkt hier erzeugen,
AP-32) bleibt geplant.
### In Vorbereitung / geplant

View file

@ -165,7 +165,7 @@
- Wird das DHL-Etikett **im WooCommerce-Shop** erstellt und die Bestellung danach übertragen, speichert das System eine **eigene Kopie der Label-PDF** und die **Sendungsnummer** an der Bestellung.
- In der Abwicklung erscheint bei der Bestellung ein **„Label"-Download** (neben dem externen Rechnungslink) samt Sendungsnummer; ebenso in den Bestell-Details.
- Wird das Label im Shop erst **nach** der Übertragung erstellt (oder neu erstellt), reicht der Shop es automatisch nach — es taucht dann ohne weiteres Zutun in der Abwicklung auf.
- Voraussetzung: das kleine Update des Verbindungs-Plugins im WooCommerce-Shop ist eingespielt.
- Voraussetzung: das Update des Verbindungs-Plugins im WooCommerce-Shop auf **Version 1.5.0** ist eingespielt (überträgt die Label-PDF direkt; mit älterem Connector kommt nur die Sendungsnummer an).
**So testen:** Im Shop eine Testbestellung mit DHL-Label versehen → Bestellung ins Partnercenter übertragen → in der **Abwicklung** bei der Bestellung auf **„Label"** klicken (PDF öffnet sich) und die Sendungsnummer prüfen. Danach einmal andersherum: Bestellung zuerst übertragen, Label im Shop erst danach erstellen → Seite neu laden, der Label-Download muss nachträglich erscheinen.

View file

@ -185,15 +185,12 @@
@else
<span class="text-muted small">{{ __('extern') }}</span>
@endif
{{-- AP-32 Brückenlösung: DHL-Label aus dem Shop (lokale Kopie, sonst Shop-Link) --}}
{{-- AP-32 Brückenlösung: DHL-Label aus dem Shop (lokale Kopie; die Shop-URL
ist zugriffsgeschützt und wird bewusst nicht verlinkt, Review 20.07.2026) --}}
@if ($order->wp_label_path)
<a href="{{ route('admin.inventory.orders.document', [$order->id, 'label']) }}" target="_blank" title="{{ __('DHL-Label') }}" class="ml-1">
<span class="fas fa-tag"></span> {{ __('Label') }}
</a>
@elseif ($order->wp_label_url)
<a href="{{ $order->wp_label_url }}" target="_blank" rel="noopener" title="{{ __('DHL-Label (extern im Shop)') }}" class="ml-1">
<span class="fas fa-tag"></span> {{ __('Label') }}
</a>
@endif
@if ($order->tracking)
<div class="small text-muted" title="{{ __('Sendungsnummer') }}">{{ $order->tracking }}</div>

View file

@ -618,20 +618,18 @@
@if ($shopping_order->txaction === 'extern')
<div class="card-body">
@if ($shopping_order->wp_invoice_path || $shopping_order->wp_label_path || $shopping_order->wp_label_url)
@if ($shopping_order->wp_invoice_path || $shopping_order->wp_label_path || $shopping_order->tracking)
<div class="row">
<div class="col-sm-12">
@if ($shopping_order->wp_invoice_path)
<a href="{{ $shopping_order->wp_invoice_path }}" target="_blank"
class="btn btn-secondary btn-sm">Link zur Rechnung</a>
@endif
{{-- AP-32 Brückenlösung: DHL-Label aus dem WooCommerce-Shop --}}
{{-- AP-32 Brückenlösung: DHL-Label aus dem WooCommerce-Shop (lokale Kopie;
die Shop-URL ist zugriffsgeschützt und wird bewusst nicht verlinkt) --}}
@if ($shopping_order->wp_label_path)
<a href="{{ route('admin.inventory.orders.document', [$shopping_order->id, 'label']) }}" target="_blank"
class="btn btn-secondary btn-sm"><span class="fas fa-tag"></span> DHL-Label</a>
@elseif ($shopping_order->wp_label_url)
<a href="{{ $shopping_order->wp_label_url }}" target="_blank" rel="noopener"
class="btn btn-secondary btn-sm"><span class="fas fa-tag"></span> DHL-Label (Shop)</a>
@endif
@if ($shopping_order->tracking)
<span class="text-muted small ml-2">Sendungsnummer: {{ $shopping_order->tracking }}</span>