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