diff --git a/examples/sdk_examples/nested_shared_folders/nsf_get.py b/examples/sdk_examples/nested_shared_folders/nsf_get.py index bdaeb0b5..b1db4581 100644 --- a/examples/sdk_examples/nested_shared_folders/nsf_get.py +++ b/examples/sdk_examples/nested_shared_folders/nsf_get.py @@ -514,7 +514,10 @@ def close_vault(vault: vault_online.VaultOnline, keeper_auth_context: keeper_aut def nsf_get(vault: vault_online.VaultOnline) -> None: - """Get NSF record or folder details by UID or title (nsf-get).""" + """Get NSF record or folder details by UID or title (nsf-get). + + For folders, the response includes parent_uid and parent_name (when available). + """ ITEM_UID_OR_TITLE = "" # Record/folder UID or title detail = nsf_management.get_nsf_item(vault, ITEM_UID_OR_TITLE) diff --git a/keepercli-package/src/keepercli/commands/nsf_commands.py b/keepercli-package/src/keepercli/commands/nsf_commands.py index f86932cc..ea322e5f 100644 --- a/keepercli-package/src/keepercli/commands/nsf_commands.py +++ b/keepercli-package/src/keepercli/commands/nsf_commands.py @@ -355,7 +355,11 @@ def _print_folder_detail(detail: Dict[str, Any], verbose: bool) -> None: logger.info('') logger.info('{0:>25s}: {1}'.format('NSF Folder UID', detail.get('nsf_folder_uid', ''))) logger.info('{0:>25s}: {1}'.format('Name', detail.get('name', ''))) - logger.info('{0:>25s}: {1}'.format('Parent', detail.get('parent_uid', ''))) + if detail.get('parent_uid'): + parent_display = detail.get('parent_uid', '') + if detail.get('parent_name'): + parent_display = f"{detail['parent_name']} ({detail['parent_uid']})" + logger.info('{0:>25s}: {1}'.format('Parent', parent_display)) NsfGetCommand._print_folder_access( detail.get('access') or {}, verbose, @@ -368,8 +372,11 @@ def _print_folder_json(detail: Dict[str, Any], verbose: bool) -> None: fo = { 'nsf_folder_uid': detail.get('nsf_folder_uid'), 'name': detail.get('name'), - 'parent_uid': detail.get('parent_uid'), } + if detail.get('parent_uid'): + fo['parent_uid'] = detail.get('parent_uid') + if detail.get('parent_name'): + fo['parent_name'] = detail.get('parent_name') if detail.get('owner_username'): fo['owner'] = detail['owner_username'] access = detail.get('access') or {} diff --git a/keepercli-package/src/keepercli/commands/pam/pam_rotation.py b/keepercli-package/src/keepercli/commands/pam/pam_rotation.py index 0efcb4b9..ec35efb8 100644 --- a/keepercli-package/src/keepercli/commands/pam/pam_rotation.py +++ b/keepercli-package/src/keepercli/commands/pam/pam_rotation.py @@ -18,6 +18,7 @@ vault_utils, record_facades, attachment, + nsf_management ) from keepersdk.proto import pam_pb2, router_pb2 diff --git a/keepersdk-package/src/keepersdk/vault/nsf_management.py b/keepersdk-package/src/keepersdk/vault/nsf_management.py index b1890225..33e0bda5 100644 --- a/keepersdk-package/src/keepersdk/vault/nsf_management.py +++ b/keepersdk-package/src/keepersdk/vault/nsf_management.py @@ -408,6 +408,18 @@ def get_nsf_folder_detail( result['owner_username'] = row.owner_username result['owner_account_uid'] = row.owner_account_uid + if folder.parent_uid: + parent_uid = folder.parent_uid + root_folder_uid = vault.vault_data.root_folder.folder_uid + if parent_uid == root_folder_uid or parent_uid.startswith('AAAAAA'): + result['parent_uid'] = parent_uid + result['parent_name'] = 'root' + else: + result['parent_uid'] = parent_uid + parent_folder = _nsf_view(vault).get_folder(parent_uid) + if parent_folder: + result['parent_name'] = parent_folder.name or parent_uid + if include_access: try: access = get_nsf_folder_access(vault, [folder_uid])