| 3260 | return rm_parser |
| 3261 | |
| 3262 | def execute(self, params, **kwargs): |
| 3263 | from ..enforcement import MasterPasswordReentryEnforcer |
| 3264 | if not MasterPasswordReentryEnforcer.check_and_enforce(params, "record_level"): |
| 3265 | raise CommandError('rm', 'Operation cancelled: Re-authentication failed') |
| 3266 | |
| 3267 | records_to_delete = [] # type: List[Tuple[BaseFolderNode, str]] |
| 3268 | record_names = kwargs.get('records') |
| 3269 | rq_obj_limit = 999 |
| 3270 | if not isinstance(record_names, list): |
| 3271 | if isinstance(record_names, str): |
| 3272 | record_names = [record_names] |
| 3273 | else: |
| 3274 | record_names = [] |
| 3275 | record_name = kwargs.get('record') |
| 3276 | if isinstance(record_name, str): |
| 3277 | record_names.append(record_name) |
| 3278 | |
| 3279 | for name in record_names: |
| 3280 | if name in params.record_cache: |
| 3281 | record_uid = name |
| 3282 | folders = list(find_all_folders(params, record_uid)) |
| 3283 | if len(folders) > 0: |
| 3284 | for folder in folders: |
| 3285 | records_to_delete.append((folder, record_uid)) |
| 3286 | else: |
| 3287 | records_to_delete.append((params.root_folder, record_uid)) |
| 3288 | else: |
| 3289 | orig_len = len(records_to_delete) |
| 3290 | rs = try_resolve_path(params, name, find_all_matches=True) |
| 3291 | if rs: |
| 3292 | folders, record_name = rs |
| 3293 | if record_name: |
| 3294 | if not isinstance(folders, list): |
| 3295 | if isinstance(folders, BaseFolderNode): |
| 3296 | folders = [folders] |
| 3297 | else: |
| 3298 | folders = [params.root_folder] |
| 3299 | for folder in folders: |
| 3300 | if not isinstance(folder, BaseFolderNode): |
| 3301 | continue |
| 3302 | folder_uid = folder.uid or '' |
| 3303 | if folder_uid not in params.subfolder_record_cache: |
| 3304 | continue |
| 3305 | for record_uid in params.subfolder_record_cache[folder_uid]: |
| 3306 | if record_name == record_uid: |
| 3307 | records_to_delete.append((folder, record_uid)) |
| 3308 | else: |
| 3309 | record = vault.KeeperRecord.load(params, record_uid) |
| 3310 | if record: |
| 3311 | if record.title.casefold() == record_name.casefold(): |
| 3312 | records_to_delete.append((folder, record_uid)) |
| 3313 | if len(records_to_delete) == orig_len: |
| 3314 | # Fallback: global title search so records in shared folders are also found. |
| 3315 | for record_uid in params.record_cache: |
| 3316 | record = vault.KeeperRecord.load(params, record_uid) |
| 3317 | if record and record.title.casefold() == name.casefold(): |
| 3318 | for folder in find_all_folders(params, record_uid): |
| 3319 | records_to_delete.append((folder, record_uid)) |