From 8772e02410474faa505e54655a5f51711b32849a Mon Sep 17 00:00:00 2001 From: Stefan Hacker Date: Mon, 13 Apr 2026 03:32:22 +0200 Subject: [PATCH] fix(dav): Principal-Depth-1 liefert keine Sub-Container mehr Die zuletzt eingefuehrten Sub-Container (calendars/, addressbooks/) bei PROPFIND Depth 1 auf /dav// wurden von DAVx5 als leere Kalender gezaehlt (DEFAULT_TASK_CALENDAR_NAME-Phantom-Eintraege). Da die CardDAV- Route jetzt korrekt an den Home-Set-Handler delegiert, reicht es wenn der Principal nur sich selbst liefert - Clients folgen den Home-Sets. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/app/dav/caldav.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/backend/app/dav/caldav.py b/backend/app/dav/caldav.py index 824f52b..1a62dd6 100644 --- a/backend/app/dav/caldav.py +++ b/backend/app/dav/caldav.py @@ -269,24 +269,13 @@ def propfind(subpath=''): multistatus.append(_principal_response(user)) return _xml_response(multistatus) - # /dav// : principal itself + the two sub-containers as - # collection children (calendars/ and addressbooks/). The actual - # calendar/addressbook lists live under those home-sets. + # /dav// : nur der Principal. Clients MUESSEN den Home-Sets + # (calendar-home-set / addressbook-home-set) folgen - sonst wuerden die + # Container hier faelschlich als leere Kalender angezeigt (DAVx5). if len(parts) == 1: if parts[0] != user.username: return Response('', 403) multistatus.append(_principal_response(user)) - if depth != '0': - for (sub, dn) in (('calendars', 'Kalender'), ('addressbooks', 'Adressbücher')): - container = ET.Element(_qn('d', 'response')) - ET.SubElement(container, _qn('d', 'href')).text = f'/dav/{user.username}/{sub}/' - propstat = ET.SubElement(container, _qn('d', 'propstat')) - prop = ET.SubElement(propstat, _qn('d', 'prop')) - rt = ET.SubElement(prop, _qn('d', 'resourcetype')) - ET.SubElement(rt, _qn('d', 'collection')) - ET.SubElement(prop, _qn('d', 'displayname')).text = dn - ET.SubElement(propstat, _qn('d', 'status')).text = 'HTTP/1.1 200 OK' - multistatus.append(container) return _xml_response(multistatus) # /dav//calendars/ : only calendar collections