diff --git a/keepercommander/commands/folder.py b/keepercommander/commands/folder.py index 9324ad146..f857b9f43 100644 --- a/keepercommander/commands/folder.py +++ b/keepercommander/commands/folder.py @@ -581,6 +581,10 @@ def execute(self, params, **kwargs): params.environment_variables[LAST_FOLDER_UID] = folder_uid if request['folder_type'] == 'shared_folder': params.environment_variables[LAST_SHARED_FOLDER_UID] = folder_uid + parent_path = get_folder_path(params, base_folder.uid) if base_folder.uid else '' + path = f'{parent_path}{name}' + response_data = {'folder_uid': folder_uid, 'name': name, 'path': path} + logging.info(json.dumps(response_data)) return folder_uid diff --git a/keepercommander/commands/record.py b/keepercommander/commands/record.py index 87d863f85..829a5f5fa 100644 --- a/keepercommander/commands/record.py +++ b/keepercommander/commands/record.py @@ -277,9 +277,11 @@ def execute(self, params, **kwargs): admins = api.get_share_admins_for_shared_folder(params, uid) sf = api.get_shared_folder(params, uid) if fmt == 'json': + path = get_folder_path(params, sf.shared_folder_uid, delimiter=os.sep) if sf.shared_folder_uid else '' sfo = { "shared_folder_uid": sf.shared_folder_uid, "name": sf.name, + "path": path, "manage_users": sf.default_manage_users, "manage_records": sf.default_manage_records, "can_edit": sf.default_can_edit, @@ -291,17 +293,25 @@ def execute(self, params, **kwargs): 'can_edit': r['can_edit'], 'can_share': r['can_share'] } for r in sf.records] + def _format_expiration(expiration_value): + if expiration_value is None or expiration_value <= 0: + return 'never' + return datetime.datetime.fromtimestamp(expiration_value // 1000).isoformat() if sf.users: sfo['users'] = [{ 'username': u['username'], + 'user_id': u.get('account_uid'), 'manage_records': u['manage_records'], - 'manage_users': u['manage_users'] + 'manage_users': u['manage_users'], + 'expiration': _format_expiration(u.get('expiration')) } for u in sf.users] if sf.teams: sfo['teams'] = [{ 'name': t['name'], + 'team_uid': t.get('team_uid'), 'manage_records': t['manage_records'], - 'manage_users': t['manage_users'] + 'manage_users': t['manage_users'], + 'expiration': _format_expiration(t.get('expiration')) } for t in sf.teams] if admins: diff --git a/keepercommander/service/util/parse_keeper_response.py b/keepercommander/service/util/parse_keeper_response.py index 7f8f004f1..0833f5a3a 100644 --- a/keepercommander/service/util/parse_keeper_response.py +++ b/keepercommander/service/util/parse_keeper_response.py @@ -486,27 +486,41 @@ def _parse_this_device_command(response: str) -> Dict[str, Any]: @staticmethod def _parse_mkdir_command(response: str) -> Dict[str, Any]: - """Parse 'mkdir' command output to extract folder UID.""" + """Parse 'mkdir' command output to extract folder UID, path, and name.""" response_str = response.strip() - - # Success case - try to extract UID + lines = [ln.strip() for ln in response_str.split('\n') if ln.strip()] + result = { "status": "success", "command": "mkdir", "data": None } - - if re.match(r'^[a-zA-Z0-9_-]+$', response_str): + + for line in lines: + try: + data = json.loads(line) + if isinstance(data, dict) and 'folder_uid' in data: + result["data"] = { + "folder_uid": data["folder_uid"], + "path": data.get("path"), + "name": data.get("name") + } + return result + except (json.JSONDecodeError, TypeError): + pass + + last_line = lines[-1] if lines else response_str + if re.match(r'^[a-zA-Z0-9_-]+$', last_line): result["data"] = { - "folder_uid": response_str + "folder_uid": last_line } else: - uid_match = re.search(r'folder_uid=([a-zA-Z0-9_-]+)', response_str) + uid_match = re.search(r'folder_uid=([a-zA-Z0-9_-]+)', last_line) if uid_match: result["data"] = { "folder_uid": uid_match.group(1) } - + return result @staticmethod