feat(aether): initial commit – self-hosted Cloud, Phasen 1–7

Go-Backend (chi, pgx, golang-migrate) + React/TS-Frontend als PWA.
Enthalten: Auth inkl. OIDC, Dateien mit Versionen und Papierkorb,
Freigaben (Links + intern), WebDAV, Gruppenordner, Admin/Theming,
Volltextsuche mit OCR, eigener PDF-Betrachter und WOPI-Office
(Collabora/OnlyOffice).

Nicht im Repo: deploy/.env (Sitzungsschlüssel, DB- und Admin-Passwort)
sowie alle Daten- und Build-Verzeichnisse – siehe .gitignore.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 5 committed 2026-08-24 09:25:36 +02:00
commit 31a027c93a
225 files changed
+38042

No files matched your search

+60
View File
@@ -0,0 +1,60 @@
package acl
import "testing"
// stronger entscheidet, welches Recht gilt, wenn jemand eine Ressource über
// mehrere Wege erreicht – direkt und zusätzlich über zwei Gruppen etwa. Kippt
// diese Funktion, bekommt jemand entweder zu viel oder unerwartet zu wenig.
func TestStrongerPermissionWins(t *testing.T) {
tests := []struct {
name string
a, b Permission
want Permission
}{
{"nichts und nichts", "", "", ""},
{"nur lesen", PermRead, "", PermRead},
{"lesen und schreiben", PermRead, PermWrite, PermWrite},
{"schreiben und lesen", PermWrite, PermRead, PermWrite},
{"zweimal schreiben", PermWrite, PermWrite, PermWrite},
{"zweimal lesen", PermRead, PermRead, PermRead},
{"schreiben aus dem Nichts", "", PermWrite, PermWrite},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := stronger(tt.a, tt.b); got != tt.want {
t.Errorf("stronger(%q, %q) = %q, want %q", tt.a, tt.b, got, tt.want)
}
})
}
}
// Ein unbekanntes Recht darf nicht durchrutschen: Die Datenbank hat zwar einen
// CHECK, aber die Prüfung soll vorher greifen und eine klare Fehlermeldung
// liefern statt eines Constraint-Fehlers.
func TestPermissionValidation(t *testing.T) {
for _, p := range []Permission{PermRead, PermWrite} {
if !p.valid() {
t.Errorf("%q sollte gültig sein", p)
}
}
for _, p := range []Permission{"", "admin", "owner", "READ", "write "} {
if p.valid() {
t.Errorf("%q sollte ungültig sein", p)
}
}
}
// Access.CanWrite ist die Weiche vor jeder Änderung.
func TestAccessCanWrite(t *testing.T) {
if (Access{Permission: PermRead}).CanWrite() {
t.Error("Lesezugriff darf nicht schreiben dürfen")
}
if !(Access{Permission: PermWrite}).CanWrite() {
t.Error("Schreibzugriff muss schreiben dürfen")
}
// Der Nullwert entsteht, wenn eine Auflösung fehlschlägt – der darf
// keinesfalls Schreibrechte bedeuten.
if (Access{}).CanWrite() {
t.Error("leerer Zugriff darf nicht schreiben dürfen")
}
}