diff --git a/radicale/tests/test_sharing.py b/radicale/tests/test_sharing.py index e47c9b0e..3302680a 100644 --- a/radicale/tests/test_sharing.py +++ b/radicale/tests/test_sharing.py @@ -5134,6 +5134,7 @@ permissions: RrWw""") for db_type in list(filter(lambda item: item != "none", sharing.INTERNAL_TYPES)): logging.info("\n*** test: %s", db_type) self.configure({"sharing": {"type": db_type}}) + self.configure({"sharing": {"permit_properties_overlay": "True"}}) path_mapped = "/owner/adressbook-" + db_type + ".vcf/" self.create_addressbook(path_mapped, login="owner:ownerpw") @@ -5191,6 +5192,26 @@ permissions: RrWw""") assert "Test-FN-C3 (BDAY)" in answer assert "Test-FN (BDAY)" in answer + # verify content as owner + logging.info("\n*** GET collection owner -> ok") + _, headers, answer = self.request("GET", path_shared) + assert 'Content-Type' in headers + assert 'text/calendar' in headers['Content-Type'] + # title from default + assert 'Content-Disposition' in headers + assert 'Calendar.ics' in headers['Content-Disposition'] + + # create map of ics with conversion -> fail + logging.info("\n*** create token with bday conversion but unsupported permissions -> fail") + json_dict = {} + json_dict['User'] = "owner" + json_dict['PathMapped'] = path_mapped + json_dict['Enabled'] = True + json_dict['Permissions'] = "rw" + json_dict['Hidden'] = False + json_dict['Conversion'] = "bday" + _, headers, answer = self._sharing_api_json("token", "create", check=405, login="owner:ownerpw", json_dict=json_dict) + # check PROPFIND item with token logging.info("\n*** PROPFIND item with token -> calendar") response = self._propfind_allprop(path_shared) @@ -5228,7 +5249,6 @@ permissions: RrWw""") json_dict['User'] = "owner" json_dict['PathOrToken'] = path_shared json_dict['Permissions'] = "r" - json_dict['Conversion'] = "bday" _, headers, answer = self._sharing_api_json("token", "update", check=200, login="owner:ownerpw", json_dict=json_dict) logging.info("\n*** PROPFIND item with token -> calendar") @@ -5257,25 +5277,91 @@ permissions: RrWw""") """, check=207) - # verify content as owner - logging.info("\n*** GET collection owner -> ok") - _, headers, answer = self.request("GET", path_shared) - assert 'Content-Type' in headers - assert 'text/calendar' in headers['Content-Type'] - # title from default - assert 'Content-Disposition' in headers - assert 'Calendar.ics' in headers['Content-Disposition'] + self.configure({"sharing": {"permit_properties_overlay": "False"}}) - # create map - logging.info("\n*** create token with bday conversion but unsupported permissions -> fail") + logging.info("\n*** PROPFIND item with token (r) -> calendar") + response = self._propfind_allprop(path_shared) + logging.debug("response: %r", response) + status, props = response["D:current-user-privilege-set"] + privileges = props.findall(xmlutils.make_clark("D:privilege")) + assert len(privileges) >= 1 + privileges_list = [xmlutils.make_human_tag(privilege.findall("*")[0].tag) for privilege in privileges] + assert "D:read" in privileges_list + assert "D:write-content" not in privileges_list + assert "D:write-properties" not in privileges_list + assert "D:write" not in privileges_list + assert "D:all" not in privileges_list + + # execute PROPPATCH color as user + logging.info("\n*** PROPPATCH color collection with token -> ok") + color = "#BBBBBB" + _, responses = self.proppatch(path=path_shared, data="""\ + + + + + """ + color + """ + + +""", check=403) + + # update map to "rP" + logging.info("\n*** update token with bday conversion ('rP' permissions) -> ok") json_dict = {} json_dict['User'] = "owner" - json_dict['PathMapped'] = path_mapped - json_dict['Enabled'] = True - json_dict['Permissions'] = "rw" - json_dict['Hidden'] = False - json_dict['Conversion'] = "bday" - _, headers, answer = self._sharing_api_json("token", "create", check=405, login="owner:ownerpw", json_dict=json_dict) + json_dict['PathOrToken'] = path_shared + json_dict['Permissions'] = "rP" + _, headers, answer = self._sharing_api_json("token", "update", check=200, login="owner:ownerpw", json_dict=json_dict) + + logging.info("\n*** PROPFIND item with token -> calendar") + response = self._propfind_allprop(path_shared) + logging.debug("response: %r", response) + status, props = response["D:current-user-privilege-set"] + privileges = props.findall(xmlutils.make_clark("D:privilege")) + assert len(privileges) >= 1 + privileges_list = [xmlutils.make_human_tag(privilege.findall("*")[0].tag) for privilege in privileges] + assert "D:read" in privileges_list + assert "D:write-content" not in privileges_list + assert "D:write-properties" in privileges_list + assert "D:write" not in privileges_list + assert "D:all" not in privileges_list + + # execute PROPPATCH color as user + logging.info("\n*** PROPPATCH color collection with token -> ok") + color = "#BBBBBB" + _, responses = self.proppatch(path=path_shared, data="""\ + + + + + """ + color + """ + + +""", check=207) + + # update map to "rPe" + logging.info("\n*** update token with bday conversion ('rPe' permissions) -> not supported") + json_dict = {} + json_dict['User'] = "owner" + json_dict['PathOrToken'] = path_shared + json_dict['Permissions'] = "rPe" + _, headers, answer = self._sharing_api_json("token", "update", check=405, login="owner:ownerpw", json_dict=json_dict) + + # update map to "rPE" + logging.info("\n*** update token with bday conversion ('rPE' permissions) -> not supported") + json_dict = {} + json_dict['User'] = "owner" + json_dict['PathOrToken'] = path_shared + json_dict['Permissions'] = "rPE" + _, headers, answer = self._sharing_api_json("token", "update", check=405, login="owner:ownerpw", json_dict=json_dict) + + # update map Conversion + logging.info("\n*** update token remove Conversion -> not supported") + json_dict = {} + json_dict['User'] = "owner" + json_dict['PathOrToken'] = path_shared + json_dict['Conversion'] = "" + _, headers, answer = self._sharing_api_json("token", "update", check=400, login="owner:ownerpw", json_dict=json_dict) def test_sharing_api_token_ics_bday(self) -> None: """share-by-token ics with bday conversion (has to fail)."""