All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m34s
Invulmenu:
- Vaste stappen (Basis, Verbinden, Instellingen, Toegang, Controleren) in
plaats van één lange lijst. Eén stap per groep werkt niet: de mediane app
heeft één groep, arr-stack eenentwintig. Lege stappen worden overgeslagen.
- Volgende controleert de verplichte velden van die stap; die melding kwam
eerder pas bij het installeren.
- Geavanceerde opties achter één schakelaar die op elke stap zichtbaar is,
plus 'Alles op één pagina' voor het oude gedrag. Beide onthouden.
Geheimen naar .env:
- compose_transform.geheimen_naar_env() vervangt geheime waarden door
${NAAM} en schrijft ze naar .env met rechten 0600. Werkt ook midden in
een database-URL. Poorten en paden blijven leesbaar in compose.
- .serverup.json bevat geen geheimen meer en krijgt ook 0600; daar stonden
ze wereldleesbaar in. Het herconfiguratieformulier leest ze terug uit
.env via een bewaarde veld-naar-sleutel-koppeling.
- docs/beveiliging.md legt uit wat dit niet oplost: docker inspect toont de
waarde nog steeds.
Bewerken:
- Laatste stap toont het gerenderde resultaat met jouw waarden en is
bewerkbaar; compose_override/env_override gaan mee bij het installeren.
Ongeldige YAML wordt geweigerd voordat er een map bestaat.
- De bestaande editor heeft tabbladen (compose/.env) en biedt herstarten na
opslaan. De .env-PUT weigert een regel zonder '=' en logt in audit.
Inloggegevens:
- /api/stacks/<n>/credentials plus paneel op de stackkaart: adres,
gebruikersnaam, wachtwoord achter een oog-knop, kopieerknop. Alleen voor
beheerders, elk bekijken komt in het auditlog.
- Nieuw 'credential'-kenmerk in template.json met naamherkenning als
terugval, zodat de bestaande 96 sjablonen meteen werken.
Herstel van een regressie uit v0.7.60: acht inlogwachtwoorden hadden hun
genereerknop verloren toen die aan 'generate' werd gehangen. Terug, behalve
waar een verzonnen waarde fout is (WireGuard-sleutel, externe tokens).
De menulogica wordt getest door de echte component uit index.html in Node uit
te voeren; slaat zichzelf over waar node ontbreekt. 2295 tests groen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
34 lines
1.4 KiB
Python
34 lines
1.4 KiB
Python
"""De logica van het invulmenu, uitgevoerd zoals de browser het doet.
|
|
|
|
De stapindeling, de geavanceerd-schakelaar en het blokkeren van 'Volgende'
|
|
zitten in JavaScript. Een Python-test kan daar niets over zeggen, dus draaien we
|
|
de echte component uit index.html in Node. Zonder Node slaat dit zichzelf over.
|
|
"""
|
|
import shutil
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
WORTEL = Path(__file__).resolve().parent.parent
|
|
SCRIPT = WORTEL / "tests" / "js" / "menu.test.js"
|
|
|
|
|
|
@pytest.mark.skipif(not shutil.which("node"), reason="node ontbreekt")
|
|
def test_invulmenu_logica():
|
|
r = subprocess.run(["node", str(SCRIPT)], capture_output=True, text=True,
|
|
timeout=60, cwd=str(WORTEL))
|
|
assert r.returncode == 0, r.stdout + r.stderr
|
|
|
|
|
|
@pytest.mark.skipif(not shutil.which("node"), reason="node ontbreekt")
|
|
def test_javascript_van_de_pagina_parseert():
|
|
"""Een typefout in de component maakt de hele interface blanco; dat wil je
|
|
niet pas in de browser ontdekken."""
|
|
import re
|
|
html = (WORTEL / "server-up" / "templates" / "index.html").read_text(encoding="utf-8")
|
|
blokken = re.findall(r"<script[^>]*>(.*?)</script>", html, re.S)
|
|
grootste = max(blokken, key=len)
|
|
r = subprocess.run(["node", "--check", "-"], input=grootste,
|
|
capture_output=True, text=True, timeout=30)
|
|
assert r.returncode == 0, r.stderr
|