Skip to content

Commit 3ed31fd

Browse files
authored
Merge pull request #772 from Rusich90/event-no-dtend
Add save-load.event.no-dtend, update the icloud profile
2 parents 937aae1 + 6019f25 commit 3ed31fd

2 files changed

Lines changed: 26 additions & 13 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ This project should adhere to [Semantic Versioning](https://semver.org/spec/v2.0
3232
* A `features="icloud"` profile, from a caldav-server-tester run by a user - the documentation already referred to it, but it did not exist. https://github.com/python-caldav/caldav/issues/730
3333
* Compatibility feature `sync-token.invalid-token`: whether a sync token the server never issued is refused with `DAV:valid-sync-token` as RFC 6578 section 3.2 says. Xandikos and CCS answer some such tokens with a 500, and Stalwart, Ox and Purelymail with a report and no error. https://github.com/jelmer/xandikos/issues/743
3434
* Compatibility feature `propfind.principal-depth-1`: whether a Depth: 1 PROPFIND on the principal URL works. GMX answers it with a 400. https://github.com/python-caldav/caldav/pull/755
35+
* Compatibility feature `save-load.event.no-dtend`: whether a VEVENT with neither DTEND nor DURATION is stored, as RFC 5545 section 3.6.1 allows. iCloud refuses one with a 404. https://github.com/python-caldav/caldav-server-tester/issues/24
3536
* Negated searches: `add_property_filter()` passes the `!=` (alias `<>`), `!contains` and `def` operators of icalendar-searcher 1.1.0 on to the search. They are decided client-side (unless `post_filter=False`): the server query leaves them out, as no server has been probed for `negate-condition` support yet. `build_search_xml_query()` renders `!contains` as a negated `text-match`, and `!=` and `def` as a bare `prop-filter` - a negated `text-match` is a negated *substring* match, so it cannot express `!=`. https://github.com/python-caldav/caldav/issues/568
3637
* Compatibility features `sync-token.limit` and `sync-token.limit.initial-sync`, for DAV:limit and the checkpoint tokens of a truncated sync-collection report (RFC 6578 sections 3.6 and 3.7). Hints for Stalwart, Xandikos, Radicale, Baïkal, Davis, Nextcloud, CCS and Infomaniak.
3738

‎caldav/compatibility_hints.py‎

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ class FeatureSet:
409409
"default": { "support": "full" }
410410
},
411411
"save-load.event.no-summary": {"description": "The server stores a VEVENT without a SUMMARY property. RFC 5545 section 3.6.1 makes SUMMARY optional. 'ungraceful' when the PUT is refused with an error (Bedework 5 answers 500 missingeventproperty).", "default": {"support": "full"}},
412+
"save-load.event.no-dtend": {"description": "The server stores a VEVENT with neither DTEND nor DURATION. RFC 5545 section 3.6.1 allows one: an event on a date lasts that day, an event at a date-time ends when it starts. 'ungraceful' when the PUT is refused with an error (iCloud answers 404, or 403).", "default": {"support": "full"}},
412413
"save-load.event.recurrences": {"description": "it's possible to save and load recurring events to the calendar - events with an RRULE property set, including recurrence sets", "default": {"support": "full"}},
413414
"save-load.event.recurrences.count": {"description": "The server will receive and store a recurring event with a count set in the RRULE", "default": {"support": "full"}},
414415
## This was Claude's suggestion and it works as of today, the
@@ -1928,6 +1929,12 @@ def compare(self, observed):
19281929
## iCloud (https://caldav.icloud.com/). Not among the servers the maintainer
19291930
## tests against; probed 2026-10-09 by a user with caldav-server-tester 1.4.0
19301931
## (caldav 3.4.0), see https://github.com/python-caldav/caldav/issues/730 .
1932+
## Partly re-probed 2026-10-14 (caldav master and caldav-server-tester
1933+
## release-candidate, both with the no-dtend change), once the tester no
1934+
## longer stopped at the first event without an end, see
1935+
## https://github.com/python-caldav/caldav-server-tester/issues/24 . Only the
1936+
## entries marked 2026-10-14 come from that run; the search.recurrences and
1937+
## old-dates lines from 2026-10-09 were removed after it.
19311938
## Earlier, older observations are in https://github.com/python-caldav/caldav/issues/3
19321939
##
19331940
## The calendar-home-set lives on a per-account partition host
@@ -1950,6 +1957,10 @@ def compare(self, observed):
19501957
'freebusy-query': {'support': 'ungraceful', 'behaviour': '400 Bad Request'},
19511958
'principal-search': {'support': 'ungraceful'},
19521959
'propfind.allprop.resourcetype': {'support': 'unsupported'},
1960+
## 2026-10-14
1961+
'propfind.principal-depth-1': {'support': 'unsupported', 'behaviour': 'HTTP 400'},
1962+
## 2026-10-14
1963+
'save-load.event.no-dtend': {'support': 'ungraceful', 'behaviour': 'PUT refused with 404, or 403'},
19531964
'save-load.journal': {'support': 'unsupported'},
19541965
## A task needs a calendar of its own
19551966
'save-load.todo.mixed-calendar': {'support': 'unsupported'},
@@ -1959,26 +1970,27 @@ def compare(self, observed):
19591970
},
19601971
'save.duplicate-uid.cross-calendar': {'support': 'ungraceful', 'behaviour': 'PUT refused'},
19611972
'scheduling.schedule-tag': {'support': 'unsupported', 'behaviour': 'no Schedule-Tag returned on GET or via PROPFIND'},
1973+
## 2026-10-14: on another account, is-not-defined.category/class and
1974+
## search.text.case-* found nothing (an empty 207) in two tester runs, and
1975+
## SUMMARY and CATEGORIES filters by hand did not either, also 30 minutes
1976+
## after saving. Cause unknown; left as probed in #730.
19621977
'search.is-not-defined': {'support': 'fragile', 'behaviour': 'works for category, class but not all properties'},
19631978
'search.is-not-defined.category': {'support': 'full'},
19641979
'search.is-not-defined.class': {'support': 'full'},
19651980
'search.is-not-defined.dtend': {'support': 'unsupported'},
1981+
## 2026-10-14: recurring events are found and expanded, and so are events
1982+
## in year 2000. Recurring tasks cannot be measured while time-range
1983+
## searches for tasks do not work, so they are not left at the default.
1984+
'search.recurrences.includes-implicit.todo': {'support': 'unknown'},
1985+
'search.recurrences.expanded.todo': {'support': 'unknown'},
19661986
'search.text.category': {'support': 'unsupported'},
19671987
'search.time-range.alarm': {'support': 'unsupported'},
19681988
'search.time-range.todo': {'support': 'unsupported'},
1969-
## Like OX, the search window does not reach far into the past: objects in
1970-
## year 2000 are not found, neither by an open search nor by a time-range
1971-
## search. The checker reports search.unlimited-time-range as broken, but
1972-
## it is deliberately left at its default here: the workaround for it
1973-
## (sending a 1970-2126 time range with every open search) cannot help when
1974-
## old-dates time-range searches fail too, and with the recurrence search
1975-
## problems below it might drop recurring events an open search returns.
1976-
'search.time-range.event.old-dates': {'support': 'unsupported'},
1977-
## TODO: all recurrence searches came back unsupported. This may be an
1978-
## artifact of the search window above rather than missing recurrence
1979-
## support - the save-load.*.recurrences checks were inconclusive in the
1980-
## same run. Needs a closer look.
1981-
'search.recurrences': {'support': 'unsupported'},
1989+
## 2026-10-14
1990+
'sync-token.limit': {
1991+
'support': 'unsupported',
1992+
'behaviour': 'DAV:limit is ignored; lists the collection itself as a member',
1993+
},
19821994
}
19831995

19841996
## See the synology profile above: Synology Calendar ships a modified DAViCal,

0 commit comments

Comments
 (0)