Files
dogfather-universe/server-internal/paypal-einrichten.sh
T
DogFatherGitandClaude Opus 5 692d702ebf Einrichtungsskript fuer PayPal -- Filipe tippt nur die Werte
Auf Wunsch, die Werte selbst einzutragen, zuerst geprueft statt vermutet:

  sudo erlaubt claudian: apt, apt-get, systemctl, docker, docker-compose
  /home/dogiintern/        -> Keine Berechtigung
  .../server-internal/.env -> Keine Berechtigung

Der Zugriff fehlt also technisch, und das ist die Trennung, die Filipe am
08.08.2026 bewusst so eingerichtet hat. Selbst mit Zugriff waere es
falsch: Damit ich die Werte eintrage, muesste das Secret durch den
Chatverlauf wandern und stuende dort dauerhaft.

Also alles abnehmen, was NICHT das Eintippen ist:

paypal-einrichten.sh fragt die vier Werte nacheinander ab, zeigt zu jedem
an, ob schon etwas hinterlegt ist (ENTER = behalten), legt vorher eine
Sicherung an, setzt die Rechte auf 600, startet den Dienst neu und meldet
den Stand.

DREI DINGE, DIE DAS SKRIPT RICHTIG MACHT

Das Secret wird mit "read -s" eingelesen -- es erscheint weder auf dem
Bildschirm noch in der Bash-History. Auch die Abschlussmeldung zeigt nur
die LAENGE, nie den Wert.

Geschrieben wird mit awk und dem Wert in einer Variablen, NICHT mit
"sed -i". Ein PayPal-Secret kann &, \, $, / und Anfuehrungszeichen
enthalten; sed liest davon mehrere als Befehl und haette den Wert still
zerstoert. Der Fehler waere erst bei der ersten echten Zahlung
aufgefallen, mit der Meldung "invalid client" -- und dann sucht man an
der falschen Stelle.

Gegengeprueft mit dem Secret  A&B/C\D$E"F~G : zeichengenau in der Datei
angekommen, umliegende Zeilen unveraendert, vorhandener Schluessel
ersetzt statt ein zweites Mal angehaengt.

Laeuft der Dienst nach dem Neustart nicht, nennt das Skript den Pfad der
Sicherung und den fertigen Befehl zum Zurueckholen -- in dem Moment will
niemand erst suchen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-23 16:43:32 +02:00

208 lines
7.0 KiB
Bash

