Skip to content

Commit def9298

Browse files
authored
Merge pull request #2128 from pbiering/sharing-propfind-privilege-write
Sharing propfind privilege write exposure improvement
2 parents a48f35d + 7e3a9d2 commit def9298

3 files changed

Lines changed: 22 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## 3.7.4.dev
44
* Fix: sharing: PROPFIND returns now empty owner element in case of a mapped share as clients try PROPFIND on this not accessable href
5+
* Improve: sharing: PROPFIND returns also privilege "write" in case "write-content" and "write-properties" is permitted
56

67
## 3.7.3
78
* Extension: expose RADICALE:version for authenticated users via PROPFIND

radicale/app/propfind.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,10 +316,12 @@ def xml_propfind_response(
316316
privileges = ["D:read"]
317317
if share:
318318
logger.trace("PROPFIND/xml_propfind_response/current-user-privilege-set: raw_permissions=%r share[Permissions]=%r permit_properties_overlay=%s", raw_permissions, share['Permissions'], self._sharing.permit_properties_overlay)
319+
permit_write_content = False
319320
if write:
320321
if "w" in share['Permissions']:
321322
if not share_bday_automap:
322323
privileges.append("D:write-content")
324+
permit_write_content = True
323325
# priority share->rights->global
324326
if ("P" in share['Permissions'] or
325327
("P" in raw_permissions and "p" not in share['Permissions']) or
@@ -330,6 +332,9 @@ def xml_propfind_response(
330332
(not self._sharing.permit_properties_overlay and "P" not in raw_permissions and "P" not in share['Permissions'])):
331333
logger.trace("PROPFIND/xml_propfind_response/current-user-privilege-set: add D:write-properties")
332334
privileges.append("D:write-properties")
335+
# "write-content" + "write-properties" = "write" (rfc3744-3.2)
336+
if permit_write_content:
337+
privileges.append("D:write")
333338
elif write:
334339
privileges.append("D:all")
335340
privileges.append("D:write")

radicale/tests/test_sharing.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3475,14 +3475,29 @@ def test_sharing_api_permissions_default(self) -> None:
34753475
_, headers, answer = self._sharing_api_json("map", "enable", check=200, login="user1:user1pw", json_dict=json_dict)
34763476

34773477
# check PROPFIND/privileges item as user
3478-
logging.info("\n*** PROPFIND/privileges item as user")
3478+
logging.info("\n*** PROPFIND/privileges item as user (rw, no P)")
34793479
privileges_list = self._propfind_privileges(path_user1_rw, login="user1:user1pw")
34803480
assert "D:read" in privileges_list
34813481
assert "D:write-content" in privileges_list
34823482
assert "D:write-properties" not in privileges_list
34833483
assert "D:write" not in privileges_list
34843484
assert "D:all" not in privileges_list
34853485

3486+
logging.info("\n*** create map user1/owner1 rwP-> 200")
3487+
json_dict = {}
3488+
json_dict['PathMapped'] = path_owner1_rw
3489+
json_dict['PathOrToken'] = path_user1_rw
3490+
json_dict['Permissions'] = "rwP"
3491+
_, headers, answer = self._sharing_api_json("map", "update", check=200, login="owner1:owner1pw", json_dict=json_dict)
3492+
3493+
logging.info("\n*** PROPFIND/privileges item as user (rwP)")
3494+
privileges_list = self._propfind_privileges(path_user1_rw, login="user1:user1pw")
3495+
assert "D:read" in privileges_list
3496+
assert "D:write-content" in privileges_list
3497+
assert "D:write-properties" in privileges_list
3498+
assert "D:write" in privileges_list
3499+
assert "D:all" not in privileges_list
3500+
34863501
logging.info("\n*** create map user1/owner1 with adjusted default permissions -> 200")
34873502
self.configure({"sharing": {"default_permissions_create_map": "RrWw"}})
34883503
json_dict = {}

0 commit comments

Comments
 (0)