Skip to content
Merged
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
42 changes: 40 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 Expand Up @@ -1600,3 +1607,34 @@ def __init__(self):
self.register_command(NsfShortcutKeepCommand(), 'keep')
self.default_verb = 'list'


class NsfLoadAccessCacheCommand(base.ArgparseCommand):

def __init__(self):
parser = argparse.ArgumentParser(
prog='nsf-load-access',
description='Load access details for every NSF folder and record into the in-memory vault cache',
)
super().__init__(parser)

def add_arguments_to_parser(parser: argparse.ArgumentParser) -> None:
parser.add_argument('--folders', dest='load_folder', action='store_true',
help='Load access details for folders')
parser.add_argument('--records', dest='load_record', action='store_true',
help='Load access details for records')

def execute(self, context: KeeperParams, **kwargs):
vault = _require_vault(context)
load_folder = kwargs.get('load_folder', False)
load_record = kwargs.get('load_record', False)
if not load_folder and not load_record:
raise base.CommandError('At least one of --folders or --records is required')

def _run():
return nsf_management.load_nsf_access_details(vault)

loaded = _wrap_nsf('nsf-load-access', _run)
logger.info(
'Loaded access details for %d folder(s) and %d record(s) into the NSF cache',
loaded.get('folders', 0), loaded.get('records', 0))

2 changes: 2 additions & 0 deletions keepercli-package/src/keepercli/commands/pam/keeper_pam.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from .pam_rotation import PAMCreateRecordRotationCommand, PAMListRecordRotationCommand, PAMRouterGetRotationInfo, PAMRouterScriptCommand
from .pam_connection import PAMConnectionEditCommand
from .pam_rbi import PAMRbiEditCommand
from .pam_workflow import PAMWorkflowCommand
from .. import enterprise_utils
from .. import base
from ... import api
Expand Down Expand Up @@ -83,6 +84,7 @@ def __init__(self):
self.register_command(PAMRotationCommand(), 'rotation', 'r')
self.register_command(PAMConnectionCommand(), 'connection', 'n')
self.register_command(PAMRbiCommand(), 'rbi', 'b')
self.register_command(PAMWorkflowCommand(), 'workflow', 'w')


class PAMGatewayCommand(base.GroupCommand):
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
Loading
Loading