From 2899c677c1e62a892f8978da4ca9a7614dc694ff Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Wed, 24 Sep 2025 21:31:27 +0200 Subject: [PATCH] revert improper PR#1839, finally fix #1812 and #1880 --- radicale/app/report.py | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/radicale/app/report.py b/radicale/app/report.py index 555154c3..b63681f7 100644 --- a/radicale/app/report.py +++ b/radicale/app/report.py @@ -156,6 +156,7 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element], Read rfc3253-3.6 for info. """ + logger.debug("TRACE/REPORT/xml_report: base_prefix=%r path=%r", base_prefix, path) multistatus = ET.Element(xmlutils.make_clark("D:multistatus")) if xml_request is None: return client.MULTI_STATUS, multistatus @@ -239,6 +240,7 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element], filter_copy = copy.deepcopy(filter_) if expand is not None: + logger.debug("TRACE/REPORT/xml_report: expand") for comp_filter in filter_copy.findall(".//" + xmlutils.make_clark("C:comp-filter")): if comp_filter.get("name", "").upper() == "VCALENDAR": continue @@ -275,21 +277,15 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element], found_props = [] not_found_props = [] - item_etag: str = "" for prop in props: element = ET.Element(prop.tag) - if prop.tag == xmlutils.make_clark("D:getetag"): - if expand is not None: - item_etag = item.etag - else: - element.text = item.etag - found_props.append(element) - elif prop.tag == xmlutils.make_clark("D:getcontenttype"): + if prop.tag == xmlutils.make_clark("D:getcontenttype"): element.text = xmlutils.get_content_type(item, encoding) found_props.append(element) elif prop.tag in ( xmlutils.make_clark("C:calendar-data"), + xmlutils.make_clark("D:getetag"), xmlutils.make_clark("CR:address-data")): element.text = item.serialize() @@ -326,11 +322,24 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element], continue n_vevents += n_vev - found_props.append(expanded_element) + if prop.tag == xmlutils.make_clark("D:getetag"): + if n_vev > 0: + logger.debug("TRACE/REPORT/xml_report: getetag/expanded element") + element.text = item.etag + found_props.append(element) + else: + logger.debug("TRACE/REPORT/xml_report: getetag/no expanded element") + else: + logger.debug("TRACE/REPORT/xml_report: default") + found_props.append(expanded_element) else: - found_props.append(element) - if hasattr(item.vobject_item, "vevent_list"): - n_vevents += len(item.vobject_item.vevent_list) + if prop.tag == xmlutils.make_clark("D:getetag"): + element.text = item.etag + found_props.append(element) + else: + found_props.append(element) + if hasattr(item.vobject_item, "vevent_list"): + n_vevents += len(item.vobject_item.vevent_list) # Avoid DoS with too many events if max_occurrence and n_vevents > max_occurrence: raise ValueError("REPORT occurrences limit of {} hit" @@ -345,7 +354,7 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element], if found_props or not_found_props: multistatus.append(xml_item_response( base_prefix, uri, found_props=found_props, - not_found_props=not_found_props, found_item=True, item_etag=item_etag)) + not_found_props=not_found_props, found_item=True)) return client.MULTI_STATUS, multistatus @@ -664,7 +673,7 @@ def _find_overridden( def xml_item_response(base_prefix: str, href: str, found_props: Sequence[ET.Element] = (), not_found_props: Sequence[ET.Element] = (), - found_item: bool = True, item_etag: str = "") -> ET.Element: + found_item: bool = True) -> ET.Element: response = ET.Element(xmlutils.make_clark("D:response")) href_element = ET.Element(xmlutils.make_clark("D:href")) @@ -678,10 +687,6 @@ def xml_item_response(base_prefix: str, href: str, status = ET.Element(xmlutils.make_clark("D:status")) status.text = xmlutils.make_response(code) prop_element = ET.Element(xmlutils.make_clark("D:prop")) - if (item_etag != "") and (code == 200): - prop_etag = ET.Element(xmlutils.make_clark("D:getetag")) - prop_etag.text = item_etag - prop_element.append(prop_etag) for prop in props: prop_element.append(prop) propstat.append(prop_element) @@ -735,6 +740,7 @@ def retrieve_items( else: yield item, False if collection_requested: + logger.debug("TRACE/REPORT/retrieve_items: get_filtered") yield from collection.get_filtered(filters)