Unifi-Voucher-Tool/updater
Friederich Loheide 4159b92268
Some checks are pending
CI / PHP Lint (push) Waiting to run
CI / PHP Lint (pull_request) Waiting to run
CI / PHP Lint-1 (pull_request) Waiting to run
CI / PHP Lint-1 (push) Waiting to run
CI / Unit Tests & Static Analysis (pull_request) Waiting to run
CI / Unit Tests & Static Analysis (push) Waiting to run
Display-Seiten individuell gestalten
Jede Display-Seite bringt jetzt ihr eigenes Erscheinungsbild mit – der
Empfang sieht anders aus als der Tagungsraum nebenan:

- eigenes Logo (leer = Logo aus den Einstellungen)
- formatfüllendes Hintergrundbild mit einstellbarer Abdunklung (0–90 %),
  damit die Karte auf hellen Fotos lesbar bleibt
- eigene Akzentfarbe für den Knopf (leer = Farbe aus dem Design-Tab)
- Karte wahlweise hell oder dunkel; auf Fotos wirkt dunkel meist ruhiger

Logo und Hintergrund lassen sich hochladen oder als URL hinterlegen; beim
Löschen einer Display-Seite verschwinden die hochgeladenen Dateien mit.

Nebenbei aufgeräumt: das Bildfeld (Vorschau + Upload + URL + Entfernen)
lag als Funktion in admin/settings.php und wird jetzt von beiden Seiten
genutzt – Ui::imageField() für die Darstellung, Upload::resolveField()
für die Auswertung.

Sicherheit: die Akzentfarbe landet in einem style-Attribut, deshalb wird
sie sowohl beim Speichern als auch beim Ausgeben auf eine echte Hex-Farbe
geprüft; ein Test hält das fest.

Migration 0006, database.sql nachgezogen, 4 neue Tests (42 gesamt),
Screenshots ergänzt, Version 2.8.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 16:58:54 +00:00
..
migrations Display-Seiten individuell gestalten 2026-09-23 16:58:54 +00:00
storage Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00
templates Entwicklerhinweis "Entwickelt von Loheide.eu" ergänzen 2026-09-23 11:21:53 +00:00
AuditLogger.php Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00
bootstrap.php Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00
MigrationRunner.php Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00
README.md Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00
routes.php Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00
UpdateController.php Updater-Migration für Feature-Tabellen + README um neue Features erweitern 2026-06-05 19:16:55 +00:00
UpdateManager.php Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00
UpdaterFactory.php Updater-System (OpenNIT-Modell) im isolierten updater/-Ordner 2026-06-05 18:51:51 +00:00

Updater (OpenVoucherTool)

Auto-Update-System nach dem OpenNIT-Modell: zieht Quellcode + DB-Migrationen aus einem zentralen Repository über einen HTTP-Update-Proxy nach.

[diese App]  ←HTTPS→  [Update-Proxy]  ←pull→  [Git-Repo]
  • Versions-Identität: 40-stelliger Git-Commit-SHA in updater/storage/.version
  • Channels: stablehttps://update.loheide.eu/openvouchertool, developmenthttps://update.loheide.eu/openvouchertool-development
  • User-Agent: OpenVoucherTool-Updater/1.0
  • DB-Treiber: MySQL/MariaDB (Migrations-Tracking-Tabelle _updater_migrations)

Aufruf

Admin-Oberfläche: /admin/update.php (nur für angemeldete Admins).

Endpoint Methode Zweck
admin/update.php GET Admin-UI
admin/update.php?action=check GET Update-Prüfung (JSON)
admin/update.php?action=progress GET Fortschritt (JSON)
admin/update.php?action=migrations GET Migrations-Status (JSON)
admin/update.php action=install POST Update installieren (+csrf_token)
admin/update.php action=set_channel POST Channel wählen (+csrf_token)

Optional: In der Admin-Navigation (admin/index.php) einen Link zu update.php ergänzen, damit die Seite auffindbar ist. Das ist bewusst nicht automatisch geschehen (Isolations-Prinzip siehe unten).

Isolation

Der Updater liegt vollständig in updater/ (eigener Namespace Updater\) plus zwei dünne, klar markierte Anknüpfungen:

  1. Front-Controller-Hook in index.php (Maintenance-Check, markiert mit // Updater maintenance hook).
  2. Entry-Shim admin/update.php (lädt nur Basis + Bootstrap, delegiert an den Controller).

Eigene Settings (updater/storage/updater-settings.json), eigener Autoloader (updater/bootstrap.php), eigener AuditLogger (schreibt in die vorhandene audit_log-Tabelle), eigenes Migrations-System (updater/migrations/ + Tabelle _updater_migrations). Es werden keine Projekt-Klassen erweitert \Database und \Auth werden nur per Injection genutzt.

Geschützte Pfade (werden bei Updates nie überschrieben)

config.php, .htaccess, .env*, .git/, .gitignore, public/uploads/, vendor/, composer.lock, updater/storage/.

Rückbau (restlos entfernen)

  1. In index.php den Block „Updater maintenance hook" (die Zeilen 28, beginnend mit $maintenanceFile = … bis zum schließenden }) entfernen.
  2. rm -r updater/
  3. rm admin/update.php
  4. (optional) In der Datenbank: DROP TABLE _updater_migrations;
  5. (optional, falls vorhanden) Laufzeitdateien sind bereits in updater/ und damit mit Schritt 2 weg. Nichts liegt außerhalb.

Danach ist keine Spur des Updaters mehr im Bestandscode der Beweis für die Isolation.

Smoke-Test

# 1) Syntax aller Updater-Dateien
php -l updater/UpdateManager.php
php -l updater/MigrationRunner.php
php -l updater/UpdateController.php
php -l updater/UpdaterFactory.php
php -l updater/AuditLogger.php

# 2) Admin-Seite aufrufen (eingeloggt als Admin):
#    https://<host>/admin/update.php
#    -> "Auf Updates prüfen" klicken. Erwartung: Proxy-Antwort oder klare
#       Fehlermeldung (wenn Proxy/Channel nicht erreichbar).

# 3) Maintenance-Mode manuell testen:
touch updater/storage/.maintenance     # index.php zeigt jetzt 503-Wartungsseite
rm    updater/storage/.maintenance     # wieder normal

Hinweis: Ein vollständiger Installations-Durchlauf (action=install) setzt einen erreichbaren Update-Proxy unter den oben genannten URLs voraus.