Zum Hauptinhalt springen

8 Posts getaggt mit "fix"

Alle Tags anzeigen

Uni-Verein 1.10.0 – Einnahmen, EÜR-Export, Zwei-Faktor-Authentifizierung und Demo-Modus 💶🔐

· 8 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 30. Oktober 2026

Uni-Verein 1.10.0 macht aus der Beitragsverwaltung eine vollständige Einnahmenverwaltung mit Quittungen, stabilen Belegnummern und Zahlungsdatum. Die neue Finanzauswertung vergleicht Einnahmen und Ausgaben und erzeugt auf Knopfdruck den EÜR-Export für die Steuer. Dazu kommen die Zwei-Faktor-Authentifizierung, ein Demo-Modus und eine ganze Reihe von Sicherheitsverbesserungen. Beim Update gibt es einiges zu beachten, siehe die Hinweise unten.

Highlights​

  • 💶 Einnahmen (UV-65): Die Seite "Beiträge" ist jetzt die Seite "Einnahmen". Neben den Mitgliedsbeiträgen gibt es frei konfigurierbare Einnahmekategorien wie Spenden oder Sponsoring, auch ohne Bankverbindung
  • 🧾 Quittungen (UV-65): Für jeden bezahlten Beitrag und jede bezahlte Einnahme lässt sich eine Quittung als PDF mit fortlaufender Nummer erzeugen
  • 📑 EÜR-Export (UV-65): Die Einnahmen-Überschuss-Rechnung als Excel-Datei mit steuerlichen Prüfungen, Journal und Beitragsnachweis. Dafür braucht es ein Mitglied mit der Aufgabe "Finanzvorstand"
  • 🔢 Stabile Belegnummern (UV-68): E-JJJJ-NNNN für Einnahmen, A-JJJJ-NNNN für Belege, dazu ein explizites Zahlungsdatum
  • 📊 Finanzauswertung (UV-60): Einnahmen und Ausgaben im Vergleich, ersetzt die Belegauswertung
  • 🔐 Zwei-Faktor-Authentifizierung (UV-67): Anmeldung mit Code aus einer Authenticator-App und Wiederherstellungscodes
  • 🎬 Demo-Modus (UV-66): Eine Demo-Instanz mit Beispieldaten, die sich jede Nacht zurücksetzt
  • 🛡️ Härtung (UV-29, UV-64): Anmelde-Token im httpOnly-Cookie, Mail-Verschlüsselung erzwungen, abgesicherte Backup-Wiederherstellung und mehr

Neue Funktionen​

  • 💶 Einnahmen (UV-65): Der Reiter "Mitgliedsbeiträge" zeigt die SEPA-Beiträge, jeder weitere Reiter ist eine konfigurierbare Einnahmekategorie (unter "Einnahmekategorien verwalten", z. B. "Spenden"). Admins und Finanzverwalter können Einnahmen erfassen, bearbeiten, als bezahlt markieren und löschen, Admins stellen gelöschte wieder her. Kennzahlen und ein Zeitraumfilter (Standard: aktuelles Jahr) sind neu. Bezahlte Beiträge werden nicht mehr nach 14 Tagen automatisch gelöscht, bereits so entfernte Beiträge stellt die Migration wieder her
  • 🧾 Quittungen (UV-65): Ein PDF mit fortlaufender Quittungsnummer (JJJJ-NNNN) für jeden bezahlten Beitrag und jede bezahlte Einnahme. Sie wird so aufbewahrt, wie sie ausgestellt wurde, danach lässt sich die Zahlung nicht mehr ändern. Die Quittung ist keine Zuwendungsbestätigung nach § 10b EStG
  • 📑 EÜR-Export (UV-65): Der EÜR-Export steht für Admins und Finanzverwalter auf der Seite "Finanzauswertung" bereit, für alle Jahre ab 2020. Die Excel-Datei enthält die Blätter "EÜR", "Stammdaten", "Journal", "Beitragsnachweis" und "Hinweise". Die steuerlichen Prüfungen nutzen die Grenzen des exportierten Jahres (45.000 € bis 2025, 50.000 € / 50.000 € / 100.000 € ab 2026). Anfangsbestände und der Abgleich Kasse/Bank sind leere Zellen zum Ausfüllen von Hand. Damit der Kassenwart in der EÜR erscheint, muss es ein Mitglied mit der Aufgabe "Finanzvorstand" geben, siehe die Voraussetzungen
  • 🏷️ Steuerlicher Bereich (UV-65): Einnahme- und Belegkategorien haben einen Steuerlichen Bereich (Ideeller Bereich, Vermögensverwaltung, Zweckbetrieb, Wirtschaftlicher Geschäftsbetrieb), die Bankverbindung eine optionale "Steuernummer"
  • 🔢 Belegnummern und Zahlungsdatum (UV-68): Beim Buchen als bezahlt erhält jeder Eintrag einmalig eine Belegnummer, E-JJJJ-NNNN für Beiträge und Einnahmen, A-JJJJ-NNNN für Belege, die sich nie ändert und nie neu vergeben wird. Das Zahlungsdatum (Standard: heute) bestimmt EÜR, Finanzauswertung und Einnahmen-Summen. Bereits bezahlte Einträge behalten ihr bisheriges Datum, frühere Zahlen ändern sich nicht
  • 📊 Finanzauswertung (UV-60): Die Finanzauswertung ersetzt die Belegauswertung und vergleicht Einnahmen und Ausgaben (Übersicht, nach Monat und Kategorie, Kategorientabelle). Es zählen nur bezahlte Einträge, jeweils im Monat ihres Zahlungsdatums, sodass der Saldo zur EÜR passt. Offene Belege erscheinen nicht mehr in den Ausgaben, bis sie bezahlt sind. Nur Admins und Finanzverwalter können sie öffnen
  • 🔐 Zwei-Faktor-Authentifizierung (UV-67): Unter "Profileinstellungen" → "Sicherheit" richtet jeder Benutzer eine 2FA (TOTP) mit QR-Code und 10 Wiederherstellungscodes ein. Bei aktiver 2FA folgt auf das Passwort die Code-Abfrage, falsche Codes werden pro Adresse und pro Konto gesperrt (Wiederherstellungscodes funktionieren währenddessen weiter). Admins können die 2FA eines Benutzers zurücksetzen. Das Geheimnis wird verschlüsselt gespeichert, optional lässt sich der Name in der App mit TwoFactor__Issuer festlegen. Im Demo-Modus nicht verfügbar. Wer als einziger Admin Gerät und Wiederherstellungscodes verliert, hat keinen Weg zurück
  • 🔒 Sitzungen (UV-67): Abmelden, Passwort ändern und das Ändern der 2FA beenden die Sitzungen auf allen anderen Geräten
  • 🎬 Demo-Modus (UV-66): docker-compose-demo.yml baut nichts selbst und braucht keinen SQL-Dump. VERSION in der .env wählt die veröffentlichten Images, DEMO_DATA_PATH den Datenordner. Mit Demo__Enabled=true löscht das Backend bei jedem Start und nachts um 03:00 Uhr UTC Datenbank und Belegdateien und erzeugt Beispieldaten relativ zum aktuellen Datum. E-Mails fängt Mailpit unter /mail/ ab. GET /web-page-config liefert demo, sodass das veröffentlichte Frontend-Image den Demo-Hinweis ohne eigenen Build zeigt
  • 👥 Finanzverwalter mit mehr Rechten (UV-70): Finanzverwalter öffnen die Beitragstarifverwaltung sowie die Einnahme- und Belegkategorien (das Menü "Einstellungen" zeigt ihnen nur diese drei Einträge) und legen Beitragstarife und Kategorien wie Admins an, bearbeiten und löschen sie

