You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit ccae99e
Browse filesBrowse the repository at this point in the historyBrowse files
## 2026-10-23: MKCALENDAR failed with 403 "Calendar limit reached" (a
1527
+
## SabreDAV Forbidden), making the server-tester grade create-calendar
1528
+
## unsupported. The account held 27 live calendars, 15 of them empty
1529
+
## leftovers with bare-uuid cal_ids from test runs. Calendars sitting in
1530
+
## the trashbin count towards the limit too: deleting the leftovers gave
1531
+
## room for one more creation only. A DELETE carrying the header
1532
+
## "X-NC-CalDAV-No-Trashbin: 1" removes a calendar for good, and also
1533
+
## works on one already in the trashbin (it still shows up in a raw
1534
+
## depth-1 PROPFIND of the calendar home). With the trashbin purged,
1535
+
## the next MKCALENDARs got 429 instead - the calendar-creation rate
1536
+
## limit, after a dozen creations within the hour. The same run measured
1537
+
## well-known unsupported: /.well-known/caldav redirects to
1538
+
## /remote.php/dav/, which does not advertise calendar-access.
1526
1539
#'search.is-not-defined': {'support': 'unsupported'}, ## observed to work at 4bc0de765a2b53e6f223e0b9ac51c653bac11fb7 (caldav) / 3cae24cf99da1702b851b5a74a9b88c8e5317dad (server checker)
1527
1540
#'search.text.case-sensitive': {'support': 'unsupported'}, ## observed to work at 4bc0de765a2b53e6f223e0b9ac51c653bac11fb7 (caldav) / 3cae24cf99da1702b851b5a74a9b88c8e5317dad (server checker)
Copy file name to clipboardExpand all lines: docs/design/TODO.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -62,3 +62,13 @@ iCloud leaves a moved instance (`RECURRENCE-ID` 2026-10-31, `DTSTART` 2026-10-17
62
62
* Workaround when `by-moved-dt` is unsupported: an extra query for VEVENTs that have a `RECURRENCE-ID`. In CalDAV that is an empty `prop-filter` (RFC 4791 section 9.7.2; there is no `is-defined` element). `search()` decides `def` client-side and leaves it out of the server query, so the filter must be sent server-side (`post_filter=False`, or a raw query), or the extra query fetches every event. Filter the results client-side and merge them in, deduplicated on the resource URL, or on UID and `RECURRENCE-ID` when the search expands. The `_TIME_RANGE_MARGIN` widening can't do it, as an instance may be moved any distance. The tester check should probe the empty prop-filter on iCloud directly (`search.is-not-defined` being `fragile` there says little about it); else fall back to fetching all recurring events.
63
63
* Cost: without a time range, the extra query downloads every event with overrides in the calendar, on every event time-range search, and that grows without bound. Bound it (a range covering the RRULE horizon) or cache it, and make it opt-out. Report it to Apple too.
64
64
* The reporter (Home Assistant, https://github.com/home-assistant/core/issues/179125) offered to test.
65
+
66
+
## Purging deleted calendars from the Nextcloud trashbin
67
+
68
+
On Nextcloud a deleted calendar moves to the trashbin, keeps its cal_id occupied (`delete-calendar.free-namespace` unsupported with the trashbin on, as on ecloud) and still counts towards the per-user calendar limit: on ecloud, 2026-10-23, MKCALENDAR failed with 403 "Calendar limit reached" at 27 live calendars plus those in the trashbin. A DELETE carrying the header `X-NC-CalDAV-No-Trashbin: 1` removes a calendar for good, and also works on one already in the trashbin (it still shows in a raw depth-1 PROPFIND of the calendar home, though `get_calendars()` hides it). Support it in the library: a compatibility feature (e.g. a `behaviour` on `delete-calendar`, or a new `delete-calendar.purge`) telling `Calendar.delete()` to send the header, maybe a `purge=True` argument, and a caldav-server-tester probe for it. That would also make `free-namespace` hold for Nextcloud when purging.
69
+
70
+
## A recognisable cal_id for every test calendar
71
+
72
+
The tests and the caldav-server-tester leave calendars behind, and on servers that cap the number of calendars per principal (ecloud, see above) that eventually blocks all creation. On 2026-10-23 ecloud held 15 empty calendars with bare-uuid cal_ids and the uuid as display name; which code made them was not found. Every calendar the tests or the tester create should carry a cal_id prefix, like the caldav-server-tester's `csc_` UIDs, so a cleanup step can delete leftovers safely - with the purge from the section above where the server has a trashbin.
73
+
* caldav tests: there is no common cal_id prefix on every calendar, and no sweep. Several tests create calendars by name only (`test_caldav.py` "CalConfigA"/"CalConfigB", "XandikosMetaCal"/"RadicaleMetaCal", `test_get_calendars_sections.py`, `test_examples.py`), so `make_calendar()` gives them a bare uuid. Give all of them a `pythoncaldav-test` prefixed cal_id and add a session-level sweep.
74
+
* caldav-server-tester: has `PROBE_CALENDAR_PREFIXES` and a sweep matching cal_id or display name, but `CheckDuplicateUID` creates its second calendar by name only, so its cal_id is a bare uuid that the sweep cannot recognise when the server drops the display name. Pass a prefixed cal_id. Its sweep also only moves calendars to the Nextcloud trashbin.
0 commit comments