/** * Adressen der Anwendung nach aussen (#007). * * Massgeblich ist APP_URL, nicht die eingehende Anfrage. Hinter einem Reverse * Proxy traegt die Anfrage den internen Host und oft auch das falsche Schema – * eine daraus gebaute Umleitung schickt den Benutzer dann an eine Adresse, die * er gar nicht erreicht, und eine daraus gebaute OIDC-Rueckruf-Adresse passt * nicht zu der beim Anbieter hinterlegten. * * Die Herkunft der Anfrage dient nur als Notnagel, damit die Anwendung auch ohne * gesetzte APP_URL nicht stehen bleibt. */ export function oeffentlicheAdresse(pfad: string, ersatzHerkunft: string): URL { const basis = process.env["APP_URL"]?.trim(); if (basis) { try { return new URL(pfad, basis); } catch { // Eine unbrauchbare APP_URL soll die Anmeldung nicht blockieren. } } return new URL(pfad, ersatzHerkunft); } /** * Die Basisadresse der Anwendung – **mit** ihrem Pfad (#014). * * `oeffentlicheAdresse` loest einen absoluten Pfad gegen die Basis auf, und * dabei faellt ein Unterpfad heraus: aus `https://firma.de/laufzettel` und * `/t/LZ-…` wird `https://firma.de/t/LZ-…`. Fuer eine Umleitung im laufenden * Betrieb faellt das niemandem auf, weil der Reverse Proxy den Pfad ohnehin * wieder anhaengt. Auf einem **gedruckten Aufkleber** ist es das Ende: er zeigt * fuer immer ins Leere. * * Wer eine Adresse baut, die jemand behaelt, nimmt deshalb diese Basis und * haengt relativ an. Der Schraegstrich am Ende entscheidet darueber, ob das * letzte Pfadstueck ersetzt oder ergaenzt wird — er wird hier gesetzt, statt * darauf zu hoffen. */ export function basisAdresse(ersatzHerkunft: string): URL { const roh = process.env["APP_URL"]?.trim(); let basis: URL; try { basis = new URL(roh || ersatzHerkunft); } catch { // Eine unbrauchbare APP_URL soll den Druck nicht blockieren. basis = new URL(ersatzHerkunft); } if (!basis.pathname.endsWith("/")) basis.pathname += "/"; return basis; }