Änderungen​

  • 🍪 Anmelde-Token im Cookie (UV-29): Das Token liegt in einem httpOnly-Cookie (uv_auth) statt im localStorage, sodass eingeschleuste Skripte es nicht mehr auslesen können. Datenändernde Cookie-Anfragen tragen den Header X-UV-CSRF, Authorization: Bearer funktioniert weiter. Neu sind GET /auth/me und POST /auth/logout. ?access_token= wird bei /backup, /receipts/export und /emailProgress nicht mehr akzeptiert
  • 📧 Mail-Verschlüsselung (UV-64): Bei aktiviertem SSL wird eine verschlüsselte Verbindung erzwungen (TLS auf Port 465/993, sonst STARTTLS). Vorher konnte das Mailbox-Passwort im Klartext gesendet werden, wenn STARTTLS fehlte. Die Test-Mail meldet, warum etwas fehlgeschlagen ist
  • 🔌 API-Änderungen: GET /receipts/analytics wird durch GET /finance/analytics ersetzt. POST /contributions/{id} und POST /income/{id} erwarten { "paid", "paymentDate" } im Body statt des Query-Parameters paid, POST /receipts/{id}/pay und POST /income akzeptieren ein optionales paymentDate

Fehlerbehebungen und Sicherheit​

  • 🛡️ Backup-Wiederherstellung (UV-64): Eine hochgeladene SQL-Datei kann keine Shell-Befehle mehr im Backend-Container ausführen (psql läuft im eingeschränkten Modus, nötig ist PostgreSQL 17.6 oder neuer, sonst wird die Wiederherstellung abgelehnt)
  • 🎬 Demo-Modus auf dem Server (UV-64): Backup-Download und -Wiederherstellung antworten im Demo-Modus mit 403 DEMO_MODE_DISABLED. Vorher existierte der Demo-Modus nur im Frontend
  • ⚠️ Demo-Löschung (UV-65): Die Löschung der Datenbank braucht ein ausdrückliches Demo__Enabled mit true, 1, yes oder on. Vorher hätte jeder andere Wert (z. B. disabled) eine Produktivdatenbank gelöscht
  • 📝 Selbstregistrierung (UV-64): Alle Textfelder haben eine Maximallänge, POST /self-enrollment lehnt Bodys über 32 KB ab. Anfragen über einem Größenlimit (auch Beleg-Uploads) werden mit 413 statt 500 beantwortet
  • 💶 Beträge (UV-64): Beleg- und Einnahmebeträge sind auf 1.000.000 begrenzt. Vorher ließ sich die Finanzauswertung mit Belegen nahe dem Maximalwert nicht mehr laden (HTTP 500). Bereits gespeicherte höhere Beträge bleiben unverändert
  • 📄 CSV-Exporte (UV-64): Belege-ZIP und Mitgliederexport entschärfen Tabellenformeln (Felder, die mit =, +, - oder @ beginnen)
  • 🖼️ PDF-Vorschau (UV-64): Seiten werden in begrenzter Größe gerendert, ein PDF mit riesiger Seite kann den Browser nicht mehr überlasten. Eine nicht darstellbare Kachel zeigt einen Platzhalter mit dem Link zum Original
  • 🔑 Mail-Einstellungen (UV-64): Das SMTP-/IMAP-Passwort muss bei jedem Speichern neu eingegeben werden, damit das gespeicherte Passwort nicht auf einen anderen Mail-Server umgeleitet werden kann
  • 📊 Einnahmen-Summen (UV-65): Bezahlte Beträge werden nach Zahlungsdatum dem Zeitraum zugeordnet, bezahlte Einnahmen ohne Kategorie fehlen nicht mehr
  • 🗑️ Gelöschte Beiträge (UV-65): Ein gelöschter Beitrag lässt sich nicht mehr als bezahlt markieren

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben. Die nginx.conf muss zusammen mit den Images aktualisiert werden (X-Forwarded-Proto), das erledigt das Update-Skript
  • Alle Benutzer müssen sich nach dem Update einmal neu anmelden (neue Spalte Users.session_version und Wechsel auf das Cookie)
  • Steuerliche Bereiche zuordnen: Die Migration setzt alle vorhandenen Einnahme- und Belegkategorien auf "Ideeller Bereich". Weise die Bereiche zu, bevor du die erste EÜR exportierst, siehe Steuerliche Bereiche zuordnen
  • Für die EÜR: Lege ein Mitglied mit der Aufgabe "Finanzvorstand" an, damit der Kassenwart in der Datei erscheint
  • API-Clients: Der Token muss als Authorization: Bearer gesendet werden (?access_token= entfällt), POST /contributions/{id} und POST /income/{id} brauchen den Body { "paid", "paymentDate" }
  • Mail-Server ohne Verschlüsselung funktionieren mit aktiviertem SSL nicht mehr
  • Offene Belege erscheinen in der Finanzauswertung erst, wenn sie bezahlt sind
  • Bezahlte Beiträge, die bisher nach 14 Tagen automatisch gelöscht wurden, stellt die Migration wieder her. Künftig bleiben bezahlte Beiträge dauerhaft erhalten

Warum diese Updates wichtig sind​

Mit den Einnahmen, den stabilen Belegnummern und dem Zahlungsdatum führt Uni-Verein die Vereinskasse nachvollziehbar: Jede Zahlung hat eine feste Nummer und ein Datum, Spenden lassen sich per Quittung belegen, und die EÜR für das Finanzamt entsteht aus denselben Daten wie die Auswertung. Die Zwei-Faktor-Authentifizierung schützt Konten mit Zugriff auf Mitglieder- und Bankdaten, und die Härtung von Token, Mail-Verschlüsselung und Backup-Wiederherstellung schließt mehrere Angriffswege.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.9.1 – Mitgliedsstatus, bessere Beitragsverwaltung und mehr Sicherheit 🧾🛡️

