Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion examples/sdk_examples/nested_shared_folders/nsf_get.py
Original file line number Diff line number Diff line change
Expand Up @@ -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_uid_or_title>" # Record/folder UID or title

detail = nsf_management.get_nsf_item(vault, ITEM_UID_OR_TITLE)
Expand Down
11 changes: 9 additions & 2 deletions keepercli-package/src/keepercli/commands/nsf_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
vault_utils,
record_facades,
attachment,
nsf_management
)
from keepersdk.proto import pam_pb2, router_pb2

Expand Down
12 changes: 12 additions & 0 deletions keepersdk-package/src/keepersdk/vault/nsf_management.py
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down