• 0.3.0 289c571ea2

    0.3.0 Stable

    Pablo1732 released this 2026-09-15 12:33:34 +00:00 | 8 commits to master since this release

    Admin-Panel für Aushänge („Werbung") und Alarme – serverseitig, gerätübergreifend.

    Admin-Panel & gemeinsamer Zustand

    • Neues Admin-Panel unter /admin (Login + Verwaltung). Die Schulleitung kann
      Bilder/PDFs/Textmeldungen als Aushang auf die Aula-Anzeige schalten
      (Platzierung links/rechts/vollbild, dauerhaft oder im Intervall, Diashow,
      Enddatum) und die Alarme Feueralarm und Amok/Lockdown ein-/ausschalten.
    • Serverseitiger gemeinsamer Zustand statt Browser-localStorage: Aushang- und
      Alarmzustand liegen im Container (/data/userdata/state.json + media/) und
      werden über eine kleine API geteilt (/api/state, /api/aushang, /api/notfall,
      /api/upload, /api/login). Dadurch steuert die Schulleitung von einem anderen
      Gerät
      aus, was am Aula-Display erscheint. Zustand übersteht einen Neustart.
    • Schulname im Kopf über SCHULNAME in der Compose einstellbar
      (Default „Johannes-Gutenberg-Gymnasium").

    Sicherheit

    • Echte Anmeldung mit Zugangsdaten aus der docker-compose.yml
      (ADMIN_USER / ADMIN_PASSWORD, alternativ ADMIN_PASSWORD_HASH = PBKDF2;
      Hash erzeugen mit server.py --hash 'passwort'). Session-Cookie (HttpOnly,
      SameSite=Strict), Ablauf über SESSION_HOURS.
    • Brute-Force-Schutz: Fehlversuche pro IP werden gezählt, ab LOGIN_MAX_FAILS
      greift eine ansteigende Sperre, plus feste Verzögerung; Passwortvergleich in
      konstanter Zeit (kein Timing-Oracle für den Benutzernamen).
    • Textmeldungen werden serverseitig bereinigt (Allowlist): nur harmlose
      Formatier-Tags + gefilterte Inline-Styles; script/Event-Handler/iframe/
      javascript:-URLs werden entfernt. Kein Skript kann auf die Anzeige gelangen.
    • Server-Härtung: Socket-Timeout gegen hängende Verbindungen, Aufräumen von
      Sessions/Sperr-Einträgen. (Noch kein HTTPS – im LAN Klartext; TLS später per
      Reverse-Proxy davor, dann IP-Sperre auf X-Forwarded-For umstellen.)

    Uploads & PDF

    • Uploads als Dateien im neuen Volume ./data/vplan-websrv-userdata
      (bis 25 MB pro Datei, JPG/PNG/WebP/PDF), über /media/<id> ausgeliefert und
      browser-cachebar.
    • PDFs werden serverseitig in Seiten-PNGs umgewandelt (poppler-utils/
      pdftoppm) – identische Darstellung in jedem Browser (kein Firefox-Toolbar/Zoom),
      ermöglicht mehrseitige Aushänge. Im Vollbild werden 2 Seiten nebeneinander
      gezeigt und paarweise durchgewechselt; sonst je 1 Seite.
    • Zuverlässiges Aufräumen: nicht mehr referenzierte Dateien werden entfernt –
      auch verwaiste Dateien direkt von der Platte (mit Alters-Schutz für laufende
      Uploads) sowie beim Start.

    Anzeige

    • Neue Aushang-Anzeige neben/über dem Plan; Textmeldungen scrollen bei
      Überlänge automatisch durch (wie die Vertretungen).
    • Diashow-Timing gefixt: im Intervall zählt nur die sichtbare Zeit, dadurch
      kommt jede Datei dran (vorher konnte eine genau in die Pause fallen).
    • Der Plan scrollt nach einem Vollbild-/Intervall-Aushang genau dort weiter, wo
      er war (statt oben neu zu starten).
    • Vollbild-Feinschliff: minimaler Kopf (nur Schule + Uhr; ohne Mittel-Titel,
      Trennlinie und „Plan veraltet"), heller Rand statt dunkel, „Aktualisiert" zeigt
      die Aushang-Zeit, bei mehreren Seiten steht mittig klein „Aushang x / y".
    • Am Vertretungsplan selbst ändert sich sonst nichts: ohne veröffentlichten
      Aushang und ohne Alarm ist die Anzeige identisch zu 0.2.0.

    Alarme

    • Feueralarm/Amok werden bewusst über das Admin-Panel geschaltet und kommen
      ausschließlich aus dem Server-Zustand – so kann bei Lade-/Verbindungsproblemen
      niemals versehentlich ein Alarm erscheinen.
    Downloads