· 5 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 23. Oktober 2026

Uni-Verein 1.9.1 bringt einen Mitgliedsstatus (Mitglied oder Fördermitglied), eine verbesserte Beitragsverwaltung mit Löschen offener Beiträge und ein deutlich erweitertes Audit Log. Dazu kommen mehrere Sicherheitsverbesserungen. Wer einen eigenen Reverse Proxy vor Uni-Verein betreibt, muss beim Update einmalig etwas einrichten, siehe die Hinweise zum Update unten.

Highlights​

  • ⭐ Mitgliedsstatus (UV-58): Jedes Mitglied ist Mitglied oder Fördermitglied, mit Spalte und Filter in der Mitgliederliste und der Beitragsverwaltung
  • 🗑️ Offene Beiträge löschen (UV-57): Admins und Finanzverwalter können offene Beiträge löschen, z. B. bei zurückgebuchten Lastschriften. Admins können sie wiederherstellen
  • 🚫 Keine Abrechnung mehr nach dem Austritt (UV-63): Gelöschte Mitglieder und Mitglieder mit verstrichenem Austrittsdatum werden nicht mehr abgerechnet
  • 📜 Erweitertes Audit Log: Benutzer, Gläubigerdaten, Beitragstarife, Beiträge, Mail-Einstellungen, Backup-Wiederherstellung und CSV-Import werden protokolliert
  • 🛡️ Sicherere Anmeldung: Die Login-Sperre trifft nicht mehr alle Nutzer eines Kontos, und gelöschte oder geänderte Benutzer verlieren sofort den Zugriff

Neue Funktionen​

  • ⭐ Mitgliedsstatus (UV-58): Mitglieder haben jetzt einen Mitgliedsstatus, im Formular einstellbar und im CSV-Import als Spalte "Membership status" (MEMBER oder SUPPORTING_MEMBER, leer = Mitglied). Die Mitgliederliste und die Beitragsverwaltung bekommen dazu eine Spalte und einen Filter. Die Beitragsverwaltung zeigt zusätzlich die Mitgliedsnummer
  • 🗑️ Offene Beiträge löschen (UV-57): Neben "Zahlung erhalten" gibt es ein Mülleimer-Symbol, das nach einer Bestätigung einen offenen Beitrag entfernt. Die Beiträge werden soft-gelöscht und im Audit Log protokolliert, Admins können sie über "Gelöschte anzeigen" einsehen und wiederherstellen
  • 📜 Audit Log für alle wichtigen Vorgänge: Zusätzlich zu den Mitgliedern werden Änderungen an Benutzern, Gläubigerdaten, Beitragstarifen, bezahlten/offenen Beiträgen, SMTP-/Mail-Einstellungen, das Einspielen eines Backups und der CSV-Import von Mitgliedern protokolliert. Passwörter, IBAN/BIC und importierte Mitgliederdaten werden nicht gespeichert

Fehlerbehebungen​

  • 🚫 Abrechnung (UV-63): Gelöschte Mitglieder und Mitglieder, deren Austrittsdatum verstrichen ist, werden bei der Beitragserzeugung und im SEPA-Export nicht mehr berücksichtigt. Liegt das Austrittsdatum in der Zukunft, wird noch bis zu diesem Datum abgerechnet
  • 👥 Mitgliederkategorie-Filter (UV-61): Wird der Filter der Mitgliederkategorie wieder auf "Alle" gestellt, zeigt die Liste wieder alle Mitglieder
  • 🕵️ Audit Log (UV-10): Einträge gelöschter Benutzer werden als "Deleted user" angezeigt, statt ausgeblendet zu werden
  • 📱 App-Icon unter Android (UV-55): Das Web-Manifest hat den richtigen Content-Type, und für die thematischen Symbole von Android 16 ist ein einfarbiges Icon enthalten. Die App-Icons sind RGBA-PNGs, das iOS-Icon ist deckend
  • 🌐 Englische Texte der Beitragsverwaltung: Wegen eines falschen Übersetzungsschlüssels wurden die englischen Texte nicht angezeigt
  • 📧 Update-Hinweis per E-Mail: Die Mail "Neue Version verfügbar" ging stündlich an die Admins, wenn einer von ihnen keine E-Mail-Adresse hatte. Solche Admins werden jetzt übersprungen
  • 💶 SEPA-Export: Die Prüfungen von IBAN und Gläubiger-ID akzeptieren nur noch die Ziffern 0-9, damit ungültige IBANs die pain.008-Datei nicht mehr beschädigen können

Sicherheit​

  • 🔐 Login-Sperre pro Benutzername und Adresse: Die Sperre wird nicht mehr pro Konto, sondern pro Benutzername und Adresse des Besuchers gezählt. Ein Angreifer kann so bekannte Konten wie Admin nicht mehr dauerhaft für alle sperren. IPv6 zählt pro /64-Netz, unbekannte Benutzernamen werden wie bekannte gesperrt. Der Zustand liegt im Arbeitsspeicher und wird durch einen Neustart des Backends zurückgesetzt. Mehr dazu unter Benutzerkonto & Sicherheit
  • 🎫 Tokens werden bei jeder Anfrage geprüft: Die Anmeldung wird bei jeder Anfrage gegen den aktuellen Benutzer und seine Rolle geprüft, gelöschte oder geänderte Benutzer verlieren sofort den Zugriff und nicht erst nach bis zu 8 Stunden
  • 🗃️ Gelöschte Mitglieder: Nur Admins können gelöschte Mitglieder noch lesen oder ändern, ein zweites Löschen überschreibt nicht mehr den ursprünglichen Löschzeitpunkt
  • 📝 Selbstregistrierung: Das Datum der SEPA-Zustimmung setzt der Server, sepaConsent wird von POST /self-enrollment nicht mehr akzeptiert. HTML in Namen wird in System-Mails und Rundmail-Platzhaltern kodiert, Namensfelder sind auf 100 Zeichen begrenzt
  • 🧱 Proxy-Vertrauen (nginx): X-Forwarded-For wird nicht mehr von dem gesamten Bereich 172.16.0.0/12 akzeptiert, wodurch sich Rate-Limit und Login-Sperre umgehen und die IP bei Selbstregistrierungen fälschen ließen. Vertraut wird nur noch dem Caddy aus docker-compose-tls.yml (feste Adresse 172.31.250.2 im Netzwerk edge)

Logging​

  • 🪵 Wichtige Aktionen werden protokolliert: Anmeldungen, Benutzer- und Mitgliederverwaltung, Selbstregistrierung, CSV-Import/-Export, Beiträge, SEPA-Exporte, Belege, Mail, Kalender, Backups, Einstellungen und Hintergrundjobs landen mit IDs und der ID des handelnden Benutzers im Backend-Log, dazu fehlgeschlagene Token-Prüfungen, verbotene Zugriffe und Rate-Limit-Treffer. Personenbezogene Daten werden nicht mehr geloggt
  • 📊 Jede Anfrage einmal mit Status und Dauer: /health und die doppelte REQUEST:-Zeile, die den Kalender-Feed-Token preisgab, entfallen. Fehlgeschlagene Backups und Wiederherstellungen, unbehandelte Ausnahmen (mit Stacktrace), Startinformationen und die stündliche Update-Prüfung werden sauber protokolliert

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Es ist eine neue Datenbank-Migration enthalten (AddMembershipStatusToMembers), sie läuft beim Start automatisch. Bestehende Mitglieder erhalten den Status "Mitglied"
  • Nur Variante B (eigener Reverse Proxy): Lege neben der Compose-Datei den Ordner trusted-proxies an und trage die Adresse deines Proxys in eine .conf-Datei darin ein, z. B. set_real_ip_from 192.168.1.20;. Dein Proxy muss X-Forwarded-For mit der Besucher-Adresse überschreiben (nginx: proxy_set_header X-Forwarded-For $remote_addr;). Ohne diesen Schritt teilen sich alle Besucher ein Rate-Limit und eine Login-Sperre. Die Anleitung steht unter Get Started, der Ordner bleibt bei Updates unangetastet. Variante A (Caddy) braucht nichts

Warum diese Updates wichtig sind​

Der Mitgliedsstatus macht Fördermitglieder in Liste und Beitragsverwaltung auf einen Blick erkennbar, und das Löschen offener Beiträge nimmt den Druck, falsche oder zurückgebuchte Forderungen mühsam umgehen zu müssen. Dass ausgetretene Mitglieder nicht mehr abgerechnet werden, verhindert Fehlbuchungen. Das erweiterte Audit Log zeigt nachvollziehbar, wer was geändert hat, ohne sensible Daten zu speichern, und die Sicherheitsverbesserungen stellen sicher, dass Login-Sperre und Rate-Limits wirklich nur Angreifer treffen und nicht den eigenen Vorstand.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.9.0 – Der Vereinskalender ist da 📅🎉

· 4 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 16. Oktober 2026

Mit Uni-Verein 1.9.0 bekommt der Verein einen eigenen Kalender: Termine planen, Mitglieder einladen, Zu- und Absagen einsammeln, Serientermine anlegen und per Glocke und E-Mail erinnert werden. Wer möchte, bindet den Vereinskalender in Apple Kalender, Google Kalender oder Outlook ein oder stellt ausgewählte Termine in einem öffentlichen Kalender bereit.

Highlights​

  • 📅 Vereinskalender für alle Rollen: Jeder eingeloggte Nutzer kann Termine anlegen, mit Ort, Online-Link, Beschreibung und farbiger Kategorie
  • 👥 Einladungen und Zu-/Absagen: Andere Nutzer lassen sich als Teilnehmer oder Mitbearbeiter einladen und antworten mit Ja, Vielleicht oder Nein
  • 🔁 Serientermine und Erinnerungen: Täglich, wöchentlich, monatlich oder jährlich wiederholen, einzelne Termine absagen, Erinnerung von "zu Beginn" bis eine Woche vorher
  • 🔔 Benachrichtigungen per Glocke und E-Mail: Einladungen, Änderungen, Löschungen, Antworten und Erinnerungen, E-Mails mit .ics-Einladung
  • 🌍 Kalender-Abo und öffentlicher Kalender: Persönlicher Abo-Link für Apple, Google und Outlook sowie eine öffentliche Kalenderseite ohne Login

Neue Funktionen​

  • 📅 Neuer Kalender (UV-6): Der Kalender ist in der Seitenleiste unter "Kalender" erreichbar, mit Monats-, Wochen- und Listenansicht. Termine können zeitgebunden oder ganztägig sein und haben optional einen Ort mit Adresse (inklusive Kartenlink), einen Online-Link und eine Kategorie. Die Kategorien legt der Admin unter "Kalenderkategorien verwalten" an. Auf dem Smartphone ersetzt "Kalender" in der unteren Navigation den Tab "Auswertung", die Belegauswertung bleibt über das Menü erreichbar. Alles dazu steht in der Kalender-Anleitung
  • 👁️ Sichtbarkeit: Ein Termin ist für den ganzen Verein, nur für Eingeladene oder privat nur für den Besitzer sichtbar, privat nicht einmal für Admins
  • 🤝 Zusammenarbeit: Eingeladene sind Teilnehmer oder Mitbearbeiter. Mitbearbeiter ändern den Termin gemeinsam mit dem Besitzer. Hat zwischenzeitlich jemand anderes gespeichert, wird die Änderung mit einem Hinweis zum Neuladen abgelehnt, statt etwas stillschweigend zu überschreiben
  • 🔁 Wiederholungen: Termine wiederholen sich täglich, wöchentlich, monatlich oder jährlich. Die Uhrzeit bleibt auch beim Wechsel zwischen Sommer- und Winterzeit gleich, und einzelne Termine einer Serie lassen sich absagen
  • ⏰ Erinnerungen: Von "zu Beginn" bis eine Woche vorher, per Glocke und E-Mail an alle, die den Termin abonniert haben
  • 🔔 Benachrichtigungen: Die Glocke ist jetzt für jede Rolle sichtbar. Benachrichtigungen lassen sich einzeln löschen, bereits gelesene mit "Gelesene löschen" auf einmal. Jede Art von Kalender-Mail kann in den Profileinstellungen abgeschaltet werden
  • 📲 Persönlicher Kalender-Feed: Jeder Nutzer kann seinen Kalender über einen geheimen Webcal-Link in Apple Kalender, Google Kalender oder Outlook abonnieren, der Link lässt sich jederzeit widerrufen
  • 🌍 Öffentlicher Kalender: Admins können einen öffentlichen Kalender aktivieren, der einzelne Termine oder ganze Kategorien ohne Teilnehmer oder andere persönliche Daten unter /calendar/public und als Webcal-Feed zeigt, auf Wunsch nur über einen geheimen Link. Mehr dazu unter Kalender abonnieren & öffentlicher Kalender
  • 🗂️ Vergangene Termine ausblenden: Die Listenansicht des aktuellen Monats blendet vergangene Termine hinter "Vergangene Termine anzeigen" aus, im Vereinskalender und im öffentlichen Kalender

