#!/usr/bin/env bash # ===================================================================== # notfall-code.sh — der Weg zurück, wenn niemand mehr hineinkommt. # # ANLASS (02.09.2026): Filipe hat sich einen neuen Zugangscode erzeugt # und wurde in derselben Sekunde abgemeldet, in der der Code auf dem # Bildschirm erschien. Der Code war weg, bevor er ihn abschreiben # konnte -- und damit auch der Zugang zum ganzen Workspace. # # Beides ist repariert (die eigene Sitzung bleibt jetzt bestehen, und # der Kasten mit dem Code verschwindet nicht mehr von selbst). Trotzdem # gehört dieser Weg hierher: Ein System, aus dem man sich aussperren # kann, braucht eine Tür, die von außen aufgeht. # # WARUM KEIN "NOTFALL-CODE" IN DER ANWENDUNG: # Ein zweiter, fest hinterlegter Code wäre eine Hintertür, die dauerhaft # offensteht -- jeden Tag, für jeden, der ihn findet, ohne dass es # jemandem auffällt. Dieser Weg hier ist genau umgekehrt: Er verlangt # Zugang zum Server, hinterlässt einen Eintrag im Protokoll, und es gibt # nichts, was man erraten könnte. # # AUFRUF (auf dem Server, als dogi): # sudo -u dogiweb bash /home/dogiweb/dogfather-universe/tools/notfall-code.sh # # Ohne Namen nimmt es DogFather. Für jemand anderen: # ... notfall-code.sh "Cigdem" # # WICHTIG: Das "-u dogiweb" muss dranbleiben. Als root ausgeführt gehören # die entstehenden Hilfsdateien der Datenbank danach root, und der Dienst # kann nicht mehr schreiben -- dann ist mehr kaputt als vorher. # ===================================================================== set -euo pipefail WER="${1:-Dogfather}" SERVER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../server" && pwd)" # Das Hilfsskript liegt NEBEN workspace.js, nicht in /tmp: Ein # ES-Modul loest "./workspace.js" gegen seinen eigenen Ort auf, nicht # gegen das Arbeitsverzeichnis. Aus /tmp heraus fand es die Anwendung # nicht -- und ein absoluter Pfad im Import ist nicht auf jedem System # gleich (unter Windows/Git-Bash sieht er anders aus als unter Linux). SKRIPT="$SERVER_DIR/.notfall-code-$$.mjs" trap 'rm -f "$SKRIPT"' EXIT if [ "$(id -un)" = "root" ]; then echo "ABBRUCH: Nicht als root ausführen." >&2 echo "So ist es richtig: sudo -u dogiweb bash $0 ${1:-}" >&2 exit 1 fi cat > "$SKRIPT" < p.name.toLowerCase() === gesucht.toLowerCase()); if (!person) { console.log("\nKeine aktive Person namens \"" + gesucht + "\"."); console.log("Vorhanden sind:"); for (const p of alle) console.log(" " + p.name + " (" + p.rolle + ")"); process.exit(1); } const neu = codeNeu(person.id, { id: null, rolle: null, ip: "notfall-skript" }); /* Die Sperre nach acht Fehlversuchen mit aufheben. Wer sich gerade ausgesperrt hat, hat es meist mehrfach versucht -- und stünde sonst mit einem gültigen Code vor einer verschlossenen Tür. */ const gesperrt = db().prepare("SELECT COUNT(*) AS n FROM versuche").get().n; db().prepare("DELETE FROM versuche").run(); console.log(""); console.log("========================================================="); console.log(" NEUER ZUGANGSCODE"); console.log(""); console.log(" Person: " + neu.name); console.log(" Rolle: " + neu.rolle); console.log(""); console.log(" " + neu.code); console.log(""); console.log(" Genau so eintippen - mit Bindestrichen, Grossbuchstaben."); console.log(" Er wird zeichengenau geprueft, ohne Korrektur."); console.log(""); console.log(" Danach sofort nach Bitwarden. Nicht in eine Notiz."); if (gesperrt) console.log(" (" + gesperrt + " Fehlversuche geloescht - keine Wartezeit.)"); console.log("========================================================="); console.log(""); SKRIPTENDE node "$SKRIPT" "$WER"