- forcesavetype in Editor-Config: Ctrl+S speichert sofort zurueck
zum Server (statt erst beim Schliessen des Dokuments)
- ALLOW_PRIVATE_IP_ADDRESS + ALLOW_META_IP_ADDRESS fuer OnlyOffice
damit Callbacks an interne Docker-IPs funktionieren
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Document-Key nutzt jetzt Timestamp statt Checksum, damit OnlyOffice
bei jedem Oeffnen die aktuelle Version vom Server laedt statt eine
gecachte alte Version anzuzeigen.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Der @api_bp.route('/files/onlyoffice-callback') Dekorator war
versehentlich auf oo_download statt onlyoffice_callback gelandet.
Flask routete dadurch alle Callback-POSTs an oo_download, die dann
mit 'missing access_key argument' crashte (500 Error).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Gesamter Callback in try/except gewrapped (gibt immer error:0
zurueck, damit OnlyOffice nicht endlos retryt)
- JWT Body-Decoding mit graceful fallback auf Raw-Daten
- JWT-Header-Validierung entfernt (verursachte den 500 Crash)
- Download ohne extra JWT-Header (OnlyOffice-interne URLs
brauchen das nicht)
- Ausfuehrliches Logging: Status, Key, Dateiname, Groesse
- Saubere Imports am Anfang der Funktion
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Problem: OnlyOffice sendete JWT-Token im Callback-Request und im
Body, unser Endpoint hat das ignoriert -> Speichern schlug fehl.
Fix:
- Callback validiert OnlyOffice JWT aus Authorization-Header
- Callback entpackt JWT-wrapped Body (OnlyOffice wraps den Body
in einen JWT-Token wenn JWT_ENABLED=true)
- Download der gespeicherten Datei sendet JWT-Header mit
- Besseres Error-Logging mit Traceback
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Problem: OnlyOffice konnte Dateien nicht herunterladen weil unser
token_required-Decorator den Request ablehnte - OnlyOffice sendet
eigene Header die mit unserem JWT-System kollidieren.
Loesung: Eigener Endpunkt GET /files/oo-download/<access_key>
- Kein JWT noetig, stattdessen Einmal-Schluessel
- Schluessel wird beim Oeffnen des Editors generiert und in der DB gespeichert
- Schluessel enthaelt file_id + user_id, wird beim Download validiert
- OnlyOffice ruft diesen Endpunkt intern auf (http://minicloud:5000)
- Kein Token in der URL, keine JWT-Konflikte
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Problem: OnlyOffice versuchte Dateien ueber die oeffentliche URL
herunterzuladen (http://selftestcloud...) und bekam 401 weil der
Access-Token nach 15 Min. ablief.
Fix:
- Download-URL und Callback-URL nutzen jetzt die interne Docker-URL
(http://minicloud:5000) statt die oeffentliche URL
- Eigener 24h-Token fuer OnlyOffice Datei-Zugriff (statt des
kurzlebigen User-Access-Tokens)
- ONLYOFFICE_INTERNAL_URL konfigurierbar (Default: http://minicloud:5000)
So bleibt der gesamte Dateizugriff zwischen OnlyOffice und Mini-Cloud
im Docker-Netzwerk - schneller und kein externer Roundtrip.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Kein ONLYOFFICE_JWT_SECRET mehr, nutzt JWT_SECRET_KEY automatisch
- Nur noch ONLYOFFICE_URL in .env setzen
- Eigene Subdomain mit HTTPS als Pflicht beschrieben
- Schritte vereinfacht (4 statt 5)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- OnlyOffice und Mini-Cloud teilen sich den gleichen JWT_SECRET_KEY
- ONLYOFFICE_JWT_SECRET komplett entfernt (aus .env, docker-compose, Backend, Frontend)
- docker-compose: OnlyOffice liest JWT_SECRET=${JWT_SECRET_KEY}
- In .env nur noch ONLYOFFICE_URL setzen, fertig
- Admin-GUI zeigt: URL + "JWT nutzt JWT_SECRET_KEY aus .env"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OnlyOffice URL und JWT Secret kommen jetzt ausschliesslich aus der
.env Datei (Umgebungsvariablen), nicht mehr aus der Admin-GUI:
- ONLYOFFICE_URL und ONLYOFFICE_JWT_SECRET in .env setzen
- docker-compose liest das gleiche Secret fuer den OnlyOffice-Container
- Eine Quelle der Wahrheit, kein Sync zwischen .env und DB noetig
Admin-GUI zeigt jetzt nur noch den Status an:
- Konfiguriert / Nicht konfiguriert (Tag)
- Aktuelle URL
- JWT Secret gesetzt / Fehlt (Tag)
- Setup-Anleitung mit .env Beispiel
Behebt: "Sicherheitstoken nicht korrekt" wenn OnlyOffice laeuft
aber JWT Secret nicht uebereinstimmt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pfade werden jetzt automatisch gesetzt und nicht mehr in .env
ueberschrieben, was den Bug verursacht hatte:
- Docker: Dockerfile setzt /app/data/ als ENV-Default
- Entwicklung: Config nutzt CWD/data/ als Default
.env.example erklaert das mit Kommentar.
Optionale manuelle Pfade bleiben als auskommentierte Zeilen.
Auf dem Server: DATABASE_PATH und UPLOAD_PATH aus .env loeschen
(oder auskommentieren), dann docker-compose up --build -d
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Problem: Nach Umstellung auf env_file in docker-compose wurden die
relativen Pfade (./data/minicloud.db) aus .env falsch aufgeloest.
basedir zeigte auf / statt /app, dadurch wurde eine neue leere DB
unter /data/ erstellt statt die bestehende unter /app/data/ zu nutzen.
Ergebnis: Alle User weg, Login unmoeglich.
Fix:
- config.py: _resolve_path nutzt Path.cwd() fuer relative Pfade
(in Docker CWD=/app, in Dev CWD=backend/)
- .env.example: Absolute Docker-Pfade als Default
(/app/data/minicloud.db statt ./data/minicloud.db)
mit Kommentar fuer Entwicklungsumgebung
Auf dem Server muss die .env angepasst werden:
DATABASE_PATH=/app/data/minicloud.db
UPLOAD_PATH=/app/data/files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nginx braucht Zugriff auf den OnlyOffice-Container um ihn per
HTTPS nach aussen weiterzuleiten (proxy_pass http://127.0.0.1:8080).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OnlyOffice Integration:
- DOCX, XLSX, PPTX nativ im Browser bearbeiten (wie Google Docs)
- Automatische Erkennung: Wenn OnlyOffice konfiguriert ist, wird der
vollwertige Editor geladen, sonst die einfache Vorschau als Fallback
- Backend: WOPI-aehnliche Endpunkte
- GET /files/<id>/onlyoffice-config - Editor-Konfiguration
- POST /files/onlyoffice-callback - Speicher-Callback von OnlyOffice
- GET /files/onlyoffice-status - Verfuegbarkeits-Check
- JWT-Signierung fuer sichere Kommunikation mit OnlyOffice
- Dokument-Key basiert auf file_id + checksum (Cache-Invalidierung)
Admin-Einstellungen:
- OnlyOffice URL + JWT Secret konfigurierbar
- Setup-Anleitung direkt in der UI (docker-compose auskommentieren)
docker-compose.yml:
- OnlyOffice Document Server als optionaler Service (auskommentiert)
- Einfach auskommentieren fuer volle Office-Bearbeitung
Preview:
- Oeffnet sich jetzt innerhalb der App (kein neuer Tab)
- Zurueck-Button in der Toolbar
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- share_delete_file nutzt _trash_recursive() statt db.session.delete()
- Geloeschte Dateien aus Share-Links landen im Papierkorb des Eigentümers
- Share-Dateiliste filtert getrashte Dateien aus (is_trashed=False)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Papierkorb:
- Dateien/Ordner werden beim Loeschen in den Papierkorb verschoben
(Soft-Delete) statt sofort geloescht
- Papierkorb-Seite in der Sidebar mit Tabelle aller geloeschten Elemente
- Pro Element: Wiederherstellen (am Originalort) oder endgueltig loeschen
- "Papierkorb leeren" Button loescht alles unwiderruflich
- Backend: is_trashed, trashed_at, original_parent_id Felder im File-Model
- Getrashte Dateien erscheinen nicht in der normalen Dateiliste
Bestaetigungsdialoge (vorher fehlend):
- Kontakte: "Moechtest du XY wirklich loeschen?"
- Kalender Events: Bestaetigung vor dem Loeschen
- Kalender: Bestaetigung vor dem Loeschen (mit Hinweis auf Events)
- E-Mail Nachrichten: Bestaetigung mit Betreff-Vorschau
- Share-Link Dateien: Bestaetigung beim Loeschen aus geteiltem Ordner
- Admin SFTP-Backup-Ziele: Bestaetigung
- Admin Email-Konten: Bestaetigung
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Problem: window.location.href sendet keinen Authorization-Header,
daher scheiterten alle direkten Downloads (Dateien + Ordner-ZIP)
mit 'Token fehlt'.
Loesung:
- Backend: token_required akzeptiert jetzt auch ?token=... als
Query-Parameter (Fallback wenn kein Authorization-Header)
- Frontend: downloadUrl() haengt den Access-Token automatisch als
Query-Parameter an die Download-URL an
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pi-file-zip gibt es in PrimeIcons nicht, daher wurde kein Icon
angezeigt. Ersetzt durch pi-box in Datei-Browser und Share-View.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ZIP-Download fix:
- window.location.href statt a.download fuer API-Downloads
(a.download funktioniert nicht mit authentifizierten API-Routen)
Share-Status live:
- Dateiliste wird nach jeder Share-Aenderung automatisch neu geladen
(Link erstellen, Link loeschen, Benutzer-Freigabe setzen/entfernen)
- Gruenes Share-Icon aktualisiert sich sofort ohne F5
Ordner-ZIP bei Share-Links:
- "Ganzen Ordner als ZIP herunterladen" Button bei read/write Ordner-Shares
- Backend: GET /share/<token>/download-zip mit Passwort + Ablauf-Check
- Benachrichtigung an Ersteller bei ZIP-Download
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ordner-Download:
- Ordner koennen jetzt als ZIP heruntergeladen werden (rekursiv
mit allen Unterordnern und Dateien)
- ZIP-Icon statt Download-Icon bei Ordnern in der Dateiliste
- Backend erstellt ZIP mit ZIP_DEFLATED und allowZip64 fuer grosse Ordner
Share-Status visuell:
- Share-Button zeigt gruenes Personen-Icon (pi-users) wenn die Datei/
der Ordner bereits Freigaben hat (Links oder Benutzer-Berechtigungen)
- Normales Share-Icon (pi-share-alt) wenn keine Freigaben existieren
- Backend liefert has_shares und has_permissions pro Datei mit
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Geteilte Ordner koennen jetzt komplett durchnavigiert werden:
- Klick auf einen Unterordner oeffnet dessen Inhalt
- Breadcrumb-Navigation: Root > Unterordner > Unter-Unterordner
mit Klick zurueck auf jede Ebene
- Ordner-Zeilen haben Hover-Effekt und Cursor-Pointer
Backend:
- GET /share/<token>/files?parent_id=X - Unterordner auflisten
- Sicherheitspruefung: parent_id muss innerhalb des geteilten
Ordners liegen (_is_inside_shared_folder traversiert den Baum)
- Breadcrumb wird serverseitig berechnet
- Download + Delete erlauben jetzt Dateien in jeder Tiefe
(nicht nur direkte Kinder)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Share-Links fuer Ordner verhalten sich jetzt je nach Berechtigung:
read (Nur Lesen):
- Zeigt alle Dateien im Ordner mit Name, Groesse, Typ
- Download-Button pro Datei
- Kein Upload, kein Loeschen
write (Lesen+Schreiben):
- Zeigt alle Dateien im Ordner
- Download-Button pro Datei
- Loeschen-Button pro Datei
- Upload-Zone (Drag & Drop + Button)
- Nach Upload wird Dateiliste automatisch aktualisiert
upload_only (Nur Upload):
- Kein Dateilisting, kein Ordnername sichtbar
- Nur Upload-Zone
Backend-Endpunkte:
- GET /share/<token>/files - Dateien im geteilten Ordner auflisten
- GET /share/<token>/files/<id>/download - Einzeldatei herunterladen
- DELETE /share/<token>/files/<id> - Datei loeschen (nur write)
- Alle Endpunkte pruefen Passwort, Ablaufdatum und Berechtigung
- Dateien muessen direkte Kinder des geteilten Ordners sein (kein Ausbruch)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Behebt 500 Internal Server Error beim Erstellen von Share-Links
auf bestehenden Datenbanken, denen die neue 'permission'-Spalte fehlt.
Problem: db.create_all() erstellt nur neue Tabellen, fuegt aber keine
Spalten zu bestehenden Tabellen hinzu. Wenn das Model neue Spalten
bekommt, crasht die App auf alten Datenbanken.
Loesung: _auto_migrate() vergleicht beim Start jede Model-Definition
mit dem tatsaechlichen DB-Schema (via SQLAlchemy Inspector) und fuegt
fehlende Spalten per ALTER TABLE ADD COLUMN hinzu. Funktioniert fuer
alle Datentypen mit korrekten Defaults (VARCHAR, INTEGER, BOOLEAN, etc.).
Output im Log: [Auto-Migrate] Added column share_links.permission (VARCHAR(20))
Das macht die App update-sicher - neue Spalten in Models werden
automatisch zur bestehenden DB hinzugefuegt, ohne manuelles Migrieren.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Alle Buttons in der Datei-Tabelle haben jetzt @click.stop
(Download, Teilen, Umbenennen, Loeschen) damit die DataTable
den Click nicht verschluckt
- Debug-Logging in createShare() um Frontend-Fehler sichtbar zu machen
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dritter Link-Typ neben read und write:
- upload_only: Nur Dateien hochladen, kein Download, kein Ordnerinhalt
sichtbar, Ordnername wird nicht angezeigt
Backend-Absicherung:
- GET /share/<token>/download gibt 403 bei upload_only
- POST /share/<token>/upload erlaubt upload_only + write
- GET /share/<token>/info gibt download_allowed zurueck
Frontend Share-Dialog:
- Drei Optionen: Nur Lesen / Lesen+Hochladen / Nur Upload
- Bestehende Links zeigen Typ an
Frontend ShareView:
- upload_only: Zeigt nur Upload-Zone, kein Dateiname, kein Download
- Hinweistext 'Dieser Link erlaubt nur das Hochladen von Dateien'
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Share-Links haben jetzt ein permission-Feld (read/write):
- read (Standard): Nur Download erlaubt, kein Upload, kein Aendern
- write: Download + Upload in Ordner erlaubt
Backend-Absicherung:
- POST /share/<token>/upload prueft permission == 'write', gibt 403
bei read-only Links zurueck
- GET /share/<token>/info gibt permission + upload_allowed zurueck
- ShareLink-Model hat neues permission-Feld (default: 'read')
Frontend Share-Dialog:
- Dropdown "Berechtigung" beim Erstellen von Links
(Nur Lesen / Lesen+Hochladen)
- Bestehende Links zeigen Berechtigungslevel an
Frontend ShareView:
- Upload-Zone nur sichtbar wenn upload_allowed == true
- Bei read-only Links: kein Drag & Drop, kein Upload-Button
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Share-Links fuer Ordner erlauben jetzt auch Uploads:
Backend:
- POST /share/<token>/upload - Datei in freigegebenen Ordner hochladen
- Passwort-Schutz wird bei Upload ebenfalls geprueft
- share_info gibt jetzt upload_allowed zurueck (true bei Ordner-Shares)
- Email-Benachrichtigung an den Ersteller wenn jemand eine Datei
hochlaedt (Dateiname, Groesse, IP-Adresse)
Frontend (ShareView):
- Ordner-Shares zeigen jetzt eine Upload-Zone (Drag & Drop + Button)
- Fortschrittsbalken beim Upload mit Datei-Zaehler
- Erfolgs-/Fehlermeldung nach Upload
- Passwortgeschuetzte Ordner-Shares: erst entsperren, dann uploaden
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Automatische E-Mail-Benachrichtigungen ueber die konfigurierte
System-Email bei folgenden Ereignissen:
- Datei/Ordner mit Benutzer geteilt -> Empfaenger wird benachrichtigt
- Share-Link heruntergeladen -> Ersteller wird benachrichtigt (mit IP)
- Kalender mit Benutzer geteilt -> Empfaenger wird benachrichtigt
- Adressbuch mit Benutzer geteilt -> Empfaenger wird benachrichtigt
- Passwort-Eintrag/-Ordner geteilt -> Empfaenger wird benachrichtigt
- Admin erstellt neuen Benutzer -> Neuer Benutzer wird benachrichtigt
Alle Benachrichtigungen sind fail-safe (try/except), damit die
eigentliche Aktion nie durch Email-Fehler blockiert wird.
Emails werden nur gesendet wenn System-SMTP konfiguriert ist UND
der Empfaenger eine Email-Adresse hat.
Neuer Service: app/services/system_mail.py mit zentralem Helper
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dateien und komplette Verzeichnisse koennen jetzt hochgeladen werden:
Drag & Drop:
- Dateien per Drag & Drop auf den Datei-Explorer ziehen
- Ganze Ordner (inkl. Unterordner) per Drag & Drop hochladen
- Visuelles Overlay zeigt Drop-Zone an
- Ordnerstruktur wird automatisch auf dem Server nachgebildet
Buttons:
- "Dateien" Button: Mehrere Dateien auswaehlen (wie vorher)
- "Ordner" Button: Kompletten Ordner mit Unterordnern hochladen
(nutzt webkitdirectory API)
Upload-Fortschritt:
- Fortschrittsbalken mit Datei-Zaehler waehrend des Uploads
- Fehlerhafte Uploads werden gezaehlt und gemeldet
Backend: /files/ensure-path Endpunkt erstellt verschachtelte
Ordnerstrukturen (z.B. "Docs/Work/Project") in einem Aufruf
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Backup-Dateien koennen jetzt durchsucht werden ohne einen
Komplett-Restore durchfuehren zu muessen:
- "Einzelne Dateien durchsuchen" Button bei lokalen ZIP-Backups
- "Durchsuchen" Button bei jeder SFTP-Backup-Version
- Datei-Browser-Dialog mit:
- Filterfeld zum Suchen nach Dateinamen
- Dateianzahl-Anzeige (gefiltert/gesamt)
- Icons nach Typ (DB, Metadaten, User-Dateien)
- Download-Button: Einzelne Datei herunterladen
- Restore-Button: Einzelne Datei direkt ins Live-System
wiederherstellen (nur fuer files/-Eintraege)
- Browse-Session wird serverseitig verwaltet und beim Schliessen
des Dialogs automatisch aufgeraeumt
Backend: /admin/restore/browse, /browse/<id>/download/<path>,
/browse/<id>/restore-file, /browse/<id>/close
+ SFTP: /targets/<id>/versions/<name>/browse
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mehrere SFTP-Backup-Ziele konfigurierbar mit:
- Host, Port, Benutzername, Passwort, Remote-Pfad
- Konfigurierbares Intervall (15 Min. bis woechentlich oder deaktiviert)
- Maximale Anzahl aufbewahrter Versionen (aeltere werden automatisch geloescht)
- Aktiv/Inaktiv-Toggle pro Ziel
Features:
- Automatischer Hintergrund-Scheduler prueft alle 60 Sekunden ob
Backups faellig sind und fuehrt sie aus
- Manuelles Backup per Klick ("Jetzt sichern")
- SFTP-Verbindungstest-Button
- Versionen-Dialog: Alle Backup-Versionen auf dem SFTP-Server auflisten
mit Groesse und Datum
- Restore direkt von SFTP: Version auswaehlen -> wird heruntergeladen
und ueber die bestehende DB-Merge-Logik wiederhergestellt
- Chunked Upload zum SFTP in 16MB-Bloecken (fuer grosse Backups)
- Status-Anzeige: Letztes Backup, Erfolg/Fehler, Nachricht
Backend: BackupTarget Model, SFTP-Service (paramiko), Backup-Scheduler
API: /admin/backup/targets CRUD, /test, /run, /versions, /restore
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Backup:
- Erstellt streaming ZIP mit SQLite-DB (via sqlite3.backup API) +
allen hochgeladenen Dateien + metadata.json
- Download als ZIP direkt aus dem Admin-Panel
Restore:
- Kleine Backups (<100MB): Direkter Upload
- Grosse Backups (>100MB bis TB+): Chunked Upload in 10MB-Stuecken
mit Fortschrittsanzeige
- DB-Merge: INSERT OR REPLACE auf gemeinsame Spalten, so dass neue
Schema-Aenderungen erhalten bleiben und Backup-Daten eingefuegt werden
- Dateien werden in data/files/ wiederhergestellt
- Restore-Anleitung direkt in der UI mit Hinweis auf SECRET_KEY/JWT_SECRET_KEY
Backend: /admin/backup, /admin/restore/init, /admin/restore/chunk,
/admin/restore/finalize, /admin/restore/direct
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Firefox-Import: CSV aus Einstellungen > Passwoerter > Exportieren
Domain wird automatisch als Titel extrahiert
- Generischer CSV-Import: Erkennt automatisch Spaltennamen aus
Chrome, Bitwarden, 1Password und anderen Managern
- KeePass-Import bleibt bestehen
- Einheitlicher Import-Dialog mit Quellen-Auswahl (Dropdown)
- Jede Quelle zeigt eine kurze Anleitung an
- Alle Eintraege werden clientseitig verschluesselt vor dem Speichern
- Backend: /passwords/import/firefox und /passwords/import/csv Endpunkte
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Admin-Benutzer-Dialog hat jetzt zwei Tabs: Allgemein + E-Mail-Konten
- Im E-Mail-Konten-Tab: Konten fuer jeden Benutzer hinzufuegen,
bearbeiten und loeschen (ohne sich als Benutzer einloggen zu muessen)
- Benutzersuche in der Benutzerverwaltung (filtert nach Name und Email)
- Backend: /admin/users/<id>/email-accounts GET/POST und
/admin/email-accounts/<id> PUT/DELETE Endpunkte
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Registrierung ist standardmaessig aktiviert (erster User = Admin)
- Einmal-Registrierungslinks: Admin kann Links generieren die auch bei
deaktivierter Registrierung funktionieren, nach Nutzung ungueltig
- Optional Link per System-Email versenden
- System-SMTP in Admin-Einstellungen konfigurierbar:
Server, Port, SSL, Benutzername, Passwort, Absender-Adresse
- SMTP-Verbindungstest-Button
- Register-Seite akzeptiert ?invite=TOKEN aus der URL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix: Share-Dialog oeffnet sich jetzt auch bei bereits geteilten Dateien
- Neu: Dateien/Ordner direkt mit anderen Benutzern teilen (Lesen/Schreiben/Admin)
- Neu: Benutzersuche im Share-Dialog, bestehende Freigaben anzeigen/entfernen
- Neu: Admin kann Benutzer ueber die Weboberflaeche anlegen
- Neu: Admin kann Benutzer bearbeiten (Rolle, Quota, aktiv/inaktiv) und loeschen
- Neu: Schieberegler fuer oeffentliche Registrierung in den Admin-Einstellungen
- Neu: Register-Link auf Login-Seite nur sichtbar wenn Registrierung erlaubt
- Neu: Register-Seite leitet um wenn Registrierung deaktiviert
- Neu: AppSettings-Model fuer persistente App-Konfiguration
- Neu: /api/users/search Endpunkt fuer Benutzersuche in Share-Dialogen
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Port 3100 is the frontend dev server (open in browser), port 5000 is
the backend API only. In Docker production, everything runs on 5000.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>