| 3140 | return rm_parser |
| 3141 | |
| 3142 | def execute(self, params, **kwargs): |
| 3143 | from ..enforcement import MasterPasswordReentryEnforcer |
| 3144 | if not MasterPasswordReentryEnforcer.check_and_enforce(params, "record_level"): |
| 3145 | raise CommandError('rm', 'Operation cancelled: Re-authentication failed') |
| 3146 | |
| 3147 | records_to_delete = [] # type: List[Tuple[BaseFolderNode, str]] |
| 3148 | record_names = kwargs.get('records') |
| 3149 | rq_obj_limit = 999 |
| 3150 | if not isinstance(record_names, list): |
| 3151 | if isinstance(record_names, str): |
| 3152 | record_names = [record_names] |
| 3153 | else: |
| 3154 | record_names = [] |
| 3155 | record_name = kwargs.get('record') |
| 3156 | if isinstance(record_name, str): |
| 3157 | record_names.append(record_name) |
| 3158 | |
| 3159 | for name in record_names: |
| 3160 | if name in params.record_cache: |
| 3161 | record_uid = name |
| 3162 | folders = list(find_all_folders(params, record_uid)) |
| 3163 | if len(folders) > 0: |
| 3164 | for folder in folders: |
| 3165 | records_to_delete.append((folder, record_uid)) |
| 3166 | else: |
| 3167 | records_to_delete.append((params.root_folder, record_uid)) |
| 3168 | else: |
| 3169 | orig_len = len(records_to_delete) |
| 3170 | rs = try_resolve_path(params, name, find_all_matches=True) |
| 3171 | if rs: |
| 3172 | folders, record_name = rs |
| 3173 | if record_name: |
| 3174 | if not isinstance(folders, list): |
| 3175 | if isinstance(folders, BaseFolderNode): |
| 3176 | folders = [folders] |
| 3177 | else: |
| 3178 | folders = [params.root_folder] |
| 3179 | for folder in folders: |
| 3180 | if not isinstance(folder, BaseFolderNode): |
| 3181 | continue |
| 3182 | folder_uid = folder.uid or '' |
| 3183 | if folder_uid not in params.subfolder_record_cache: |
| 3184 | continue |
| 3185 | for record_uid in params.subfolder_record_cache[folder_uid]: |
| 3186 | if record_name == record_uid: |
| 3187 | records_to_delete.append((folder, record_uid)) |
| 3188 | else: |
| 3189 | record = vault.KeeperRecord.load(params, record_uid) |
| 3190 | if record: |
| 3191 | if record.title.casefold() == record_name.casefold(): |
| 3192 | records_to_delete.append((folder, record_uid)) |
| 3193 | if len(records_to_delete) == orig_len: |
| 3194 | # Fallback: global title search so records in shared folders are also found. |
| 3195 | for record_uid in params.record_cache: |
| 3196 | record = vault.KeeperRecord.load(params, record_uid) |
| 3197 | if record and record.title.casefold() == name.casefold(): |
| 3198 | for folder in find_all_folders(params, record_uid): |
| 3199 | records_to_delete.append((folder, record_uid)) |