| 692 | return rmdir_parser |
| 693 | |
| 694 | def execute(self, params, **kwargs): |
| 695 | from ..enforcement import MasterPasswordReentryEnforcer |
| 696 | if not MasterPasswordReentryEnforcer.check_and_enforce(params, "record_level"): |
| 697 | raise CommandError('rmdir', 'Operation cancelled: Re-authentication failed') |
| 698 | |
| 699 | folder = params.folder_cache.get(params.current_folder, params.root_folder) |
| 700 | folders = [] |
| 701 | pattern_list = kwargs.get('pattern', []) |
| 702 | for pattern in pattern_list: |
| 703 | rs = try_resolve_path(params, pattern) |
| 704 | if rs is None: |
| 705 | regex_pattern = pattern |
| 706 | else: |
| 707 | folder, regex_pattern = rs |
| 708 | if regex_pattern == '': |
| 709 | folders.append(folder) |
| 710 | continue |
| 711 | |
| 712 | regex = re.compile(fnmatch.translate(regex_pattern)).match |
| 713 | subfolders = [] |
| 714 | for uid in folder.subfolders: |
| 715 | f = params.folder_cache[uid] |
| 716 | if any(filter(lambda x: regex(x) is not None, FolderListCommand.folder_match_strings(f))): |
| 717 | subfolders.append(f) |
| 718 | if len(subfolders) == 0: |
| 719 | logging.warning(f'Folder "{pattern}" was not found.') |
| 720 | else: |
| 721 | folders.extend(subfolders) |
| 722 | |
| 723 | if len(folders) == 0: |
| 724 | raise CommandError('rmdir', 'Enter name of an existing folder.') |
| 725 | |
| 726 | force = kwargs['force'] if 'force' in kwargs else None |
| 727 | quiet = kwargs['quiet'] if 'quiet' in kwargs else None |
| 728 | user_folder_objects = OrderedDict() |
| 729 | search_user_folder_ids = set() |
| 730 | shared_subfolder_delete_rq_added = False |
| 731 | for folder in folders: |
| 732 | if folder.uid not in user_folder_objects: |
| 733 | shared_subfolder_delete_rq_added = get_shared_subfolder_delete_rq( |
| 734 | params, folder, search_user_folder_ids |
| 735 | ) |
| 736 | del_obj = { |
| 737 | 'delete_resolution': 'unlink', |
| 738 | 'object_uid': folder.uid, |
| 739 | 'object_type': folder.type |
| 740 | } |
| 741 | parent = params.folder_cache.get(folder.parent_uid) |
| 742 | if parent is None: |
| 743 | del_obj['from_type'] = 'user_folder' |
| 744 | else: |
| 745 | del_obj['from_uid'] = parent.uid |
| 746 | del_obj['from_type'] = parent.type |
| 747 | if parent.type == BaseFolderNode.SharedFolderType: |
| 748 | del_obj['from_type'] = 'shared_folder_folder' |
| 749 | |
| 750 | user_folder_objects[folder.uid] = del_obj |
| 751 | |