Files
Unraid-Navigator/TODO.md
T

218 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# U-Navigator TODO
Stand: 2026-07-14
Ziel dieser Liste ist eine sichere, testbare und veröffentlichungsfähige Version des Plugins. Schreibzugriff sollte erst empfohlen werden, wenn alle Punkte unter P0 abgeschlossen und auf einer echten Unraid-Installation geprüft sind.
## P0 Sicherheitsblocker
### Geschützte Root-Pfade
- [ ] Eine zentrale Funktion `unav_assert_mutable_path()` einführen.
- [ ] Löschen eines konfigurierten Root-Pfads verbieten.
- [ ] Verschieben und Umbenennen eines konfigurierten Root-Pfads verbieten.
- [ ] Rekursive Rechte- oder Besitzeränderungen direkt am Root-Pfad verbieten.
- [ ] Quelle und Ziel auch im Worker unmittelbar vor der Operation erneut prüfen.
- [ ] API-Tests für Delete, Move und Permissions auf `/mnt/user` beziehungsweise einem Test-Root ergänzen.
Abnahmekriterium: Kein mutierender API-Aufruf kann den erlaubten Root selbst verändern oder entfernen.
### Sichere Symlink-Behandlung
- [ ] Eingabepfad und kanonischen Sicherheitspfad getrennt speichern.
- [ ] Für Dateioperationen `lstat()` statt ausschließlich `realpath()` verwenden.
- [ ] Beim Löschen eines Symlinks ausschließlich den Link entfernen, niemals dessen Ziel.
- [ ] Copy und Move von Symlinks entweder kontrolliert implementieren oder ausdrücklich ablehnen.
- [ ] Symlinks auf Ziele außerhalb erlaubter Roots für Listing, Vorschau und Download weiterhin blockieren.
- [ ] Rekursive Operationen dürfen Symlinks nicht verfolgen.
- [ ] Tests für interne Symlinks, externe Symlinks, kaputte Symlinks und Symlink-Schleifen ergänzen.
Abnahmekriterium: Eine Aktion auf einem Symlink wirkt niemals unerwartet auf dessen Ziel.
### Upload-Pfade härten
- [ ] Relative Pfade vollständig validieren; `..` nicht still entfernen, sondern als Fehler ablehnen.
- [ ] Absolute Pfade, Nullbytes und leere Pfadsegmente ablehnen.
- [ ] Jeden Parent-Pfad prüfen, bevor ein Verzeichnis angelegt wird.
- [ ] Beim Anlegen von Upload-Ordnern keine vorhandenen Symlinks durchlaufen.
- [ ] Zielpfad unmittelbar vor Schreiben beziehungsweise Rename erneut validieren.
- [ ] Temporäre Upload-Dateien in einem privaten Verzeichnis ablegen und zufällige IDs verwenden.
- [ ] Abgebrochene und veraltete Upload-Fragmente automatisch entfernen.
- [ ] Tests für Symlink-Parents und konkurrierende Pfadänderungen ergänzen.
Abnahmekriterium: Ein Upload kann außerhalb der erlaubten Roots weder Dateien noch Verzeichnisse erzeugen.
### CSRF und Request-Schutz
- [ ] Auf einer aktuellen Unraid-7.x-Installation prüfen, ob die WebGUI-Schicht Plugin-PHP-Endpunkte automatisch gegen CSRF schützt.
- [ ] Direkte POST-Requests ohne, mit falschem und mit gültigem `csrf_token` testen.
- [ ] Falls nötig, CSRF-Prüfung zentral in `common.php` implementieren.
- [ ] Mutierende Endpunkte ausschließlich per POST erlauben.
- [ ] Für nicht erlaubte Methoden `405 Method Not Allowed` und einen `Allow`-Header liefern.
- [ ] Für JSON- und Formular-Requests dieselben Schutzregeln anwenden.
- [ ] Authentifizierungsverhalten bei direktem Aufruf aller API-Endpunkte prüfen und dokumentieren.
Abnahmekriterium: Kein mutierender Aufruf funktioniert ohne gültige Unraid-Sitzung und gültigen CSRF-Schutz.
### Ressourcenlimits
- [ ] Maximale Upload-Dateigröße konfigurierbar machen.
- [ ] Maximale Gesamtgröße und Dateianzahl pro Upload begrenzen.
- [ ] Raw-Uploads streamen, statt den gesamten Request in den PHP-Speicher zu laden.
- [ ] Maximale Dateianzahl und Gesamtgröße für ZIP-Downloads festlegen.
- [ ] Vor ZIP-Erstellung freien temporären Speicher prüfen.
- [ ] ZIP-Erstellung als Hintergrundjob ausführen.
- [ ] Laufzeit- und Rekursionstiefenlimits für Size, Copy, Delete und Permissions einführen.
- [ ] Große Verzeichnisse im Listing paginieren oder begrenzen.
Abnahmekriterium: Einzelne Requests können weder PHP-Speicher noch temporären Speicher unkontrolliert erschöpfen.
## P1 Datenintegrität und Jobs
### Robuste Copy-/Move-Operationen
- [ ] Kopien zunächst unter einem temporären Zielnamen erstellen.
- [ ] Ziel erst nach erfolgreicher vollständiger Kopie atomar sichtbar machen.
- [ ] Unvollständige Ziele bei Fehlern zuverlässig entfernen.
- [ ] Quelle bei einem Cross-Filesystem-Move erst nach verifizierter Kopie löschen.
- [ ] Dateigröße und optional Prüfsumme vor dem Löschen der Quelle vergleichen.
- [ ] Rechte, Owner, Gruppe und Zeitstempel erhalten.
- [ ] Verhalten für Sparse Files, Hardlinks und Special Files definieren.
- [ ] Zielkonflikte auch unmittelbar vor dem finalen Rename prüfen.
- [ ] Tests für Fehler mitten in einer Verzeichniskopie ergänzen.
### Job-System
- [ ] Job-Verzeichnis mit `0700` statt `0777` erstellen.
- [ ] Jobdateien atomar über temporäre Datei plus Rename schreiben.
- [ ] Beim Lesen passende Locks beziehungsweise atomare Snapshots verwenden.
- [ ] Kryptografisch zufällige Job-IDs verwenden.
- [ ] Prüfen, ob der Worker wirklich gestartet ist; nicht nur den Shell-Exitcode auswerten.
- [ ] Hängende Jobs nach Timeout als fehlgeschlagen markieren.
- [ ] Abbruch-Endpunkt für laufende Jobs implementieren.
- [ ] Abbruchstatus in rekursiven Operationen regelmäßig prüfen.
- [ ] Abbruchschaltfläche im Transfer-Panel ergänzen.
- [ ] Alte abgeschlossene Jobs automatisch löschen.
- [ ] Gleichzeitige, kollidierende Jobs auf denselben Pfaden erkennen und serialisieren oder ablehnen.
- [ ] Jobfehler mit verständlicher Meldung und technischem Logeintrag trennen.
### Löschschutz
- [ ] Optionalen Papierkorb pro Root implementieren.
- [ ] Direktes permanentes Löschen als gesonderte Aktion behandeln.
- [ ] Anzahl und geschätzte Größe vor rekursivem Löschen anzeigen.
- [ ] Mehrfachauswahl vor dem Start vollständig validieren.
- [ ] Optional eine zweite Bestätigung für sehr große Löschvorgänge verlangen.
## P1 Tests
### PHP-Backend testen
- [ ] Eigenständige Tests für die tatsächlich ausgelieferten PHP-Endpunkte aufbauen.
- [ ] Die Tests in einer Unraid-kompatiblen PHP-Version ausführen.
- [ ] Listing innerhalb und außerhalb erlaubter Roots testen.
- [ ] Upload, Download, Preview, Copy, Move, Delete, Size und Permissions testen.
- [ ] Read-only-Modus für jede mutierende Aktion testen.
- [ ] Zielkonflikte und ungültige Request-Methoden testen.
- [ ] Sonderzeichen, Unicode, sehr lange Namen und versteckte Dateien testen.
- [ ] Mehrere konfigurierte Roots testen.
- [ ] Regressionstests für alle P0-Sicherheitsfälle ergänzen.
### CI und statische Prüfung
- [ ] `php -l` für alle PHP-Dateien in CI ausführen.
- [ ] JavaScript-Syntaxprüfung ausführen.
- [ ] ShellCheck für `build-plugin.sh` aktivieren.
- [ ] XML beziehungsweise PLG-Manifest validieren.
- [ ] Paket bauen und mit den Quellen vergleichen.
- [ ] Manifest-Prüfsumme automatisch verifizieren.
- [ ] Tests bei jedem Push und Pull Request ausführen.
### Test auf echter Unraid-Instanz
- [ ] Installation auf unterstützten Unraid-Versionen testen.
- [ ] Upgrade von einer vorherigen Plugin-Version testen.
- [ ] Deinstallation und Neuinstallation testen.
- [ ] Verhalten bei gestopptem und gestartetem Array prüfen.
- [ ] User Shares, Pools und Disk Shares getrennt prüfen.
- [ ] Große Ordner und große Dateien testen.
- [ ] WebGUI-Neustart und Server-Neustart während laufender Jobs testen.
- [ ] Alle offiziellen Themes und mobile Darstellung prüfen.
## P2 Konfiguration und Bedienung
### Root-Konfiguration
- [ ] Erlaubte Roots in `settings.json` speichern.
- [ ] Einstellungsoberfläche zum Hinzufügen und Entfernen von Roots bauen.
- [ ] Nur existierende absolute Verzeichnisse akzeptieren.
- [ ] Gefährliche Systempfade wie `/`, `/boot`, `/etc`, `/usr`, `/var` und `/root` standardmäßig verbieten.
- [ ] Pro Root einen Anzeigenamen und Read-only-Status erlauben.
- [ ] Änderungen an Roots erst nach erneuter serverseitiger Validierung übernehmen.
- [ ] Root-Auswahl im Explorer anbieten.
### Dateimanager-Funktionen
- [ ] Neuen Ordner anlegen.
- [ ] Leere Datei anlegen.
- [ ] Umbenennen mit serverseitiger Namensvalidierung verbessern.
- [ ] Suche nach Dateiname im aktuellen Ordner implementieren.
- [ ] Optionale rekursive Suche mit Ergebnislimit ergänzen.
- [ ] Sortierung nach Name, Typ, Größe und Änderungsdatum anbieten.
- [ ] Versteckte Dateien ein- und ausblendbar machen.
- [ ] Breadcrumb-Navigation ergänzen.
- [ ] Dateibaum beziehungsweise Share-Navigation ergänzen.
- [ ] Tastaturbedienung für Auswahl, Öffnen, Kopieren, Verschieben und Löschen verbessern.
### Transfer-Oberfläche
- [ ] Reale Fortschrittswerte nach Bytes statt nur nach Top-Level-Einträgen berechnen.
- [ ] Quelle, Ziel, Geschwindigkeit und Restzeit anzeigen.
- [ ] Fehlgeschlagene Jobs wiederholbar machen.
- [ ] Abgeschlossene Einträge einzeln oder gesammelt entfernen.
- [ ] Uploads pausieren und abbrechen können.
### Vorschau und Download
- [ ] MIME-Typ anhand des Dateiinhalts prüfen, nicht nur anhand der Erweiterung.
- [ ] SVG-Vorschau sicher behandeln oder deaktivieren.
- [ ] Medien- und PDF-Vorschau mit geeigneten Sandbox-Headern testen.
- [ ] HTTP-Range-Requests für große Audio- und Videodateien unterstützen.
- [ ] RFC-konforme UTF-8-Dateinamen im `Content-Disposition`-Header verwenden.
- [ ] Einzeldateien streamen, ohne unnötige Pufferung.
## P2 Protokollierung und Betrieb
- [ ] Audit-Log für Upload, Copy, Move, Delete und Permissions einführen.
- [ ] Zeitpunkt, Aktion, Quelle, Ziel, Ergebnis und Fehler protokollieren.
- [ ] Keine CSRF-Tokens oder sensiblen Inhalte ins Debug-Log schreiben.
- [ ] Logrotation und maximale Loggröße definieren.
- [ ] Diagnoseexport für Supportfälle anbieten.
- [ ] Gesundheitsstatus für Job-Worker und temporären Speicher anzeigen.
## P3 Paketierung und Veröffentlichung
- [ ] Version nur an einer Stelle pflegen und beim Build überall einsetzen.
- [ ] `package.json`-Version mit der Plugin-Version synchronisieren.
- [ ] Reproduzierbare TGZ-Pakete mit stabiler Sortierung und Zeitstempeln erzeugen.
- [ ] Nach Möglichkeit SHA-256 zusätzlich zur MD5-Prüfung veröffentlichen.
- [ ] Minimale und getestete Unraid-Version im Plugin-Manifest angeben.
- [ ] Changelog pro Version vollständig pflegen.
- [ ] Release-Build in einer sauberen Working Copy erzeugen.
- [ ] Community-Applications-Metadaten validieren.
- [ ] Installations-, Update- und Rollback-Anleitung ergänzen.
- [ ] Sicherheitsmodell und bekannte Einschränkungen dokumentieren.
- [ ] Read-only als empfohlenen Standard deutlich in README und Oberfläche anzeigen.
## Definition of Done für die erste produktive Version
- [ ] Alle P0-Punkte sind abgeschlossen.
- [ ] PHP-Integrationstests decken alle mutierenden Operationen ab.
- [ ] Keine Root- oder Symlink-Regression ist offen.
- [ ] CSRF und Authentifizierung sind auf echter Unraid-Hardware bestätigt.
- [ ] Große Uploads, Downloads und Verzeichnisse besitzen getestete Limits.
- [ ] Fehlgeschlagene Copy-/Move-Jobs hinterlassen keine unbemerkten Teildaten.
- [ ] Installation, Upgrade, Neustart und Deinstallation wurden getestet.
- [ ] Paketinhalt und Manifest-Prüfsumme stimmen überein.
- [ ] Dokumentation und Changelog entsprechen dem ausgelieferten Funktionsumfang.