From d166b8fce1d07932981fd63d75fbf20488b9c80d Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Sat, 4 Apr 2026 08:40:43 +0200 Subject: [PATCH 1/3] sharing/propfind: only offer this privileges if sharing is enabled and not being a share (nested sharing is not supported) --- radicale/app/propfind.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/radicale/app/propfind.py b/radicale/app/propfind.py index 4e1760e1..238dd39a 100644 --- a/radicale/app/propfind.py +++ b/radicale/app/propfind.py @@ -330,10 +330,12 @@ def xml_propfind_response( privileges.append("D:write-properties") privileges.append("D:write-content") - if ("T" in raw_permissions or (self._sharing.permit_create_token and "t" not in raw_permissions)): - privileges.append("RADICALE:share-token") - if ("M" in raw_permissions or (self._sharing.permit_create_map and "m" not in raw_permissions)): - privileges.append("RADICALE:share-map") + if self._sharing._enabled and not share: + # only offer this privileges if sharing is enabled and not being a share (nested sharing is not supported) + if ("T" in raw_permissions or (self._sharing.permit_create_token and "t" not in raw_permissions)): + privileges.append("RADICALE:share-token") + if ("M" in raw_permissions or (self._sharing.permit_create_map and "m" not in raw_permissions)): + privileges.append("RADICALE:share-map") for human_tag in privileges: privilege = ET.Element(xmlutils.make_clark("D:privilege")) From ec801061894d2f8ba07e5c0c89901e0b12f33cec Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Sat, 4 Apr 2026 08:41:02 +0200 Subject: [PATCH 2/3] sharing/rights/inline doc: update --- radicale/rights/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/radicale/rights/__init__.py b/radicale/rights/__init__.py index 2e51fe0b..c6590e20 100644 --- a/radicale/rights/__init__.py +++ b/radicale/rights/__init__.py @@ -35,8 +35,6 @@ Permissions: - t: deny create of token-based sharing of collection in case permit_create_token=True (>= 3.7.0) - M: permit create of map-based sharing of collection in case permit_create_map=False (>= 3.7.0) - m: deny create of map-based sharing of collection in case permit_create_map=True (>= 3.7.0) - -Permissions only supported so far in share permissions: - P: permit properties overlay in case permit_properties_overlay=False (>= 3.7.0) - p: deny properties overlay in case permit_properties_overlay=True (>= 3.7.0) - E: enable enforce properties overlay in case enforce_properties_overlay=False (>= 3.7.0) From 3e2fd6b90aa7894a9a4dcf20a0491e721c569bec Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Sat, 4 Apr 2026 08:41:29 +0200 Subject: [PATCH 3/3] rights: check for conflicting permissions --- radicale/rights/from_file.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/radicale/rights/from_file.py b/radicale/rights/from_file.py index b0610051..7cd0a8c5 100644 --- a/radicale/rights/from_file.py +++ b/radicale/rights/from_file.py @@ -68,6 +68,11 @@ class Rights(rights.BaseRights): collection_pattern = rights_config_parser.get(section, "collection") allowed_groups = rights_config_parser.get(section, "groups", fallback="").split(",") permission = rights_config_parser.get(section, "permissions") + # test for conflicting permissions + if "p" in permission and "P" in permission: + raise RuntimeError("conflicting p+P found") + if "e" in permission and "E" in permission: + raise RuntimeError("conflicting e+E found") self._rights_config[section] = {"user_pattern": user_pattern, "collection_pattern": collection_pattern, "allowed_groups": allowed_groups, "permission": permission} except Exception as e: