Skip to content

Commit f9f0c63

Browse files
authored
[SYNPY-1244] Add delete permissions/acl functionality (#1200)
* Add delete_permissions functionality for both sync and async functions to all models which allow setting permissions via the mixin
1 parent 70e53e6 commit f9f0c63

28 files changed

+2000
-57
lines changed

docs/reference/experimental/async/dataset.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ at your own risk.
2424
- delete_column
2525
- reorder_column
2626
- rename_column
27-
- get_permissions
28-
- get_acl
29-
- set_permissions
27+
- get_permissions_async
28+
- get_acl_async
29+
- set_permissions_async
30+
- delete_permissions_async
3031
---
3132
[](){ #entity-ref-reference-async }
3233
::: synapseclient.models.EntityRef

docs/reference/experimental/async/dataset_collection.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ at your own risk.
2424
- delete_column
2525
- reorder_column
2626
- rename_column
27-
- get_permissions
28-
- get_acl
29-
- set_permissions
27+
- get_permissions_async
28+
- get_acl_async
29+
- set_permissions_async
30+
- delete_permissions_async
3031
---
3132
[](){ #entity-ref-dataset-collection-reference-async }
3233
::: synapseclient.models.EntityRef

docs/reference/experimental/async/entityview.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ at your own risk.
2424
- get_acl_async
2525
- get_permissions_async
2626
- set_permissions_async
27+
- delete_permissions_async
2728
---
2829

2930
[](){ #view-type-mask-reference }

docs/reference/experimental/async/file.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ at your own risk.
2121
- get_permissions_async
2222
- get_acl_async
2323
- set_permissions_async
24+
- delete_permissions_async
2425
---
2526
[](){ #filehandle-reference-async }
2627
::: synapseclient.models.file.FileHandle

docs/reference/experimental/async/folder.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ at your own risk.
1818
- get_permissions_async
1919
- get_acl_async
2020
- set_permissions_async
21+
- delete_permissions_async

docs/reference/experimental/async/materializedview.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ at your own risk.
1515
- delete_async
1616
- query_async
1717
- query_part_mask_async
18-
- get_permissions
19-
- get_acl
20-
- set_permissions
18+
- get_permissions_async
19+
- get_acl_async
20+
- set_permissions_async
21+
- delete_permissions_async

docs/reference/experimental/async/project.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ at your own risk.
1717
- get_permissions_async
1818
- get_acl_async
1919
- set_permissions_async
20+
- delete_permissions_async

docs/reference/experimental/async/table.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ at your own risk.
2323
- delete_column
2424
- add_column
2525
- reorder_column
26-
- get_permissions
27-
- get_acl
28-
- set_permissions
26+
- get_permissions_async
27+
- get_acl_async
28+
- set_permissions_async
29+
- delete_permissions_async
2930

3031
[](){ #column-reference-async }
3132
::: synapseclient.models.Column

docs/reference/experimental/async/virtualtable.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ at your own risk.
1515
- delete_async
1616
- query_async
1717
- query_part_mask_async
18-
- get_permissions
19-
- get_acl
20-
- set_permissions
18+
- get_permissions_async
19+
- get_acl_async
20+
- set_permissions_async
21+
- delete_permissions_async

docs/reference/experimental/sync/dataset.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ at your own risk.
2727
- get_permissions
2828
- get_acl
2929
- set_permissions
30+
- delete_permissions
3031
---
3132
[](){ #entity-ref-reference-sync }
3233
::: synapseclient.models.EntityRef

docs/reference/experimental/sync/dataset_collection.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ at your own risk.
2727
- get_permissions
2828
- get_acl
2929
- set_permissions
30+
- delete_permissions
3031
---
3132
[](){ #entity-ref-dataset-collection-reference-sync }
3233
::: synapseclient.models.EntityRef

docs/reference/experimental/sync/entityview.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ at your own risk.
2424
- get_acl
2525
- get_permissions
2626
- set_permissions
27+
- delete_permissions
2728
---
2829

2930
[](){ #view-type-mask-reference-sync }

docs/reference/experimental/sync/file.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ at your own risk.
3131
- get_permissions
3232
- get_acl
3333
- set_permissions
34+
- delete_permissions
3435
---
3536
[](){ #filehandle-reference-sync }
3637
::: synapseclient.models.file.FileHandle

docs/reference/experimental/sync/folder.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@ at your own risk.
2929
- get_permissions
3030
- get_acl
3131
- set_permissions
32+
- delete_permissions

docs/reference/experimental/sync/materializedview.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ at your own risk.
1919
- get_permissions
2020
- get_acl
2121
- set_permissions
22+
- delete_permissions

docs/reference/experimental/sync/project.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,4 @@ at your own risk.
2828
- get_permissions
2929
- get_acl
3030
- set_permissions
31+
- delete_permissions

docs/reference/experimental/sync/submissionview.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ at your own risk.
2323
- get_acl
2424
- get_permissions
2525
- set_permissions
26+
- delete_permissions

docs/reference/experimental/sync/table.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ at your own risk.
3737
- get_permissions
3838
- get_acl
3939
- set_permissions
40+
- delete_permissions
4041

4142
[](){ #column-reference-sync }
4243
::: synapseclient.models.Column

docs/reference/experimental/sync/virtualtable.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ at your own risk.
1818
- get_permissions
1919
- get_acl
2020
- set_permissions
21+
- delete_permissions

synapseclient/api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from .entity_services import (
2626
create_access_requirements_if_none,
2727
delete_entity,
28+
delete_entity_acl,
2829
delete_entity_generated_by,
2930
get_entities_by_md5,
3031
get_entity,
@@ -81,6 +82,7 @@
8182
"put_entity",
8283
"post_entity",
8384
"delete_entity",
85+
"delete_entity_acl",
8486
"get_upload_destination",
8587
"get_upload_destination_location",
8688
"create_access_requirements_if_none",

synapseclient/api/entity_services.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,60 @@ async def main():
291291
)
292292

293293

294+
async def delete_entity_acl(
295+
entity_id: str,
296+
*,
297+
synapse_client: Optional["Synapse"] = None,
298+
) -> None:
299+
"""
300+
Delete the Access Control List (ACL) for a given Entity.
301+
302+
By default, Entities such as FileEntity and Folder inherit their permission from
303+
their containing Project. For such Entities the Project is the Entity's 'benefactor'.
304+
This permission inheritance can be overridden by creating an ACL for the Entity.
305+
When this occurs the Entity becomes its own benefactor and all permission are
306+
determined by its own ACL.
307+
308+
If the ACL of an Entity is deleted, then its benefactor will automatically be set
309+
to its parent's benefactor. The ACL for a Project cannot be deleted.
310+
311+
Note: The caller must be granted ACCESS_TYPE.CHANGE_PERMISSIONS on the Entity to
312+
call this method.
313+
314+
Arguments:
315+
entity_id: The ID of the entity that should have its ACL deleted.
316+
synapse_client: If not passed in and caching was not disabled by
317+
`Synapse.allow_client_caching(False)` this will use the last created
318+
instance from the Synapse class constructor.
319+
320+
Example: Delete the ACL for entity `syn123`:
321+
This will delete the ACL for the entity, making it inherit permissions from
322+
its parent.
323+
324+
```python
325+
import asyncio
326+
from synapseclient import Synapse
327+
from synapseclient.api import delete_entity_acl
328+
329+
syn = Synapse()
330+
syn.login()
331+
332+
async def main():
333+
await delete_entity_acl(entity_id="syn123")
334+
335+
asyncio.run(main())
336+
```
337+
338+
Returns: None
339+
"""
340+
from synapseclient import Synapse
341+
342+
client = Synapse.get_client(synapse_client=synapse_client)
343+
return await client.rest_delete_async(
344+
uri=f"/entity/{entity_id}/acl",
345+
)
346+
347+
294348
async def get_entity_path(
295349
entity_id: str,
296350
*,

synapseclient/client.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,7 +2725,7 @@ def getChildren(
27252725
27262726
Arguments:
27272727
parent: An id or an object of a Synapse container or None to retrieve all projects
2728-
includeTypes: Must be a list of entity types (ie. ["folder","file"]) which can be found [here](http://docs.synapse.org/rest/org/sagebionetworks/repo/model/EntityType.html)
2728+
includeTypes: Must be a list of entity types (ie. ["folder","file"]) which can be found [here](https://rest-docs.synapse.org/rest/org/sagebionetworks/repo/model/EntityType.html)
27292729
sortBy: How results should be sorted. Can be NAME, or CREATED_ON
27302730
sortDirection: The direction of the result sort. Can be ASC, or DESC
27312731
@@ -2795,24 +2795,49 @@ def _getBenefactor(
27952795

27962796
return entity
27972797

2798-
def _getACL(self, entity: Union[Entity, str]) -> Dict[str, Union[str, list]]:
2798+
def _getACL(
2799+
self, entity: Union[Entity, str], check_benefactor: bool = True
2800+
) -> Dict[str, Union[str, list]]:
27992801
"""
28002802
Get the effective Access Control Lists (ACL) for a Synapse Entity.
28012803
28022804
Arguments:
28032805
entity: A Synapse Entity or Synapse ID
2806+
check_benefactor: If True (default), check the benefactor for the entity
2807+
to get the ACL. If False, only check the entity itself.
2808+
This is useful for checking the ACL of an entity that has local sharing
2809+
settings, but you want to check the ACL of the entity itself and not
2810+
the benefactor it may inherit from.
28042811
28052812
Returns:
28062813
A dictionary of the Entity's ACL
28072814
"""
28082815
if hasattr(entity, "getACLURI"):
28092816
uri = entity.getACLURI()
2817+
return self.restGET(uri)
28102818
else:
2811-
# Get the ACL from the benefactor (which may be the entity itself)
2812-
benefactor = self._getBenefactor(entity)
2813-
trace.get_current_span().set_attributes({"synapse.id": benefactor["id"]})
2814-
uri = "/entity/%s/acl" % (benefactor["id"])
2815-
return self.restGET(uri)
2819+
if check_benefactor:
2820+
# Get the ACL from the benefactor (which may be the entity itself)
2821+
benefactor = self._getBenefactor(entity)
2822+
trace.get_current_span().set_attributes(
2823+
{"synapse.id": benefactor["id"]}
2824+
)
2825+
uri = "/entity/%s/acl" % (benefactor["id"])
2826+
return self.restGET(uri)
2827+
else:
2828+
synid, _ = utils.get_synid_and_version(entity)
2829+
trace.get_current_span().set_attributes({"synapse.id": synid})
2830+
uri = "/entity/%s/acl" % (synid)
2831+
try:
2832+
return self.restGET(uri)
2833+
except SynapseHTTPError as e:
2834+
if (
2835+
"The requested ACL does not exist. This entity inherits its permissions from:"
2836+
in str(e)
2837+
):
2838+
# If the entity does not have an ACL, return an empty ACL
2839+
return {"resourceAccess": []}
2840+
raise e
28162841

28172842
def _storeACL(
28182843
self, entity: Union[Entity, str], acl: Dict[str, Union[str, list]]
@@ -2889,6 +2914,7 @@ def get_acl(
28892914
self,
28902915
entity: Union[Entity, Evaluation, str, collections.abc.Mapping],
28912916
principal_id: str = None,
2917+
check_benefactor: bool = True,
28922918
) -> typing.List[str]:
28932919
"""
28942920
Get the [ACL](https://rest-docs.synapse.org/rest/org/
@@ -2898,6 +2924,11 @@ def get_acl(
28982924
Arguments:
28992925
entity: An Entity or Synapse ID to lookup
29002926
principal_id: Identifier of a user or group (defaults to PUBLIC users)
2927+
check_benefactor: If True (default), check the benefactor for the entity
2928+
to get the ACL. If False, only check the entity itself.
2929+
This is useful for checking the ACL of an entity that has local sharing
2930+
settings, but you want to check the ACL of the entity itself and not
2931+
the benefactor it may inherit from.
29012932
29022933
Returns:
29032934
An array containing some combination of
@@ -2912,7 +2943,7 @@ def get_acl(
29122943
{"synapse.id": id_of(entity), "synapse.principal_id": principal_id}
29132944
)
29142945

2915-
acl = self._getACL(entity)
2946+
acl = self._getACL(entity=entity, check_benefactor=check_benefactor)
29162947

29172948
team_list = self._find_teams_for_principal(principal_id)
29182949
team_ids = [int(team.id) for team in team_list]

0 commit comments

Comments
 (0)