| 666 | return rmdir_parser |
| 667 | |
| 668 | def execute(self, params, **kwargs): |
| 669 | from ..enforcement import MasterPasswordReentryEnforcer |
| 670 | if not MasterPasswordReentryEnforcer.check_and_enforce(params, "record_level"): |
| 671 | raise CommandError('rmdir', 'Operation cancelled: Re-authentication failed') |
| 672 | |
| 673 | folder = params.folder_cache.get(params.current_folder, params.root_folder) |
| 674 | folders = [] |
| 675 | pattern_list = kwargs.get('pattern', []) |
| 676 | for pattern in pattern_list: |
| 677 | rs = try_resolve_path(params, pattern) |
| 678 | if rs is None: |
| 679 | regex_pattern = pattern |
| 680 | else: |
| 681 | folder, regex_pattern = rs |
| 682 | if regex_pattern == '': |
| 683 | folders.append(folder) |
| 684 | continue |
| 685 | |
| 686 | regex = re.compile(fnmatch.translate(regex_pattern)).match |
| 687 | subfolders = [] |
| 688 | for uid in folder.subfolders: |
| 689 | f = params.folder_cache[uid] |
| 690 | if any(filter(lambda x: regex(x) is not None, FolderListCommand.folder_match_strings(f))): |
| 691 | subfolders.append(f) |
| 692 | if len(subfolders) == 0: |
| 693 | logging.warning(f'Folder "{pattern}" was not found.') |
| 694 | else: |
| 695 | folders.extend(subfolders) |
| 696 | |
| 697 | if len(folders) == 0: |
| 698 | raise CommandError('rmdir', 'Enter name of an existing folder.') |
| 699 | |
| 700 | force = kwargs['force'] if 'force' in kwargs else None |
| 701 | quiet = kwargs['quiet'] if 'quiet' in kwargs else None |
| 702 | user_folder_objects = OrderedDict() |
| 703 | search_user_folder_ids = set() |
| 704 | shared_subfolder_delete_rq_added = False |
| 705 | for folder in folders: |
| 706 | if folder.uid not in user_folder_objects: |
| 707 | shared_subfolder_delete_rq_added = get_shared_subfolder_delete_rq( |
| 708 | params, folder, search_user_folder_ids |
| 709 | ) |
| 710 | del_obj = { |
| 711 | 'delete_resolution': 'unlink', |
| 712 | 'object_uid': folder.uid, |
| 713 | 'object_type': folder.type |
| 714 | } |
| 715 | parent = params.folder_cache.get(folder.parent_uid) |
| 716 | if parent is None: |
| 717 | del_obj['from_type'] = 'user_folder' |
| 718 | else: |
| 719 | del_obj['from_uid'] = parent.uid |
| 720 | del_obj['from_type'] = parent.type |
| 721 | if parent.type == BaseFolderNode.SharedFolderType: |
| 722 | del_obj['from_type'] = 'shared_folder_folder' |
| 723 | |
| 724 | user_folder_objects[folder.uid] = del_obj |
| 725 | |