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]>
This commit is contained in:
@@ -0,0 +1,207 @@
|
|||||||
|
#!/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
|
||||||
Reference in New Issue
Block a user