diff --git a/radicale/app/propfind.py b/radicale/app/propfind.py index 68145e23..3d674c96 100644 --- a/radicale/app/propfind.py +++ b/radicale/app/propfind.py @@ -129,7 +129,8 @@ def xml_propfind_response( if share: # backmap - uri = uri.replace(share['PathMapped'], share['PathOrToken']) + if uri.startswith(share['PathMapped']): + uri = share['PathOrToken'] + uri.removeprefix(share['PathMapped']) if share_bday_automap and not uri.endswith("/"): uri = uri.rstrip(".vcf") + ".ics" @@ -217,7 +218,8 @@ def xml_propfind_response( child_element.text = xmlutils.make_href(base_prefix, path) if share: # backmap - child_element.text = child_element.text.replace(share['PathMapped'], share['PathOrToken']) + if child_element.text.startswith(share['PathMapped']): + child_element.text = share['PathOrToken'] + child_element.text.removeprefix(share['PathMapped']) if share_bday_automap: child_element.text = child_element.text.rstrip(".vcf") + ".ics" element.append(child_element) @@ -256,13 +258,15 @@ def xml_propfind_response( elif tag == xmlutils.make_clark("D:current-user-principal"): if user: child_element = ET.Element(xmlutils.make_clark("D:href")) - child_element.text = xmlutils.make_href( - base_prefix, "/%s/" % user) if share: # backmap - child_element.text = child_element.text.replace(share['Owner'], share['User']) + child_element.text = xmlutils.make_href( + base_prefix, "/%s/" % share['User']) if share_bday_automap: child_element.text = child_element.text.rstrip(".vcf") + ".ics" + else: + child_element.text = xmlutils.make_href( + base_prefix, "/%s/" % user) element.append(child_element) else: element.append(ET.Element( diff --git a/radicale/app/report.py b/radicale/app/report.py index cd51a41f..1c853cdb 100644 --- a/radicale/app/report.py +++ b/radicale/app/report.py @@ -749,9 +749,12 @@ def xml_item_response(base_prefix: str, href: str, logger.debug("TRACE/REPORT/xml_report: href=%r", href_element.text) if share: # backmap - href_element.text = href_element.text.replace(share['PathMapped'], share['PathOrToken']) + if href_element.text.startswith(share['PathMapped']): + href_element.text = share['PathOrToken'] + href_element.text.removeprefix(share['PathMapped']) if share_bday_automap: href_element.text = href_element.text.rstrip(".vcf") + ".ics" + if logger.isEnabledFor(logging.DEBUG): + logger.debug("TRACE/REPORT/xml_report: href=%r (backmapped)", href_element.text) response.append(href_element) if found_item: @@ -790,12 +793,17 @@ def retrieve_items( gets set to ``True``.""" nonlocal collection_requested for hreference in hreferences: + if logger.isEnabledFor(logging.DEBUG): + logger.debug("TRACE/REPORT/xml_report: hreference=%r", hreference) if share: # map back to owner - hreference = hreference.replace(share['PathOrToken'], share['PathMapped']) + if hreference.startswith(share['PathOrToken']): + hreference = share['PathMapped'] + hreference.removeprefix(share['PathOrToken']) if share['Conversion'] == "bday": if not hreference.endswith('/'): hreference = hreference.rstrip(".ics") + ".vcf" + if logger.isEnabledFor(logging.DEBUG): + logger.debug("TRACE/REPORT/xml_report: hreference=%r (backmapped)", hreference) try: name = pathutils.name_from_path(hreference, collection) except ValueError as e: