Skip to content

fix(portal): identity header deleted-after-set → portal showed no data - #183

Merged
CallMeTechie merged 1 commit into
masterfrom
fix/portal-identity-header-delete-set
Jun 25, 2026
Merged

CallMeTechie merged 1 commit into
masterfrom
fix/portal-identity-header-delete-set

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

Symptom

Das VPN-Landing-Portal (home.domaincaster.com) rendert die Seite, aber alle Widgets (Gerät, Traffic, Dienste) zeigen „Gerätedaten nicht verfügbar".

Root Cause (live diagnostiziert)

Der Request kommt intern korrekt an (remote_ip=10.8.0.5, 200), aber portalIdentity etabliert nie eine Peer-Identität → jeder /api/v1/portal/*-Call liefert unidentified.

Ursache: Die Portal-Gate-Route setzte den Identitäts-Header X-GC-Portal-Peer-IP UND löschte ihn im selben headers.request-Block (delete + set). Caddy wendet delete NACH set an → der gerade gesetzte Wert wird wieder entfernt → Node bekommt den Header nie → keine Identität.

Empirisch gegen die Live-Caddy-Admin-API bestätigt:

  • delete + set auf demselben Header → Upstream empfängt undefined.
  • set allein → Upstream empfängt den vertrauenswürdigen Wert und überschreibt einen client-gefälschten Header (Forgery-Schutz bleibt intakt).

Fix

Auf der Portal-Gate-Route nur noch set (kein delete). set ersetzt jeden client-gelieferten Wert mit {http.request.remote.host} (echte TCP-Quelle) → sicher. Der Management-vhost behält delete-only (korrekt — er strippt den Header nur).

Latenter Bug seit Portal-Phase-1 — erst sichtbar, seit das Portal über einen öffentlichen Host real genutzt wird.

Tests

Neuer Regressionstest: Gate-Route SETZT den Header und löscht ihn NICHT. portal_dns_caddy 6/6, volle Portal-Suite 60/60 grün.

🤖 Generated with Claude Code

…wed no data

The portal landing page rendered but every widget said 'Gerätedaten nicht verfügbar':
portalIdentity never saw X-GC-Portal-Peer-IP, so every /api/v1/portal/* call returned
'unidentified'. Root cause: the portal gate route's reverse_proxy set the header AND
also deleted it in the same headers.request block. Caddy applies `delete` AFTER `set`,
so the just-set value was nuked and Node received nothing. Empirically confirmed against
the live Caddy admin API (delete+set -> header undefined; set-only -> trusted value, and
it still overwrites a client-forged copy, so forgery protection is intact).

Fix: SET only on the portal gate route (set already replaces any client-supplied copy).
The management vhost keeps delete-only (correct — it just strips the header). Latent since
portal Phase 1; only surfaced now that the portal is actually reachable via a public host.

Adds a regression test asserting the gate route SETs the header and does NOT also delete it.
@CallMeTechie
CallMeTechie merged commit 27f4537 into master Jun 25, 2026
8 checks passed
@CallMeTechie
CallMeTechie deleted the fix/portal-identity-header-delete-set branch June 25, 2026 09:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant