Skip to content
Open
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
30 changes: 25 additions & 5 deletions keepercli-package/src/keepercli/commands/password_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from ..params import KeeperParams

from keepersdk import utils
from keepersdk.vault import vault_record, vault_extensions
from keepersdk.vault import vault_record, vault_extensions, vault_types, vault_utils


logger = api.get_logger()
Expand Down Expand Up @@ -105,6 +105,27 @@ def _resolve_folder_uid(self, context: KeeperParams, path_or_uid: Optional[str])

return folder.folder_uid or ''

def _get_record_uids_in_folder_tree(self, context: KeeperParams, folder_uid: str) -> set:
"""Return record UIDs under folder_uid, or entire vault when folder_uid is empty."""
record_uids: set = set()

def add_records(folder: vault_types.Folder) -> None:
record_uids.update(folder.records)

Copy link
Copy Markdown

@sali-ks sali-ks May 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

avoids repeating the function call. like


folder = context.vault.vault_data.root_folder

if folder_uid:
   folder = context.vault.vault_data.get_folder(folder_uid)
   if not folder:
       raise base.CommandError(f'Folder {folder_uid} not found')

vault_utils.traverse_folder_tree(
   context.vault.vault_data,
   folder,
   add_records
)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed

folder = context.vault.vault_data.root_folder
if folder_uid:
folder = context.vault.vault_data.get_folder(folder_uid)
if not folder:
raise base.CommandError(f'Folder {folder_uid} not found')

vault_utils.traverse_folder_tree(
context.vault.vault_data,
folder,
add_records
)

return record_uids

def _extract_password_from_record(self, record: Any) -> str:
"""Extract password from a vault record.

Expand Down Expand Up @@ -234,9 +255,8 @@ def execute(self, context: KeeperParams, **kwargs: Any) -> Any:

path_or_uid = kwargs.get('folder')
folder_uid = self._resolve_folder_uid(context, path_or_uid)

folder = context.vault.vault_data.get_folder(folder_uid)
records = folder.records
record_uids = self._get_record_uids_in_folder_tree(context, folder_uid)

report_table = []
report_header = ['record_uid', 'title', 'description', 'length', 'lower', 'upper', 'digits', 'special']
breach_watch_plugin = context.vault.breach_watch_plugin()
Expand All @@ -250,7 +270,7 @@ def execute(self, context: KeeperParams, **kwargs: Any) -> Any:
password_usage_count = {}

output_format = kwargs.get('format')
for record_uid in records:
for record_uid in record_uids:
record = context.vault.vault_data.load_record(record_uid)
if not record or record.version not in SUPPORTED_RECORD_VERSIONS:
continue
Expand Down