Fehlerbehebungen​

  • 🧾 Beschreibung im Belegformular (UV-53): Das Beschreibungsfeld ist jetzt mehrzeilig und nutzt die volle Breite, sodass längere Beschreibungen in der Belegverwaltung Platz finden
  • 📝 Titel der Selbstregistrierung (UV-54): Das öffentliche Anmeldeformular der Selbstregistrierung zeigt jetzt einen eigenen Titel (Bei Verein <Vereinsname> beitreten bzw. Dem Verein beitreten) und einen an Interessierte gerichteten Untertitel. Vorher erschienen Titel und Text des Admin-Dialogs "Mitglied anlegen"
  • 👤 Admins können sich wieder selbst bearbeiten (UV-62): Admins dürfen Benutzernamen, E-Mail und Passwort ihres eigenen Kontos wieder ändern. Nur die Änderung der eigenen Rolle wird weiterhin abgelehnt

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Es sind vier neue Datenbank-Migrationen enthalten (AddCalendar, AddCalendarCollaboration, AddCalendarRecurrenceAndReminders, AddCalendarFeedsAndPublicCalendar), die beim Start automatisch ausgeführt werden. Es sind keine manuellen Schritte nötig
  • Neue Abhängigkeiten sind Ical.Net (Backend) und FullCalendar (Frontend), beide MIT-lizenziert
  • Damit Kalender-E-Mails verschickt werden können, müssen die Mail-Einstellungen eingerichtet sein. Die Benachrichtigungen in der Glocke funktionieren auch ohne

Warum diese Updates wichtig sind​

Termine, Zu- und Absagen liefen in vielen Vereinen bisher über Chatgruppen und Tabellen. Mit dem Kalender stehen sie dort, wo auch Mitglieder, Beiträge und Belege liegen. Wer eingeladen ist, wird benachrichtigt, wer mitplant, überschreibt keine Änderungen von anderen, und die Termine landen per Abo direkt im privaten Kalender. Der öffentliche Kalender hilft, Veranstaltungen nach außen zu zeigen, ohne Mitgliederdaten preiszugeben.

Wie geht es weiter?​

Wir sind gespannt auf euer Feedback zum Kalender, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.4 – Kein weißer Bildschirm mehr, Mail läuft wieder am iPhone 📱🛟

· 2 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 3. Oktober 2026

Noch am selben Tag wie 1.8.3 folgt Uni-Verein 1.8.4, ein kleines Fehlerbehebungs-Release: Der Mailversand funktioniert am iPhone wieder, und wenn eine Seite einmal nicht lädt, bleibt die App ab jetzt bedienbar.

Highlights​

  • 📱 Mail läuft wieder am iPhone: Beim Öffnen von "Mail" erscheint kein weißer Bildschirm mehr
  • 🛟 Keine leeren Seiten mehr nach Fehlern: Wenn eine Seite nicht geladen werden kann, siehst du jetzt eine Fehlermeldung mit Neu-laden-Button. Die Navigation bleibt nutzbar, sodass du zu einer anderen Seite wechseln kannst
  • 🔄 Reibungslosere Updates: Ist die App geöffnet, während eine neue Version bereitgestellt wird, lädt sie einmal selbstständig neu, statt eine Seite nicht mehr öffnen zu können

Fehlerbehebungen​

  • 📱 Mail am iPhone (UV-51): Das Öffnen von "Mail" auf dem iPhone zeigt keinen weißen Bildschirm mehr. Auf den Mail-Editor wurde zugegriffen, nachdem er bereits geschlossen worden war, und der daraus folgende Fehler riss die gesamte App mit
  • 🛟 Fehlermeldung statt leerer Seite: Läuft eine Seite in einen Fehler, erscheint im Inhaltsbereich jetzt eine Fehlermeldung ("Hier ist etwas schiefgelaufen") mit den Buttons "Erneut versuchen" und "Neu laden". Seitenleiste und mobile Navigation bleiben bedienbar, und der Wechsel auf eine andere Seite blendet die Meldung wieder aus
  • 🔄 Fehlende Seitendateien nach einem Update: War die App noch aus der vorherigen Version geöffnet und eine Seitendatei dieser Version existiert nicht mehr, lädt die App jetzt einmal neu und holt die aktuelle Version. Fehlt die Datei danach immer noch, erscheint die Fehlermeldung, statt wieder und wieder neu zu laden

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Es ist keine Datenbank-Migration nötig
  • An deinen Einstellungen oder der API ist nichts zu ändern

Warum diese Updates wichtig sind​

Ein weißer Bildschirm ist für Nutzer die schlechteste Rückmeldung, denn man weiß weder, was passiert ist, noch, wie es weitergeht. Mit der Fehlermeldung und der weiterhin nutzbaren Navigation kommen alle auch bei einem unerwarteten Fehler weiter, und der automatische Neuladen-Schritt nach Updates verhindert viele solcher Fälle schon im Vorfeld.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.3 – SEPA-Export fit für November 2026 🏦✅

· 4 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 3. Oktober 2026

Uni-Verein 1.8.3 bereitet den SEPA-Export auf die Änderungen ab dem 15. November 2026 vor: Die Lastschriftdatei (pain.008.001.08) folgt den EPC-Regeln für SDD Core 2025 und verwendet strukturierte Adressen. Außerdem werden Prüfungen strenger, damit keine Datei entsteht, die die Bank ablehnen würde, und die mobile Ansicht wurde aufgeräumt.

Highlights​

  • 🏦 SEPA-Export bereit für November 2026: Die Lastschriftdatei folgt den EPC-Regeln für SDD Core 2025 und den neuen Regeln für strukturierte Adressen, die ab dem 15. November 2026 gelten
  • ✅ Zuverlässigere SEPA-Dateien: IBANs und Gläubiger-Identifikationsnummer werden inklusive Prüfziffern geprüft, Text wird in den SEPA-Zeichensatz umgewandelt (z. B. ä → ae) und jede Transaktion bekommt eine eigene eindeutige ID
  • 💳 Mitglieder ohne BIC werden nicht mehr übersprungen: Sie werden, wie von SEPA erlaubt, mit NOTPROVIDED exportiert
  • 📱 Bessere mobile Ansicht: Die Icons der unteren Navigation sind wieder ausgerichtet, und die Benutzerverwaltung läuft nicht mehr über den Bildschirmrand

Fehlerbehebungen​

  • 🏦 SEPA-Export nach aktuellen Regeln (UV-50): Der Export (pain.008.001.08) folgt den EPC-Regeln für SDD Core 2025 und den Adressregeln ab dem 15. November 2026:
    • Adressen sind vollständig strukturiert (Straße, Postleitzahl, Ort, Land) statt einer einzelnen Freitext-Adresszeile
    • Text verwendet den SEPA-Zeichensatz (z. B. ä → ae)
    • Jede Transaktion erhält eine eindeutige ID, sodass mehrere offene Beiträge desselben Mitglieds nicht mehr kollidieren
    • Mitglieder ohne BIC werden als NOTPROVIDED exportiert, statt übersprungen zu werden
    • BIC des Vereins, IBANs und Gläubiger-Identifikationsnummer werden inklusive Prüfziffern kontrolliert. Beiträge mit ungültiger IBAN werden nicht in die Datei aufgenommen
    • Ein Export ohne einziehbare Beiträge zeigt eine Meldung, statt eine leere Datei zu erzeugen
    • Gelöschte Exporte erscheinen nicht mehr im Exportverlauf
  • 📱 Navigation am Handy (UV-48): Die Icons der unteren Navigation sind wieder ausgerichtet. Inaktive Tabs hatten ihre Beschriftung nur optisch versteckt, wodurch "SEPA Export" auf zwei Zeilen umbrach und das Bank-Icon nach oben schob. Alle Tabs zeigen jetzt ein kurzes, einzeiliges Label (z. B. "SEPA", "Mail", "Auswertung"), und der aktive Tab verschiebt sich nicht mehr
  • 📱 Benutzerverwaltung am Handy (UV-49): Die Benutzerverwaltung läuft auf dem Handy nicht mehr über den Bildschirm. Die lange Tab-Beschriftung "Benachrichtigungseinstellungen" hatte die ganze Seite verbreitert. Sie ist jetzt zu "Benachrichtigungen" gekürzt, die Tabs scrollen bei Platzmangel, und der Tab-Indikator bleibt innerhalb der abgerundeten Ecken

Verbesserungen​

  • 🐳 Das Frontend-Docker-Image wird mit Node 24 statt Node 20 gebaut, da Node 20 seit April 2026 nicht mehr unterstützt wird. Das Laufzeit-Image (nginx) bleibt unverändert
  • 📦 Aktualisierte Abhängigkeiten: MailKit 4.18.1 und der Tiptap-Mail-Editor 3.31.4, dazu mehrere Entwicklungswerkzeuge

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Es ist keine Datenbank-Migration nötig
  • SEPA-Einstellungen vor dem nächsten Export prüfen: Straße und Postleitzahl des Vereins werden jetzt als strukturierte Adresse geschrieben, sie müssen also ausgefüllt sein. Die Gläubiger-Identifikationsnummer wird jetzt inklusive Prüfziffern kontrolliert, sodass eine falsch eingegebene den Export mit einer Fehlermeldung stoppt, statt eine Datei zu erzeugen, die die Bank ablehnen würde
  • Mitglieder ohne BIC sind jetzt im Export enthalten. Vorher wurden sie stillschweigend ausgelassen. Wer sich darauf verlassen hat, sollte den Export vor dem Hochladen bei der Bank prüfen
  • Gibt es keine einziehbaren Beiträge, erscheint jetzt eine Meldung statt einer leeren Datei

Warum diese Updates wichtig sind​

Ab dem 15. November 2026 gelten neue Regeln für strukturierte Adressen in SEPA-Dateien. Banken lehnen Dateien ab, die nicht dazu passen, und das gerade dann, wenn Beiträge eingezogen werden sollen. Durch die strengeren Prüfungen vorab merkt man Fehler jetzt direkt im Export und nicht erst nach der Ablehnung durch die Bank. Die Korrekturen an der mobilen Ansicht machen die Bedienung am Handy außerdem wieder angenehmer.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.2 – Sicherere Mails, maskierte IBANs und Vereinslogo 🛡️✉️

· 4 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 30. September 2026

Uni-Verein 1.8.2 setzt die Sicherheitsarbeit aus 1.8.1 fort: Mail-Inhalte werden serverseitig bereinigt, IBANs sind für reguläre User maskiert und der Passwortwechsel verlangt das aktuelle Passwort. Dazu kommen ein eigener Absendername für Mails und das Vereinslogo in der Seitenleiste.

Highlights​

  • 🛡️ Sicherere Mails: Mail-Inhalte werden auf dem Server bereinigt. Es bleibt nur die Formatierung erhalten, die der Mail-Editor erzeugen kann, Skripte, Event-Handler, javascript:-Links, Formulare und iframes werden entfernt
  • 🔒 IBANs für reguläre User maskiert: Nur ADMIN und FINANCIAL_MANAGER sehen vollständige IBANs, die Rolle USER sieht sie bis auf die letzten 6 Zeichen maskiert
  • 🔑 Passwortwechsel nur mit aktuellem Passwort: Falsche Eingaben zählen zur Login-Sperre
  • ✉️ Absendername für Mails: Neues Feld "Absendername" in den Mail-Einstellungen, damit Mails z. B. als Vorstand <vorstand@verein.de> erscheinen
  • 🖼️ Vereinslogo in der Seitenleiste: Die Seitenleiste zeigt das Logo aus den allgemeinen Einstellungen

Neue Funktionen​

  • ✉️ Absendername (UV-47): Die Mail-Einstellungen haben ein neues optionales Feld "Absendername", das Empfänger als Absender sehen. Bisher wurde "Absender Email (From)" gleichzeitig als Name und Adresse verwendet, sodass die Eingabe eines Namens dort den Mailversand scheitern ließ. Das Feld für die Absender-E-Mail akzeptiert jetzt nur noch eine gültige Adresse
  • 🖼️ Vereinslogo in der Seitenleiste (UV-24): Das Logo aus den allgemeinen Einstellungen erscheint oben links in der Seitenleiste, sowohl aufgeklappt als auch eingeklappt. Ist kein Logo hochgeladen, wird weiterhin der erste Buchstabe des Vereinsnamens angezeigt

