diff --git a/backend/internal/calendar/backend.go b/backend/internal/calendar/backend.go index 1b57330..abdcda2 100644 --- a/backend/internal/calendar/backend.go +++ b/backend/internal/calendar/backend.go @@ -96,7 +96,17 @@ func objectPath(username string, id uuid.UUID, uid string) string { // angemeldeten Nutzer geprüft – Phase 1 kennt ohnehin nur den eigenen Pfad, // spätere Freigaben ändern das gezielt in resolveCalendar. func parseCalendarPath(p string) (calID uuid.UUID, rest string, err error) { - parts := strings.SplitN(strings.TrimPrefix(p, davPrefix+"/calendars/"), "/", 3) + // Kommt vor: ein Browser macht GET auf eine Sammlung (Principal, + // Home-Set) statt PROPFIND – go-webdav reicht das trotzdem unverändert + // an GetCalendarObject durch, siehe backend.go-Kommentar zum Pfadschema. + // Ohne diese Prüfung würde z. B. "/caldav/principals-max/" das Wort + // "caldav" für eine Kalender-ID halten und einen kryptischen + // UUID-Parsing-Fehler nach außen geben. + const calPrefix = davPrefix + "/calendars/" + if !strings.HasPrefix(p, calPrefix) { + return uuid.UUID{}, "", fmt.Errorf("calendar: not a calendar path: %q", p) + } + parts := strings.SplitN(strings.TrimPrefix(p, calPrefix), "/", 3) if len(parts) < 2 || parts[1] == "" { return uuid.UUID{}, "", fmt.Errorf("calendar: malformed path %q", p) }