|
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
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> |
||
|---|---|---|
| .. | ||
| migrations | ||
| storage | ||
| templates | ||
| AuditLogger.php | ||
| bootstrap.php | ||
| MigrationRunner.php | ||
| README.md | ||
| routes.php | ||
| UpdateController.php | ||
| UpdateManager.php | ||
| UpdaterFactory.php | ||
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:
stable→https://update.loheide.eu/openvouchertool,development→https://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 zuupdate.phpergä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:
- Front-Controller-Hook in
index.php(Maintenance-Check, markiert mit// Updater maintenance hook). - 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)
- In
index.phpden Block „Updater maintenance hook" (die Zeilen 2–8, beginnend mit$maintenanceFile = …bis zum schließenden}) entfernen. rm -r updater/rm admin/update.php- (optional) In der Datenbank:
DROP TABLE _updater_migrations; - (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.