diff --git a/radicale/app/get.py b/radicale/app/get.py index b1e46540..ac5309f6 100644 --- a/radicale/app/get.py +++ b/radicale/app/get.py @@ -121,7 +121,10 @@ class ApplicationPartGet(ApplicationBase): elif limited_access: return httputils.NOT_ALLOWED else: - content_type = xmlutils.OBJECT_MIMETYPES[item.name] + if share and share['Conversion'] == "bday": + content_type = xmlutils.MIMETYPES["VCALENDAR"] + else: + content_type = xmlutils.OBJECT_MIMETYPES[item.name] content_disposition = "" assert item.last_modified headers = { @@ -130,9 +133,12 @@ class ApplicationPartGet(ApplicationBase): "ETag": item.etag} if content_disposition: headers["Content-Disposition"] = content_disposition - if isinstance(item, storage.BaseCollection) and share and share['Conversion'] == "bday": - # convert VCF to ICS - answer = item.serialize(vcf_to_ics=True) + if share and share['Conversion'] == "bday": + if isinstance(item, storage.BaseCollection): + # convert VCF to ICS + answer = item.serialize(vcf_to_ics=True) + else: + answer = item.convert_vcf_to_ics().serialize() else: answer = item.serialize() return client.OK, headers, answer, None diff --git a/radicale/sharing/__init__.py b/radicale/sharing/__init__.py index ba2c5f6b..109b292d 100644 --- a/radicale/sharing/__init__.py +++ b/radicale/sharing/__init__.py @@ -497,6 +497,9 @@ class BaseSharing: logger.info("sharing/%s: resolved path %r->%r, user %r->%r not enabled by user", "map", path, result['PathMapped'], user, result['Owner']) return {'error': 'map-not-enabled'} + if result['Conversion'] == "bday" and result['PathMapped'].endswith(".ics"): + result['PathMapped'] = result['PathMapped'].removesuffix(".ics") + ".vcf" + logger.info("sharing/%s: resolved path %r->%r, user %r->%r, Permissions=%r Conversion=%r", "map", path, result['PathMapped'], user, result['Owner'], result['Permissions'], result['Conversion']) return result