diff --git a/radicale/app/propfind.py b/radicale/app/propfind.py index 52d0b00..a40ea3a 100644 --- a/radicale/app/propfind.py +++ b/radicale/app/propfind.py @@ -85,7 +85,7 @@ def xml_propfind_response( if isinstance(item, storage.BaseCollection): is_collection = True - is_leaf = item.tag in ("VADDRESSBOOK", "VCALENDAR") + is_leaf = item.tag in ("VADDRESSBOOK", "VCALENDAR", "VSUBSCRIBED") collection = item # Some clients expect collections to end with `/` uri = pathutils.unstrip_path(item.path, True) @@ -259,6 +259,10 @@ def xml_propfind_response( child_element = ET.Element( xmlutils.make_clark("C:calendar")) element.append(child_element) + elif item.get_meta("tag") == "VSUBSCRIBED": + child_element = ET.Element( + xmlutils.make_clark("CS:subscribed")) + element.append(child_element) child_element = ET.Element(xmlutils.make_clark("D:collection")) element.append(child_element) elif tag == xmlutils.make_clark("RADICALE:displayname"): @@ -286,6 +290,14 @@ def xml_propfind_response( element.text, _ = collection.sync() else: is404 = True + elif tag == xmlutils.make_clark("CS:source"): + if is_leaf: + child_element = ET.Element(xmlutils.make_clark("D:href")) + child_element.text = item.get_meta('CS:source') + element.append(child_element) + else: + is404 = True + else: human_tag = xmlutils.make_human_tag(tag) tag_text = collection.get_meta(human_tag) diff --git a/radicale/item/__init__.py b/radicale/item/__init__.py index 04362b7..6adb139 100644 --- a/radicale/item/__init__.py +++ b/radicale/item/__init__.py @@ -91,7 +91,7 @@ def check_and_sanitize_items( The ``tag`` of the collection. """ - if tag and tag not in ("VCALENDAR", "VADDRESSBOOK"): + if tag and tag not in ("VCALENDAR", "VADDRESSBOOK", "VSUBSCRIBED"): raise ValueError("Unsupported collection tag: %r" % tag) if not is_collection and len(vobject_items) != 1: raise ValueError("Item contains %d components" % len(vobject_items)) @@ -230,7 +230,7 @@ def check_and_sanitize_props(props: MutableMapping[Any, Any] raise ValueError("Value of %r must be %r not %r: %r" % ( k, str.__name__, type(v).__name__, v)) if k == "tag": - if v not in ("", "VCALENDAR", "VADDRESSBOOK"): + if v not in ("", "VCALENDAR", "VADDRESSBOOK", "VSUBSCRIBED"): raise ValueError("Unsupported collection tag: %r" % v) return props diff --git a/radicale/xmlutils.py b/radicale/xmlutils.py index 09508d9..da59c08 100644 --- a/radicale/xmlutils.py +++ b/radicale/xmlutils.py @@ -33,7 +33,8 @@ from radicale import item, pathutils MIMETYPES: Mapping[str, str] = { "VADDRESSBOOK": "text/vcard", - "VCALENDAR": "text/calendar"} + "VCALENDAR": "text/calendar", + "VSUBSCRIBED": "text/calendar"} OBJECT_MIMETYPES: Mapping[str, str] = { "VCARD": "text/vcard",