WIP Vorrang umgedreht (Test folgt auf dem Server)

This commit is contained in:
2026-08-23 18:09:39 +02:00
parent d870a9c1d7
commit ebe10b9c49
2 changed files with 54 additions and 17 deletions
+41 -14
View File
@@ -18,16 +18,35 @@
(lib/crypto.js). Wer die Datenbankdatei in die Hände bekommt -- (lib/crypto.js). Wer die Datenbankdatei in die Hände bekommt --
etwa über eine alte Sicherungskopie -- hat damit noch nichts. etwa über eine alte Sicherungskopie -- hat damit noch nichts.
2. DIE .env BLEIBT GÜLTIG und hat VORRANG. Wer die Werte lieber 2. WAS IN DER VERWALTUNG STEHT, GILT. Die .env ist der Rückfall.
klassisch dort pflegt, kann das weiter tun; das Supporter-Abo
benutzt dieselben zwei Werte und läuft womöglich längst darüber.
Die Datenbank ist die Ergänzung für alles, was dort noch fehlt --
nicht ein zweiter, konkurrierender Ort.
Vorrang für die .env und nicht umgekehrt, weil sonst ein Eintrag ⚠️ Das war zuerst andersherum, und die Umkehr hat einen konkreten
im Browser stillschweigend eine funktionierende Servereinstellung Anlass (23.08.2026).
aushebeln könnte. Ein Fehlgriff in einem Formular darf keinen
laufenden Zahlungsverkehr umleiten. Ursprünglich hatte die .env Vorrang -- mit dem Gedanken, dass ein
Fehlgriff im Formular keine funktionierende Servereinstellung
aushebeln soll. Das klingt vorsichtig, war aber falsch:
In der .env stand PAYPAL_ENV=sandbox. Filipe stellte im Formular
auf "Echtbetrieb" -- und nichts geschah, weil der Serverwert
gewann. Seine echten Zugangsdaten wurden gegen den TESTSERVER von
PayPal geprüft, der sie zwangsläufig ablehnte. Die Meldung lautete
"PayPal hat die Anmeldung abgelehnt" und zeigte damit auf die
Zugangsdaten statt auf die Betriebsart.
Ein Formular mit Schaltern, die nichts bewirken, ist schlimmer als
gar kein Formular: Es behauptet eine Wirkung, die es nicht hat, und
schickt einen bei der Fehlersuche in die falsche Richtung.
Der Sinn dieser Ablage ist gerade, dass Filipe die Werte OHNE SSH
setzen kann. Dann muss das, was er dort einträgt, auch gelten.
Gefährlich ist das nicht: Diese Werte werden ausschliesslich vom
Webdesign-Bereich gelesen. Das DogiCrew-Supporter-Abo hat sein
eigenes Modul (lib/paypal.js) und liest weiterhin direkt aus der
Umgebung -- es kann hierüber nicht beeinflusst werden.
Welche Quelle gerade greift, zeigt die Verwaltung bei jedem Wert an.
3. WERTE KOMMEN NIE ZURÜCK. Es gibt keinen Weg, ein gespeichertes 3. WERTE KOMMEN NIE ZURÜCK. Es gibt keinen Weg, ein gespeichertes
Geheimnis wieder auszulesen -- weder über die Schnittstelle noch Geheimnis wieder auszulesen -- weder über die Schnittstelle noch
@@ -99,11 +118,14 @@ export function istGeladen() { return geladen; }
/* Der eine Zugriffspunkt fuer den Rest des Codes. SYNCHRON. /* Der eine Zugriffspunkt fuer den Rest des Codes. SYNCHRON.
Reihenfolge: .env zuerst, Datenbank danach. Begruendung im Kopf. */ Reihenfolge: Verwaltung zuerst, .env als Rueckfall. Begruendung im
Kopf der Datei -- kurz: Wer den Wert im Formular setzt, erwartet, dass
er gilt. */
export function einstellung(schluessel) { export function einstellung(schluessel) {
const ausDb = speicher[schluessel];
if (ausDb && String(ausDb).trim()) return String(ausDb).trim();
const ausEnv = process.env[schluessel]; const ausEnv = process.env[schluessel];
if (ausEnv && String(ausEnv).trim()) return String(ausEnv).trim(); return ausEnv ? String(ausEnv).trim() : "";
return speicher[schluessel] || "";
} }
/* Setzt einen Wert. Leerer Wert = Eintrag entfernen. */ /* Setzt einen Wert. Leerer Wert = Eintrag entfernen. */
@@ -142,7 +164,9 @@ export function stand() {
for (const [schluessel, meta] of Object.entries(ERLAUBTE_SCHLUESSEL)) { for (const [schluessel, meta] of Object.entries(ERLAUBTE_SCHLUESSEL)) {
const ausEnv = process.env[schluessel] && String(process.env[schluessel]).trim(); const ausEnv = process.env[schluessel] && String(process.env[schluessel]).trim();
const ausDb = speicher[schluessel]; const ausDb = speicher[schluessel];
const wert = ausEnv || ausDb || ""; /* Dieselbe Reihenfolge wie in einstellung() -- sonst zeigt die
Anzeige eine andere Quelle an, als tatsaechlich benutzt wird. */
const wert = ausDb || ausEnv || "";
const zeile = db const zeile = db
.prepare(`SELECT updated_at FROM app_settings WHERE key = ?`) .prepare(`SELECT updated_at FROM app_settings WHERE key = ?`)
.get(PRAEFIX + schluessel); .get(PRAEFIX + schluessel);
@@ -154,7 +178,10 @@ export function stand() {
"gesetzt (7 Zeichen)" hilft dabei niemandem. */ "gesetzt (7 Zeichen)" hilft dabei niemandem. */
wert: meta.geheim ? null : (schluessel === "PAYPAL_ENV" ? wert : null), wert: meta.geheim ? null : (schluessel === "PAYPAL_ENV" ? wert : null),
laenge: wert ? wert.length : 0, laenge: wert ? wert.length : 0,
quelle: ausEnv ? "server" : (ausDb ? "verwaltung" : null), quelle: ausDb ? "verwaltung" : (ausEnv ? "server" : null),
/* Liegt in BEIDEN etwas, ist das erwaehnenswert: Der Serverwert
wird dann nicht benutzt, und das soll man sehen. */
auchAufServer: !!(ausDb && ausEnv),
geaendert: zeile ? zeile.updated_at : null, geaendert: zeile ? zeile.updated_at : null,
beschreibung: meta.beschreibung, beschreibung: meta.beschreibung,
geheim: meta.geheim, geheim: meta.geheim,
+13 -3
View File
@@ -2169,13 +2169,23 @@
var felder = PP_FELDER.map(function (f) { var felder = PP_FELDER.map(function (f) {
var z = st[f.k] || {}; var z = st[f.k] || {};
/* Die Marke sagt, welche Quelle GERADE GILT -- nicht nur, dass
irgendwo etwas steht. Vorher stand bei einem Serverwert nur
"hinterlegt (auf dem Server)", und man konnte nicht erkennen,
dass die eigene Eingabe im Formular davon ueberstimmt wurde. */
var lage = z.gesetzt var lage = z.gesetzt
? '<span class="wd-tag wd-tag--ok">hinterlegt' + ? '<span class="wd-tag wd-tag--ok">' +
(z.quelle === "server" ? " (auf dem Server)" : "") + (z.quelle === "server" ? "aus der Serverdatei" : "hier eingetragen") +
(z.laenge ? " · " + z.laenge + " Zeichen" : "") + "</span>" (z.laenge ? " · " + z.laenge + " Zeichen" : "") + "</span>" +
(z.auchAufServer
? ' <span class="wd-tag">Serverwert wird nicht benutzt</span>'
: "")
: '<span class="wd-tag wd-tag--gold">fehlt</span>'; : '<span class="wd-tag wd-tag--gold">fehlt</span>';
if (f.art === "wahl") { if (f.art === "wahl") {
/* Der tatsaechlich wirksame Wert, nicht der zuletzt geklickte.
Sonst leuchtet "Echtbetrieb" auf, waehrend in Wahrheit der
Testmodus laeuft -- genau das ist am 23.08.2026 passiert. */
var jetztWert = z.wert || "sandbox"; var jetztWert = z.wert || "sandbox";
return '<div class="wd-feld" style="margin-bottom:1rem">' + return '<div class="wd-feld" style="margin-bottom:1rem">' +
"<label>" + s(f.titel) + " " + lage + "</label>" + "<label>" + s(f.titel) + " " + lage + "</label>" +