Skip to content

Commit 86c03b3

Browse files
committed
Correct folder permission deletion logic to simplify recursive functionality
1 parent 865dea5 commit 86c03b3

File tree

3 files changed

+30
-53
lines changed

3 files changed

+30
-53
lines changed

docs/explanations/access_control.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ Synapse provides special principals for common sharing scenarios:
3434

3535
- **273948**: All authenticated Synapse users
3636
- **273949**: Public access (anyone on the internet)
37-
- **Specific User ID**: Individual Synapse users (e.g., 3417048)
38-
- **Team ID**: Synapse teams for group-based permissions
37+
- **Specific User ID**: Individual Synapse users (e.g., #######)
38+
- **Team ID**: Synapse teams for group-based permissions (e.g., #######)
3939

4040
## Common Use Cases
4141

synapseclient/core/models/permission.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
@dataclass
1010
class Permissions:
1111
"""
12-
The permission a user has for a given Entity. The set of permissoins is a calculation
12+
The permission a user has for a given Entity. The set of permissions is a calculation
1313
based several factors including the permission granted by the Entity's ACL and the
1414
User's group membership.
1515

synapseclient/models/mixins/access_control.py

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -607,24 +607,11 @@ async def main():
607607
target_entity_types=normalized_types,
608608
benefactor_tracker=benefactor_tracker,
609609
progress_bar=progress_bar,
610-
)
611-
if progress_bar:
612-
progress_bar.update(1) # Process container contents complete
613-
614-
if recursive and hasattr(self, "folders"):
615-
if progress_bar:
616-
progress_bar.total += 1
617-
progress_bar.refresh()
618-
await self._process_folder_permission_deletion(
619-
client=client,
620-
recursive=True,
621-
target_entity_types=normalized_types,
610+
recursive=recursive,
622611
include_container_content=include_container_content,
623-
benefactor_tracker=benefactor_tracker,
624-
progress_bar=progress_bar,
625612
)
626613
if progress_bar:
627-
progress_bar.update(1)
614+
progress_bar.update(1) # Process container contents complete
628615

629616
def _normalize_target_entity_types(
630617
self, target_entity_types: Optional[List[str]]
@@ -703,15 +690,19 @@ async def _process_container_contents(
703690
target_entity_types: List[str],
704691
benefactor_tracker: BenefactorTracker,
705692
progress_bar: Optional[tqdm] = None,
693+
recursive: bool = False,
694+
include_container_content: bool = True,
706695
) -> None:
707696
"""
708-
Process the direct contents of a container entity.
697+
Process the contents of a container entity, optionally recursively.
709698
710699
Arguments:
711700
client: The Synapse client instance to use for API calls.
712701
target_entity_types: A list of normalized entity types to process.
713702
benefactor_tracker: Tracker for managing benefactor relationships.
714703
progress_bar: Optional progress bar to update as tasks complete.
704+
recursive: If True, process folders recursively; if False, process only direct contents.
705+
include_container_content: Whether to include the content of containers in processing.
715706
716707
Returns:
717708
None
@@ -757,21 +748,23 @@ async def process_single_file(file):
757748
if progress_bar:
758749
progress_bar.update(1)
759750

760-
if "folder" in target_entity_types and hasattr(self, "folders"):
751+
if hasattr(self, "folders"):
761752
await self._process_folder_permission_deletion(
762753
client=client,
763-
recursive=False,
754+
recursive=recursive,
764755
benefactor_tracker=benefactor_tracker,
765756
progress_bar=progress_bar,
757+
target_entity_types=target_entity_types,
758+
include_container_content=include_container_content,
766759
)
767760

768761
async def _process_folder_permission_deletion(
769762
self,
770763
client: Synapse,
771764
recursive: bool,
772765
benefactor_tracker: BenefactorTracker,
766+
target_entity_types: List[str],
773767
progress_bar: Optional[tqdm] = None,
774-
target_entity_types: Optional[List[str]] = None,
775768
include_container_content: bool = False,
776769
) -> None:
777770
"""
@@ -782,9 +775,9 @@ async def _process_folder_permission_deletion(
782775
recursive: If True, process folders recursively; if False, process only direct folders.
783776
benefactor_tracker: Tracker for managing benefactor relationships.
784777
Only used for non-recursive processing.
785-
progress_bar: Optional progress bar to update as tasks complete.
786778
target_entity_types: A list of normalized entity types to process.
787779
For non-recursive processing, defaults to ["folder"].
780+
progress_bar: Optional progress bar to update as tasks complete.
788781
include_container_content: Whether to include the content of containers in processing.
789782
Only used for recursive processing.
790783
@@ -814,37 +807,21 @@ async def _process_folder_permission_deletion(
814807
progress_bar.update(1) # Each tracking task complete
815808

816809
async def process_single_folder(folder):
817-
if recursive:
818-
# Recursive processing logic
819-
if target_entity_types is None:
820-
target_entity_types_to_use = []
821-
else:
822-
target_entity_types_to_use = target_entity_types
823-
824-
should_delete_folder_acl = (
825-
"folder" in target_entity_types_to_use and include_container_content
826-
)
810+
should_delete_folder_acl = (
811+
"folder" in target_entity_types and include_container_content
812+
)
827813

828-
await folder.delete_permissions_async(
829-
include_self=should_delete_folder_acl,
830-
recursive=recursive,
831-
include_container_content=include_container_content,
832-
target_entity_types=target_entity_types_to_use,
833-
dry_run=False,
834-
_benefactor_tracker=benefactor_tracker,
835-
synapse_client=client,
836-
)
837-
else:
838-
# Non-recursive (direct) processing logic
839-
await folder.delete_permissions_async(
840-
include_self=True,
841-
recursive=False,
842-
include_container_content=False,
843-
target_entity_types=target_entity_types or ["folder"],
844-
dry_run=False,
845-
_benefactor_tracker=benefactor_tracker,
846-
synapse_client=client,
847-
)
814+
await folder.delete_permissions_async(
815+
include_self=should_delete_folder_acl,
816+
recursive=recursive,
817+
# This is needed to ensure we do not delete children ACLs when not
818+
# recursive, but still allow us to delete the ACL on the folder
819+
include_container_content=include_container_content and recursive,
820+
target_entity_types=target_entity_types,
821+
dry_run=False,
822+
_benefactor_tracker=benefactor_tracker,
823+
synapse_client=client,
824+
)
848825

849826
folder_tasks = [process_single_folder(folder) for folder in self.folders]
850827

0 commit comments

Comments
 (0)