Sicherheits-Header, Werkzeuge und Dokumentation

Sicherheit:
- .htaccess im Projektstamm mit X-Content-Type-Options, X-Frame-Options,
  Referrer-Policy, Permissions-Policy und einer Content-Security-Policy;
  da alle Assets lokal liegen, erlaubt sie nur noch die eigene Herkunft
  (Ausnahme: hCaptcha, falls aktiviert)
- includes/, tools/, tests/, updater/storage und uploads/ schützen sich
  über eigene .htaccess-Dateien – auch bei Installation im Unterordner
- Docker: AllowOverride All, damit diese Regeln überhaupt greifen, und
  ein Volume für uploads/, damit Logos ein Image-Update überstehen

Werkzeuge:
- tools/screenshots.py erzeugt alle Bilder in docs/screenshots aus der
  Demo-Instanz; tools/README.md beschreibt beides
- Einstellungs-Tabs sind per ?tab=… direkt verlinkbar (serverseitig, also
  auch ohne JavaScript)

Dokumentation: Readme um Markenfarben, Bild-Upload, lokale Assets,
Sicherheits-Header (inkl. Nginx-Entsprechung) und einen Abschnitt
"Entwicklung" ergänzt; Screenshots neu erzeugt, Version 2.6.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Friederich Loheide 2026-09-23 06:49:14 +00:00
parent e28527ed91
commit 36e06ac817
30 changed files with 307 additions and 36 deletions

42
tools/README.md Normal file
View file

@ -0,0 +1,42 @@
# Werkzeuge
## Demo-Instanz (`tools/demo/build.py`)
Baut aus dem Projekt eine lauffähige Kopie **ohne Datenbank**: `Database` und
`Auth` werden durch Stubs mit festen Beispieldaten ersetzt (`tools/demo/overlay/`).
Das Original bleibt unverändert.
```bash
python3 tools/demo/build.py /tmp/uvt-demo
php -S 127.0.0.1:8123 -t /tmp/uvt-demo
```
Nützlich für:
* **Screenshots** für die Dokumentation immer mit denselben Daten
* **Smoke-Test** jede Seite einmal rendern, ohne MySQL aufzusetzen
Demo-spezifische Zustände werden über Query-Parameter erreicht:
| Parameter | Wirkung |
|---|---|
| `?demo=result` / `?demo=bulk` | Voucher-Ergebnis bzw. Bulk-Liste auf `index.php` |
| `?demo=new` | frisch erzeugter Schlüssel auf `admin/api_keys.php` |
| `?anon=1` | nicht angemeldet (für die Login-Seite) |
| `?theme=dark` | erzwingt den Dark Mode |
| `?brand=custom` / `?brand=nopanel` | Beispiel-Branding der Login-Seite |
## Screenshots (`tools/screenshots.py`)
Rendert die Bilder aus `docs/screenshots/` neu. Voraussetzung ist ein
headless Chromium; der Pfad kommt aus `$CHROME_BIN` oder wird in den
üblichen Verzeichnissen gesucht.
```bash
python3 tools/demo/build.py /tmp/uvt-demo
php -S 127.0.0.1:8123 -t /tmp/uvt-demo &
CHROME_BIN=/usr/bin/chromium python3 tools/screenshots.py
```
Die Skripte sind Hilfsmittel für die Entwicklung im Betrieb werden sie nicht
benötigt und sind per `.htaccess` nicht über HTTP erreichbar.