Sicherheit​

  • 🛡️ Mail-Inhalte bereinigen (UV-17): Der Text von Mails, die über /mail/send verschickt werden, wird serverseitig mit HtmlSanitizer bereinigt. Erhalten bleiben Text, Überschriften, Listen, Links, Bilder, Farben und Ausrichtung. Skripte, Event-Handler, javascript:-Links, Formulare und iframes werden entfernt, data:-URLs sind nur für Inline-Bilder erlaubt (kein SVG). Markdown-Release-Notes in Firmware-Update-Mails rendern außerdem kein rohes HTML mehr
  • 🔒 IBANs maskieren (UV-26): Vollständige IBANs der Mitglieder erhalten nur ADMIN und FINANCIAL_MANAGER. Die Rolle USER bekommt sie bis auf die letzten 6 Zeichen maskiert (Mitgliederliste, Antworten beim Anlegen/Ändern von Mitgliedern und die Warteschlange "Ausstehende Mitglieder"). So lässt sich eine IBAN weiterhin prüfen und durch eine neue ersetzen. Eine maskierte IBAN, die zurück an die API geschickt wird, gilt als unverändert und wird nie gespeichert
  • 🔑 Aktuelles Passwort erforderlich (UV-30): Wer sein eigenes Passwort ändert, muss das aktuelle eingeben, sowohl in den Profileinstellungen als auch, wenn ein Admin in der Benutzerverwaltung seinen eigenen Account bearbeitet. Falsche Versuche zählen zur Login-Sperre. Admins können die Passwörter anderer Benutzer weiterhin ohne das alte Passwort zurücksetzen
  • 🧰 Die transitive Build-Abhängigkeit serialize-javascript wurde auf 7.1.2 angehoben, um GHSA-gfhx-hw2g-v5hg zu beheben (XSS durch nicht maskiertes </script> in serialisierten Funktionskörpern, Schweregrad niedrig)

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Die Datenbank-Migration (AddMailFromName) läuft beim Start automatisch. Bestehende Mail-Einstellungen funktionieren weiter, der neue Absendername ist zunächst leer
  • Wer als Workaround einen Namen in "Absender Email (From)" eingetragen hatte, sollte ihn in das neue Feld "Absendername" verschieben. Das Feld für die Absender-E-Mail akzeptiert nur noch eine gültige Adresse

Warum diese Updates wichtig sind​

Mails sind ein sensibler Weg: Wer Inhalte aus dem Editor versendet, soll sich darauf verlassen können, dass dabei kein aktiver Code mitreist. Maskierte IBANs sorgen dafür, dass Bankdaten nur diejenigen vollständig sehen, die sie wirklich brauchen, und die Abfrage des aktuellen Passworts schützt Accounts auch dann, wenn jemand kurz an einem entsperrten Rechner sitzt. Absendername und Logo machen den Verein zudem im Postfach und in der Oberfläche besser erkennbar.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.1 – HTTPS inklusive und umfassende Sicherheitshärtung 🔐🛡️

· 5 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 26. September 2026

Uni-Verein 1.8.1 ist ein Sicherheits-Release: Die Installation bekommt HTTPS direkt ab Werk, der Login wird deutlich robuster gegen Angriffe, Uploads werden strenger geprüft und alle Container laufen ohne Root-Rechte.

Highlights​

  • 🔐 HTTPS ab Werk: Eine neue docker-compose-tls.yml samt Caddyfile stellt Caddy vor den Stack und holt automatisch ein Let's-Encrypt-Zertifikat. Das ist jetzt der empfohlene Installationsweg
  • 🛡️ Gehärteter Login: Rate-Limiting pro IP, keine Rückschlüsse mehr darauf, ob ein Benutzername existiert, und Sperren dauern höchstens 15 statt bis zu 24 Stunden
  • 🔑 Kein Standard-Admin-Passwort mehr im Einsatz: Wer sich mit admin123 anmeldet, muss zuerst ein neues Passwort setzen
  • 📦 Sicherere Uploads und Container: Belegdateien werden anhand ihres tatsächlichen Inhalts geprüft, Upload-Größen sind begrenzt, alle Container laufen als Nicht-Root-User

Neue Funktionen​

  • 🔐 HTTPS mit Let's Encrypt (UV-27): docker-compose-tls.yml und Caddyfile richten automatisches HTTPS ein (erfordert einen DNS-Eintrag sowie die Ports 80 und 443). Der Selbst-Update-Ablauf erkennt und unterstützt beide Varianten und aktualisiert auch das Caddyfile. nginx ermittelt die echte Client-IP hinter Caddy, damit Rate-Limiting und Audit-Logs weiter funktionieren
  • 🚦 Rate-Limiter für den Login (UV-31): /auth/login ist pro IP-Adresse begrenzt (Standard 20 Anfragen pro Zeitfenster, konfigurierbar über RateLimiting:AuthLogin:PermitLimit)
  • 🔑 Passwortwechsel erzwungen (UV-25): Beim Login mit dem Standardpasswort admin123 erscheint ein Dialog, der sich erst nach dem Setzen eines neuen Passworts schließen lässt
  • 🔍 Automatische Abhängigkeitsprüfung (UV-42): npm audit --audit-level=high läuft in der CI, dazu kommt Dependabot (ein gebündelter wöchentlicher PR, keine Major-Updates)

Verbesserungen​

  • 🔒 Authentifizierung als Standard (UV-41): Alle Endpunkte erfordern jetzt standardmäßig eine Anmeldung. Bewusst öffentliche Endpunkte (Login, Selbstregistrierung, öffentliche Seitenkonfiguration, /health) sind ausdrücklich freigegeben
  • ⏱️ Fairere Sperren (UV-45): Fehlversuche beim Login verfallen nach 15 Minuten, und die Sperre ist auf maximal 15 Minuten begrenzt (vorher bis zu 24 Stunden)
  • 👤 Admin-Schutz (UV-25): Der Standard-Admin wird nur noch angelegt, wenn noch gar kein Benutzer existiert. Admins können sich nicht mehr selbst löschen oder ihre eigene Rolle ändern
  • 🧾 Uploads nach Inhalt prüfen (UV-32): Belegdateien werden anhand der Magic Bytes (PNG, JPEG, GIF, WebP, PDF) validiert statt anhand des vom Browser gemeldeten Typs. SVG und unbekannte Formate werden abgelehnt. Downloads senden X-Content-Type-Options: nosniff und Content-Disposition: attachment
  • 📏 Upload-Limits (UV-43): Das globale Request-Limit sinkt von 10 GB auf 100 MB, nur die Backup-Wiederherstellung behält 10 GB. Belegdateien und der CSV-Import der Mitglieder sind auf 10 MB pro Datei begrenzt, zu große PDFs werden schon im Browser abgelehnt
  • 🧱 Security-Header (UV-33): Beide nginx-Konfigurationen senden CSP, X-Frame-Options, nosniff, Referrer-Policy und Permissions-Policy
  • 🌐 CORS (UV-28): Erlaubte Origins werden über Cors:AllowedOrigins konfiguriert (in Produktion leer), statt jeden localhost-Origin zuzulassen
  • 🔗 Sichere Bestätigungslinks (UV-35): Die Links der Selbstregistrierung nutzen eine gespeicherte PublicBaseUrl statt des Host-Headers der Anfrage, sodass keine Phishing-Links über gefälschte Hosts möglich sind
  • 📦 Container ohne Root (UV-37): Alle Container laufen als Nicht-Root-User, mit cap_drop: [ALL] und no-new-privileges, wo es möglich ist
  • 🗝️ Geheimnisse (UV-38, UV-39): Das Init-Skript erzeugt zufällige Datenbank-Passwörter und gibt nur noch die Namen der .env-Schlüssel aus, nicht deren Werte. .env.example enthält nur Platzhalter statt echter Schlüssel
  • 🧰 Abhängigkeiten (UV-40): Serilog.Sinks.File ist auf die stabile Version 7.0.0 festgelegt, das ungenutzte BCrypt.Net-Next wurde entfernt, dazu Minor-/Patch-Updates für Backend und Frontend

