fix(station): deploy.sh prueft Bildsatz 'ohne-wlan' auf Zugangsdaten
release.sh prueft sein fertiges Archiv binaer gegen die Werte aus config.local.cmake und bricht ab, wenn es etwas findet. deploy.sh signierte dagegen ungeprueft, was in build-nocreds/ lag - und genau dieser Satz ist die sichere Vorgabe, die im Automatikmodus an fremde Lampen in Funkreichweite geht. Der Weg dorthin ist Bedienfehler, nicht Programmfehler: ein von Hand konfiguriertes build-nocreds/<ziel>, ein gesetztes NINLIGHT_NOCREDS_BUILD_REL=build. Das Ergebnis waere, dass das Panel "ohne WLAN" anzeigt, waehrend das WLAN-Passwort des Bedieners unwiderruflich in fremde Lampen wandert. Derselbe Pruefkoerper wie in release.sh, angewandt auf $STAGE/migrate-nocreds und VOR dem Uebertragen - bei einem Treffer geht kein Byte an den Pi. Szenario 33 stellt den undichten Abzug nach (mit Gegenprobe, dass der Abzug die Zugangsdaten wirklich traegt), Szenario 34 grenzt ab, dass migrate-wlan sie weiterhin tragen darf. Mutationsproben: Pruefblock entfernt = 6 Zusagen rot (die Zugangsdaten landen beim Ziel); Pruefung auf den ganzen STAGE ausgeweitet = 4 Zusagen rot.
This commit is contained in:
@@ -241,6 +241,64 @@ else
|
||||
echo "Hinweis: Schluesselverzeichnis $SIGN_DIR nicht gefunden - keine Migrationsimages erzeugt" >&2
|
||||
fi
|
||||
|
||||
# Der Bildsatz "ohne-wlan" ist die SICHERE VORGABE: er geht im Automatikmodus an jede
|
||||
# alte Klyqa-Lampe in Funkreichweite, auch an fremde, und das Flashen ist nicht
|
||||
# umkehrbar. tools/release.sh prueft sein fertiges Archiv deshalb binaer gegen die Werte
|
||||
# aus config.local.cmake (dort "Auf Zugangsdaten pruefen") - deploy.sh signierte
|
||||
# dagegen ungeprueft, was in build-nocreds/ lag.
|
||||
#
|
||||
# Der Weg dorthin ist Bedienfehler, nicht Programmfehler: ein von Hand konfiguriertes
|
||||
# build-nocreds/<ziel>, oder ein gesetztes NINLIGHT_NOCREDS_BUILD_REL=build. Das
|
||||
# Ergebnis waere, dass das Panel "ohne WLAN" anzeigt, waehrend das WLAN-Passwort des
|
||||
# Bedieners unwiderruflich in fremde Lampen wandert - der teure, nicht rueckholbare
|
||||
# Fehler. Lieber ein abgebrochener Deploy.
|
||||
#
|
||||
# Geprueft wird VOR dem Uebertragen, es ist also noch nichts beim Pi angekommen. Nur
|
||||
# dieser eine Satz: migrate-wlan/ SOLL die Zugangsdaten enthalten, das ist sein Zweck.
|
||||
# Der Pruefkoerper ist bis auf die Meldung derselbe wie in tools/release.sh.
|
||||
if [ -d "$STAGE/migrate-nocreds" ]; then
|
||||
echo "== Bildsatz 'ohne-wlan' auf Zugangsdaten pruefen =="
|
||||
LOCAL="$ROOT/config.local.cmake"
|
||||
if [ -f "$LOCAL" ]; then
|
||||
python3 - "$STAGE/migrate-nocreds" "$LOCAL" <<'CHECKPY' || exit 1
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
stage, local = sys.argv[1], sys.argv[2]
|
||||
text = open(local, encoding="utf-8", errors="replace").read()
|
||||
# Nur die drei Werte, die wirklich geheim sind. NINLIGHT_AP_PASSWORD und der
|
||||
# Vorgabetoken stehen oeffentlich im Repo (README, Bruno) - sie hier mitzupruefen
|
||||
# haette nur falsche Alarme erzeugt.
|
||||
SECRETS = ("NINLIGHT_WIFI_SSID", "NINLIGHT_WIFI_PASSWORD", "NINLIGHT_TOKEN")
|
||||
PUBLIC = {"", "ninlight", "aabbccddeeff0011223344", "ninlight-recovery", "change-me-please"}
|
||||
needles = []
|
||||
for name in SECRETS:
|
||||
m = re.search(r'^\s*set\s*\(\s*%s\s+"([^"]*)"' % name, text, re.M)
|
||||
if m and m.group(1) not in PUBLIC:
|
||||
needles.append((name, m.group(1).encode()))
|
||||
|
||||
hits = []
|
||||
for root, _dirs, files in os.walk(stage):
|
||||
for fn in sorted(files):
|
||||
path = os.path.join(root, fn)
|
||||
with open(path, "rb") as fh:
|
||||
data = fh.read()
|
||||
for name, needle in needles:
|
||||
if needle in data:
|
||||
hits.append("%s in %s" % (name, os.path.relpath(path, stage)))
|
||||
if hits:
|
||||
sys.stderr.write(
|
||||
"Fehler: Zugangsdaten aus config.local.cmake im Bildsatz 'ohne-wlan' gefunden, "
|
||||
"nichts uebertragen:\n " + "\n ".join(hits) + "\n")
|
||||
sys.exit(1)
|
||||
print(" sauber (%d geprueft)" % len(needles))
|
||||
CHECKPY
|
||||
else
|
||||
echo " uebersprungen - $LOCAL nicht vorhanden" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "== uebertragen =="
|
||||
# -c (Inhaltsvergleich per Checksumme statt Groesse+Zeitstempel): ein neues
|
||||
# Image kann zufaellig dieselbe Byte-Groesse wie das alte haben, und bei
|
||||
|
||||
Reference in New Issue
Block a user