WIP Vorrang umgedreht (Test folgt auf dem Server)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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>" +
|
||||||
|
|||||||
Reference in New Issue
Block a user