Fehlerbehebungen​

  • 🖥️ Weißer Bildschirm nach dem Login (UV-18): Nach einem Update konnten veraltete, nachgeladene Programmteile einen leeren Bildschirm verursachen. Die App lädt jetzt automatisch neu, sobald ein neuer Service Worker übernimmt
  • 🔔 Firmware-Hinweis (UV-46): Der Hinweis auf ein Firmware-Update vergleicht jetzt echte Versionsnummern und erscheint nur, wenn tatsächlich eine neuere Version existiert
  • 🕵️ Benutzernamen-Enumeration (UV-44): Die Antwortzeit beim Login verrät nicht mehr, ob ein Benutzername existiert. Rohe Benutzernamen werden nicht mehr ins Log geschrieben
  • 🌍 Gefälschte IP-Header (UV-34): X-Real-IP wird nur noch aus privaten bzw. internen Netzen akzeptiert, damit sich IP-basierte Limits nicht mit einem gefälschten Header umgehen lassen

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben. Proxy und Frontend lauschen im Container jetzt auf Port 8080 (der Host-Port bleibt 80), daher müssen nginx.conf und die Compose-Datei gemeinsam ersetzt werden. Das Update-Skript erledigt das für dich
  • logs/ und receipts/ müssen für das Nicht-Root-Backend (UID 1654) beschreibbar sein. Das Update-Skript kümmert sich über docker-compose-ini.yml darum. Bei einer manuellen Installation: chown -R 1654:1654 logs receipts
  • Wer die Selbstregistrierung nutzt: War sie schon vor dem Update aktiviert, muss ein Admin einmal die allgemeinen Einstellungen öffnen und speichern. Dabei wird die öffentliche URL für die Bestätigungslinks hinterlegt. Bis dahin schlagen neue Anmeldungen fehl
  • Die Datenbank-Migration (AddLastFailedLoginAttemptAndPublicBaseUrl) läuft beim Start automatisch

Warum diese Updates wichtig sind​

Ein Vereinssystem verwaltet Namen, Adressen und Bankdaten und sollte daher so sicher betrieben werden wie möglich. Mit HTTPS ab Werk, einem robusteren Login und strengeren Prüfungen bei Uploads und Netzwerkzugriffen schließt 1.8.1 gleich eine ganze Reihe möglicher Angriffsflächen. Dass die Container jetzt ohne Root-Rechte laufen, begrenzt zudem den Schaden, falls doch einmal etwas schiefgeht.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!

Uni-Verein 1.8.0 – Selbstregistrierung für den Dauereinsatz 📝✅

· 3 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 20. September 2026

Uni-Verein 1.8.0 macht die Selbstregistrierung (bisher gedacht für den kurzzeitigen Einsatz z. B. am Messestand) fit für den dauerhaften Betrieb: Anmeldungen legen jetzt erst nach bestätigter E-Mail-Adresse und Prüfung durch eine eingeloggte Person ein Mitglied an, statt sofort. Dazu kommt eine neue Opt-in-Benachrichtigung für neue Anmeldungen und ein Sicherheits-Fix bei bereits bezahlten Belegen.

Highlights​

  • 📝 Gehärtete Selbstregistrierung: E-Mail-Bestätigung (48h) plus Prüf-Warteschlange statt direkter Mitgliedsanlage
  • 🔔 Opt-in-Benachrichtigung: Jede eingeloggte Person kann sich per Mail über neue Anmeldungen informieren lassen
  • 🔒 Beleg-Fix: Bereits bezahlte Belege können von regulären Usern nicht mehr gelöscht werden

Neue Funktionen​

  • 📝 Selbstregistrierung: Das öffentliche Formular erstellt kein Mitglied mehr direkt, sondern verlangt zunächst eine Bestätigung der angegebenen E-Mail-Adresse über einen 48 Stunden gültigen Link. Erst danach landet die Anmeldung im Tab "Ausstehende Mitglieder" der Mitgliederverwaltung, sichtbar für alle eingeloggten Rollen, die sie dort genehmigen oder ablehnen können
  • ✍️ Motivation statt Kategorie: Interessierte geben stattdessen eine kurze Motivation sowie verpflichtend IBAN und BIC an, eine Mitgliederkategorie wird erst von der prüfenden Person beim Genehmigen vergeben
  • 🛡️ Härtung fürs Tagesgeschäft: Rate-Limiting pro IP-Adresse, strengere E-Mail-Validierung, eine Voraussetzung, dass Mail-Einstellungen konfiguriert sind, bevor die Selbstregistrierung aktiviert werden kann, sowie eine mobil-freundliche Ansicht für die Warteschlange
  • 🔔 Benachrichtigung bei neuer Anmeldung: Jede eingeloggte Person kann sich unabhängig von ihrer Rolle über einen neuen Schalter in den Benachrichtigungseinstellungen für eine E-Mail bei jeder neu bestätigten Anmeldung eintragen, standardmäßig deaktiviert

Fehlerbehebungen​

  • 🔒 Beleg-Löschen nach Bezahlung: Ein regulärer User konnte einen eigenen Beleg auch dann noch löschen, wenn er von Admin oder Finanzverwalter bereits als bezahlt markiert worden war, da die Löschprüfung nur den Beleg-Besitzer, nicht aber den Bezahlt-Status berücksichtigte. Das Löschen eines bezahlten Belegs durch reguläre User liefert jetzt einen Fehler, der Löschen-Button wird dafür ausgeblendet. Admin und Finanzverwalter können bezahlte Belege weiterhin löschen

Warum diese Updates wichtig sind​

Die ursprüngliche Selbstregistrierung war für den kurzzeitigen Einsatz gedacht, etwa um bei einer Veranstaltung schnell neue Mitglieder zu gewinnen. Für den dauerhaften Einsatz auf der Vereinswebsite braucht es mehr Absicherung: Die E-Mail-Bestätigung verhindert Anmeldungen mit falschen oder fremden Adressen, die Prüf-Warteschlange gibt dem Vorstand die Kontrolle über jede neue Aufnahme, und die Opt-in-Benachrichtigung sorgt dafür, dass niemand manuell nachschauen muss, ob etwas Neues wartet.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!