#!/bin/bash
# =====================================================================
# paypal-einrichten.sh — trägt die PayPal-Werte in die .env ein
#
# WARUM ES DIESES SKRIPT GIBT
#
# Claudian hat keinen Zugriff auf /home/dogiintern und darf per sudo nur
# apt, systemctl und docker ausführen. Die .env kann also nur Filipe
# selbst beschreiben — und das ist richtig so: Ein Zugangsschlüssel, mit
# dem sich Geld bewegen lässt, sollte nicht durch einen Chatverlauf
# wandern.
#
# Dieses Skript nimmt ihm alles ab, was NICHT das Eintippen der Werte
# ist: Sicherung anlegen, richtige Zeilen finden, Sonderzeichen
# schützen, Rechte setzen, Dienst neu starten, Ergebnis prüfen.
#
# Es zeigt zu keinem Zeitpunkt einen Schlüssel an — auch nicht in der
# Ausgabe am Ende, auch nicht in der Bash-History.
#
# AUFRUF (als dogiintern, weil ihm die Datei gehört):
# sudo -u dogiintern bash /home/dogiintern/dogfather-universe/server-internal/paypal-einrichten.sh
# =====================================================================
set -u
ENV_DATEI="/home/dogiintern/dogfather-universe/server-internal/.env"
if [ ! -f "$ENV_DATEI" ]; then
echo "FEHLER: $ENV_DATEI gibt es nicht."
echo "Läuft das Skript als dogiintern? Aufruf siehe Kopf der Datei."
exit 1
fi
if [ ! -w "$ENV_DATEI" ]; then
echo "FEHLER: keine Schreibrechte auf $ENV_DATEI."
echo "Bitte mit sudo -u dogiintern bash <datei> starten."
exit 1
fi
echo
echo "==================================================================="
echo " PayPal für den Webdesign-Bereich einrichten"
echo "==================================================================="
echo
echo "Zu jedem Wert siehst du, ob schon etwas hinterlegt ist."
echo "ENTER ohne Eingabe = bisherigen Wert behalten."
echo
echo "Werte werden NICHT angezeigt und NICHT protokolliert."
echo
# ---- Sicherung ------------------------------------------------------
# Vor jeder Änderung. Wenn etwas schiefgeht, ist der alte Stand einen
# Kopierbefehl entfernt -- das ist die billigste Versicherung überhaupt.
SICHERUNG="${ENV_DATEI}.vor-paypal-$(date +%Y%m%d-%H%M%S)"
cp -p "$ENV_DATEI" "$SICHERUNG"
chmod 600 "$SICHERUNG"
echo "Sicherung angelegt: $SICHERUNG"
echo
# ---- Hilfsfunktionen ------------------------------------------------
# Ist der Schlüssel schon gefüllt? Gibt nur ja/nein zurück, nie den Wert.
schon_da() {
grep -qE "^$1=.+" "$ENV_DATEI" && echo "ja" || echo "nein"
}
# Schreibt einen Wert. Ersetzt eine vorhandene Zeile, hängt sonst an.
#
# Bewusst OHNE sed -i mit dem Wert im Muster: Ein Secret kann Zeichen
# enthalten, die sed als Befehl liest (& / \). Stattdessen wird die Datei
# zeilenweise mit awk umgeschrieben und der Wert über eine Variable
# übergeben -- so kann er nichts auslösen.
setze() {
local schluessel="$1"
local wert="$2"
local tmp
tmp="$(mktemp)"
chmod 600 "$tmp"
if grep -qE "^${schluessel}=" "$ENV_DATEI"; then
awk -v k="$schluessel" -v v="$wert" '
$0 ~ "^" k "=" { print k "=" v; getroffen=1; next }
{ print }
END { if (!getroffen) print k "=" v }
' "$ENV_DATEI" > "$tmp"
else
cat "$ENV_DATEI" > "$tmp"
printf '%s=%s\n' "$schluessel" "$wert" >> "$tmp"
fi
cat "$tmp" > "$ENV_DATEI" # Inhalt ersetzen, Eigentümer/Rechte bleiben
rm -f "$tmp"
}
# Fragt einen Wert ab. -s = Eingabe wird nicht angezeigt.
frage() {
local schluessel="$1"
local beschreibung="$2"
local geheim="$3"
local stand
stand="$(schon_da "$schluessel")"
echo "-------------------------------------------------------------------"
echo "$beschreibung"
if [ "$stand" = "ja" ]; then
echo " -> ist bereits hinterlegt. ENTER = so lassen."
else
echo " -> noch leer."
fi
local eingabe=""
if [ "$geheim" = "geheim" ]; then
read -r -s -p " Wert (wird nicht angezeigt): " eingabe
echo
else
read -r -p " Wert: " eingabe
fi
if [ -z "$eingabe" ]; then
echo " übersprungen."
else
setze "$schluessel" "$eingabe"
echo " gespeichert (${#eingabe} Zeichen)."
fi
# Variable sofort leeren, damit der Wert nicht länger im Speicher steht
# als nötig.
eingabe=""
echo
}
# ---- Die Werte ------------------------------------------------------
echo "1) Betriebsart"
echo "-------------------------------------------------------------------"
AKTUELL_ENV="$(grep -E '^PAYPAL_ENV=' "$ENV_DATEI" | head -1 | cut -d= -f2-)"
echo " aktuell: ${AKTUELL_ENV:-nicht gesetzt}"
echo " live = echtes Geld"
echo " sandbox = Testbetrieb ohne echtes Geld"
read -r -p " live oder sandbox? (ENTER = so lassen): " NEU_ENV
if [ -n "${NEU_ENV:-}" ]; then
case "$NEU_ENV" in
live|sandbox) setze "PAYPAL_ENV" "$NEU_ENV"; echo " gesetzt auf $NEU_ENV." ;;
*) echo " FEHLER: nur 'live' oder 'sandbox' erlaubt. Nicht geändert." ;;
esac
fi
echo
frage "PAYPAL_CLIENT_ID" \
"2) Client ID (developer.paypal.com -> Apps & Credentials)" "offen"
frage "PAYPAL_CLIENT_SECRET" \
"3) Secret (dort auf 'Show' klicken)" "geheim"
frage "PAYPAL_WD_WEBHOOK_ID" \
"4) Webhook ID (beginnt mit WH-, aus dem Webhook aus Phase 5)" "offen"
echo "-------------------------------------------------------------------"
echo "5) Abo-Plan für die monatliche Betreuung"
echo " Nur nötig, wenn Betreuungs-Abos über die Seite laufen sollen."
echo " Anzahlung und Restbetrag funktionieren auch ohne."
frage "PAYPAL_WD_PLAN_BASIS" " Plan ID (beginnt mit P-) oder ENTER zum Überspringen" "offen"
# ---- Ergebnis -------------------------------------------------------
chmod 600 "$ENV_DATEI"
echo "==================================================================="
echo " Stand danach"
echo "==================================================================="
for k in PAYPAL_ENV PAYPAL_CLIENT_ID PAYPAL_CLIENT_SECRET PAYPAL_WD_WEBHOOK_ID PAYPAL_WD_PLAN_BASIS; do
if [ "$k" = "PAYPAL_ENV" ]; then
printf " %-24s %s\n" "$k" "$(grep -E "^$k=" "$ENV_DATEI" | head -1 | cut -d= -f2-)"
else
# Nur Länge zeigen, nie den Wert.
laenge="$(grep -E "^$k=" "$ENV_DATEI" | head -1 | cut -d= -f2- | wc -c)"
if [ "$laenge" -gt 1 ]; then
printf " %-24s gesetzt (%s Zeichen)\n" "$k" "$((laenge - 1))"
else
printf " %-24s LEER\n" "$k"
fi
fi
done
echo
echo "Dienst wird neu gestartet ..."
if sudo systemctl restart dogiintern.service 2>/dev/null; then
sleep 2
ZUSTAND="$(systemctl is-active dogiintern.service 2>/dev/null || echo unbekannt)"
echo " dogiintern.service: $ZUSTAND"
if [ "$ZUSTAND" != "active" ]; then
echo
echo " ACHTUNG: Der Dienst läuft nicht. Die Sicherung liegt hier:"
echo " $SICHERUNG"
echo " Zurückholen mit:"
echo " cp $SICHERUNG $ENV_DATEI && sudo systemctl restart dogiintern.service"
fi
else
echo " Neustart nicht möglich (fehlende Rechte?). Bitte selbst ausführen:"
echo " sudo systemctl restart dogiintern.service"
fi
echo
echo "Fertig. Prüf jetzt in der Verwaltung unter 'Zahlungen', ob dort"
echo "'PayPal ist eingerichtet' steht — und mach dann den 1-Euro-Test."
echo
echo "Die Sicherung kannst du löschen, wenn alles läuft:"
echo " rm $SICHERUNG"
echo