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")) 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) 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: