Rueckmeldung 22.08.2026: "ich hab auf der verwaltungs seite 2 mal dass ich
den zugangscode eingeben muss und vanvan auch, ich will es nur einmal
eingeben muessen." Berechtigt.
Die Zugangswand hat serverseitig laengst geprueft, WER da ist -- Dogfather
oder VanVan, laut Masterplan S.4 beide gleichberechtigte
Volladministratoren. Ein zweites Passwort danach bringt keinen
zusaetzlichen Schutz, es kostet nur jedes Mal Zeit.
Warum es nicht einfach "Cookie mitschicken" ist: Die Verwaltungsdaten
liegen hinter postfach.dogfather-universe.com, einem ANDEREN Rechnernamen.
Das Sitzungs-Cookie gilt dort nicht -- so sind Cookies gebaut, und das ist
gut so.
Loesung: Die Zugangswand stellt unter /webdesign/api-ausweis einen
kurzlebigen, signierten Ausweis aus, den die interne API anerkennt.
- 15 Minuten gueltig, die Seite holt bei Bedarf still einen neuen
- traegt bereich="wd-admin", damit ein Sitzungs-Token der Zugangswand
hier NICHT durchgeht und umgekehrt
- nur mit gueltiger Zugangssitzung zu bekommen
- gilt AUSSCHLIESSLICH fuer die /webdesign-Endpunkte. Postfach,
Bewerbungen, Supporter und Teamverwaltung bleiben unberuehrt
Fehlt WEBDESIGN_API_SECRET auf einer der beiden Seiten, gilt kein Ausweis
und die Verwaltung fragt wie bisher nach dem Team-Code. Ein fehlender
Konfigurationswert darf niemals eine Tuer oeffnen -- nur eine schliessen.
Genau das prueft der letzte Testfall.
Bei einem 401 wird EINMAL still ein neuer Ausweis geholt und die Anfrage
wiederholt, statt jemanden mitten im Arbeiten rauszuwerfen.
10/10 Tests, darunter: gefaelschte Signatur, fremdes Geheimnis,
abgelaufen, falscher Bereich, erfundene Rolle.
Co-Authored-By: Claude Opus 5 <[email protected]>
96 lines
4.0 KiB
Bash
96 lines
4.0 KiB
Bash
# Vorlage — echte Werte kommen in eine eigene ".env"-Datei (nie committen,
|
|
# nie in den Vault, nie in den Chat). 1:1 die gleichen Werte, die vorher per
|
|
# `wrangler secret put` bzw. in wrangler.toml [vars] gesetzt waren.
|
|
|
|
PORT=4200
|
|
DB_PATH=/var/lib/dogfather-internal/dogfather-internal.db
|
|
|
|
# ---- Owner-Zugang (Postfach/Team-Bereich) ----
|
|
# Erst-Login-Code des Hauptadministrators (Dogi). Nach dem ersten Login kann
|
|
# er über "Code ändern" durch einen in der DB gehashten Code ersetzt werden
|
|
# (siehe routes/auth.js setOwnerCode) — POSTFACH_CODE bleibt dann als reiner
|
|
# Fallback bestehen, wird aber nicht mehr benutzt, solange owner_code_hash
|
|
# in app_settings gesetzt ist.
|
|
POSTFACH_CODE=
|
|
|
|
# AES-256-Schlüssel (base64, 32 Bytes) für die reversible Team-Code-
|
|
# Verschlüsselung. Erzeugen z.B. mit: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
|
|
ENCRYPTION_KEY=
|
|
|
|
# ---- TikTok-Live-Erkennung ----
|
|
TIKTOK_USERNAME=dogfather0804
|
|
|
|
# ---- Bewerbungen: Ticketanizer ----
|
|
TICKETANIZER_API_KEY=
|
|
|
|
# ---- Bewerbungen: Discord-Benachrichtigungen (3 verschiedene Kanäle) ----
|
|
DISCORD_WEBHOOK_MODI=
|
|
DISCORD_WEBHOOK_KOOPERATION=
|
|
DISCORD_WEBHOOK_SCOUT_MANAGER=
|
|
|
|
# ---- Supporter-Abo: E-Mail (Resend) ----
|
|
RESEND_API_KEY=
|
|
RESEND_FROM=Dogfather Team <[email protected]>
|
|
|
|
# ---- Supporter-Abo: Google-Login ----
|
|
# Öffentliche Client-ID (kein Geheimnis), aber bewusst nur per .env gesetzt,
|
|
# nicht hart im Frontend-Code, damit sie zusammen mit den anderen Werten an
|
|
# einer Stelle verwaltet wird.
|
|
GOOGLE_CLIENT_ID=
|
|
|
|
# ---- Supporter-Abo: PayPal Subscriptions ----
|
|
# "sandbox" zum Testen, "live" für echte Zahlungen.
|
|
PAYPAL_ENV=sandbox
|
|
PAYPAL_CLIENT_ID=
|
|
PAYPAL_CLIENT_SECRET=
|
|
PAYPAL_PLAN_ID=
|
|
PAYPAL_WEBHOOK_ID=
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# PayPal fuer den Webdesign-Bereich (/webdesign), 22.08.2026
|
|
# Wunsch: "die gelder sollen auch sofort auf meinem paypal landen" -- deshalb
|
|
# wird mit intent=CAPTURE sofort eingezogen, nicht nur reserviert.
|
|
#
|
|
# Diese Werte kann NUR Filipe selbst erzeugen (PayPal-Business-Konto +
|
|
# Developer-App haengen an seiner Identitaet und Bankverbindung).
|
|
# Solange sie fehlen, ist die Zahlung sauber GESPERRT statt halb zu
|
|
# funktionieren -- eine Zahlung, die "irgendwie durchgeht" ohne dass Geld
|
|
# fliesst, waere der schlimmste denkbare Fehler.
|
|
# NIEMALS echte Werte hier eintragen, nur in der echten .env!
|
|
# ---------------------------------------------------------------------------
|
|
# sandbox = Testmodus ohne echtes Geld (Voreinstellung), live = Echtbetrieb
|
|
PAYPAL_ENV=sandbox
|
|
|
|
# Aus dem PayPal-Entwicklerbereich, App vom Typ "Merchant".
|
|
# Achtung: Sandbox und Live haben UNTERSCHIEDLICHE Zugangsdaten.
|
|
PAYPAL_CLIENT_ID=
|
|
PAYPAL_CLIENT_SECRET=
|
|
|
|
# Webhook fuer den Webdesign-Bereich. Bewusst eine EIGENE Webhook-Kennung,
|
|
# getrennt vom Supporter-Abo (PAYPAL_WEBHOOK_ID): sonst laesst sich der eine
|
|
# Bereich nicht abschalten, ohne den anderen mit zu treffen.
|
|
# Ziel-Adresse beim Anlegen in PayPal:
|
|
# https://postfach.dogfather-universe.com/webdesign/paypal-webhook
|
|
PAYPAL_WD_WEBHOOK_ID=
|
|
|
|
# Abo-Plaene fuer die laufende Betreuung (ab 49 EUR/Monat). Ein Plan je Paket,
|
|
# weil PayPal den Betrag am Plan festmacht, nicht am einzelnen Abo.
|
|
# Nur noetig, wenn Betreuungs-Abos ueber die Seite abgeschlossen werden sollen;
|
|
# Anzahlung und Restbetrag funktionieren auch ohne diese Werte.
|
|
PAYPAL_WD_PLAN_BASIS=
|
|
PAYPAL_WD_PLAN_PLUS=
|
|
PAYPAL_WD_PLAN_PREMIUM=
|
|
|
|
# Zusatz fuer die IP-Hashes im Webdesign-Bereich. Beliebige lange
|
|
# Zufallszeichenkette. Wird sie geaendert, passen alte Hashes nicht mehr --
|
|
# das ist unkritisch, sie dienen nur der Missbrauchserkennung.
|
|
WD_IP_SALT=
|
|
|
|
# Gegenstueck zu WEBDESIGN_API_SECRET in server/.env (22.08.2026).
|
|
# MUSS exakt derselbe Wert sein. Damit erkennt die interne API den Ausweis
|
|
# der Zugangswand an und Dogfather/VanVan muessen sich in der
|
|
# Webdesign-Verwaltung nicht ein zweites Mal anmelden.
|
|
# Der Ausweis gilt AUSSCHLIESSLICH fuer die /webdesign-Endpunkte -- Postfach,
|
|
# Bewerbungen, Supporter und Teamverwaltung bleiben unberuehrt.
|
|
WEBDESIGN_API_SECRET=
|