zen-cli 0.1.5__tar.gz → 0.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {zen_cli-0.1.5 → zen_cli-0.1.6}/PKG-INFO +1 -1
- {zen_cli-0.1.5 → zen_cli-0.1.6}/pyproject.toml +1 -1
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/auth.py +19 -10
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/login_support.py +3 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_device_login.py +43 -1
- {zen_cli-0.1.5 → zen_cli-0.1.6}/.gitignore +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/LICENSE +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/README.md +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/__main__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cli.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/activity/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/activity/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/activity/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/api.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/details.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/refresh.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/status.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/token.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/completion.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/login.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/logout.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/mcp.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/notification/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/notification/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/notification/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/use.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/use.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/profile/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/profile/init.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/create.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/cancel.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/duplicate.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/log.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/namespaces.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/use.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/wait.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/upgrade.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/delete.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/get.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/list.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/poweroff.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/poweron.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/restart.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/shutdown.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/use.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/wait.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/default.yaml +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/int.yaml +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/prod.yaml +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/stg.yaml +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/_init.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/_ut.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/context.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/profile.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/cli_options.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/cli_processor.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/cmd_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/config.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/context.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/data_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/dispatcher.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/extension.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/fn_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/fstore.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/jsondot.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/logger.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/profile.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/profile_store.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/recent.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/state.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/telemetry.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/template_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/timeutil.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/var_template.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/activity.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/api.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/credential.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/deployment.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/entitlement.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/group.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/network.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/notification.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/org.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/pool.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/provider.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/sag.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/task.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/vm.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/server.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/activity.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/api.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/broker/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/broker/entitlement.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/broker/pool_group.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/network.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/pool.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/provider.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/sag.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/vm.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/credential.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/deployment.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/notification.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/org.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/task.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/cli_options.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/client_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/csp.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/ez_client.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/init.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/mdc.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/payload_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/requtil.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/utils.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/zds_client.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/auth.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/payload.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/profile.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/task.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/test_utils.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/use_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/vm.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/exec_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/exit.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/param_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/patch_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/query_util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/readonly.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/versions.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/__init__.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_api.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_auth.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_completion.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_context.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_credential.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_deployment.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_entitlement.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_errors.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_group.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_io.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_login.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_logout.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_mcp.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_network.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_org.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_pool.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_profile.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_provider.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_root.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_sag.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_task.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_vm.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/util.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_auth_status.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_cli.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_mcp.py +0 -0
- {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_payload.py +0 -0
|
@@ -54,6 +54,8 @@ def refresh_oauth_token(
|
|
|
54
54
|
refresh_token = old_oauth_token.get("refresh_token")
|
|
55
55
|
if not refresh_token:
|
|
56
56
|
raise Exception("CSP auth refresh failed: missing refresh_token")
|
|
57
|
+
if not client_id:
|
|
58
|
+
client_id = old_oauth_token.get("client_id")
|
|
57
59
|
if not client_id:
|
|
58
60
|
from .login_support import identify_client_id
|
|
59
61
|
|
|
@@ -64,16 +66,23 @@ def refresh_oauth_token(
|
|
|
64
66
|
"refresh_token": refresh_token,
|
|
65
67
|
"client_id": client_id,
|
|
66
68
|
}
|
|
69
|
+
post_kwargs: dict[str, Any] = {
|
|
70
|
+
"headers": {"Content-Type": "application/x-www-form-urlencoded", "Accept": "application/json"},
|
|
71
|
+
"timeout": 20,
|
|
72
|
+
}
|
|
67
73
|
if client_secret:
|
|
68
74
|
data["client_secret"] = client_secret
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
# Confidential clients only. Native/device apps are OIDC_AUTH_METHOD_TYPE_NONE;
|
|
76
|
+
# HTTP Basic with an empty secret makes ZITADEL reject the refresh as invalid_client.
|
|
77
|
+
post_kwargs["auth"] = (client_id, client_secret)
|
|
78
|
+
resp = httpx2.post(url, data=data, **post_kwargs)
|
|
79
|
+
if not resp.is_success:
|
|
80
|
+
try:
|
|
81
|
+
body = resp.json()
|
|
82
|
+
desc = body.get("error_description") or body.get("error") or resp.text
|
|
83
|
+
except Exception:
|
|
84
|
+
desc = resp.text or str(resp.status_code)
|
|
85
|
+
raise Exception(f"CSP auth refresh failed: {desc}")
|
|
77
86
|
new_token = resp.json()
|
|
78
87
|
log.debug(f"New auth token: {new_token}")
|
|
79
88
|
if not new_token or not new_token.get("access_token"):
|
|
@@ -193,7 +202,7 @@ def _populate_token_with_cache(auth_config: Any, force_refresh: bool = False, ve
|
|
|
193
202
|
print("Provider: csp.")
|
|
194
203
|
try:
|
|
195
204
|
csp_url = _cfg_get(auth_config, "url")
|
|
196
|
-
client_id = _cfg_get(auth_config, "clientId", "client_id")
|
|
205
|
+
client_id = token.get("client_id") or _cfg_get(auth_config, "clientId", "client_id")
|
|
197
206
|
if not client_id and _cfg_get(auth_config, "device"):
|
|
198
207
|
from .login_support import identify_device_client_id
|
|
199
208
|
|
|
@@ -205,7 +214,7 @@ def _populate_token_with_cache(auth_config: Any, force_refresh: bool = False, ve
|
|
|
205
214
|
client_secret=_cfg_get(auth_config, "clientSecret", "client_secret"),
|
|
206
215
|
)
|
|
207
216
|
except Exception as e:
|
|
208
|
-
log.
|
|
217
|
+
log.warning("Failed to refresh OAuth token: %s", e)
|
|
209
218
|
token = None
|
|
210
219
|
else:
|
|
211
220
|
if verbose:
|
|
@@ -205,6 +205,8 @@ def do_oauth2_pkce(csp_url: str, client_id: str, org_id: str) -> Any:
|
|
|
205
205
|
)
|
|
206
206
|
|
|
207
207
|
log.debug("token: %s", token)
|
|
208
|
+
if isinstance(token, dict):
|
|
209
|
+
token.setdefault("client_id", client_id)
|
|
208
210
|
return token
|
|
209
211
|
|
|
210
212
|
|
|
@@ -295,6 +297,7 @@ def poll_device_access_token(
|
|
|
295
297
|
token = resp.json()
|
|
296
298
|
if not isinstance(token, dict) or not token.get("access_token"):
|
|
297
299
|
raise CtxpException("Device-code login failed: token response had no access_token.")
|
|
300
|
+
token.setdefault("client_id", client_id)
|
|
298
301
|
return token
|
|
299
302
|
err, desc = _oauth_error(resp)
|
|
300
303
|
if err == "authorization_pending":
|
|
@@ -5,7 +5,7 @@ from unittest.mock import patch
|
|
|
5
5
|
|
|
6
6
|
from zen_cli.cmds.login import _is_missing_session, _validate_auth_method
|
|
7
7
|
from zen_cli.ctxp import CtxpException
|
|
8
|
-
from zen_cli.sglib.auth import get_org_id_from_token, jwt_from_oauth_token
|
|
8
|
+
from zen_cli.sglib.auth import get_org_id_from_token, jwt_from_oauth_token, refresh_oauth_token
|
|
9
9
|
from zen_cli.sglib.login_support import (
|
|
10
10
|
_device_scope,
|
|
11
11
|
identify_daas_project_id,
|
|
@@ -109,6 +109,48 @@ class TestDeviceLogin(unittest.TestCase):
|
|
|
109
109
|
poll_device_access_token("https://csp.example", "dc", interval=1, expires_in=30)
|
|
110
110
|
self.assertIn("denied", str(ctx.exception).lower())
|
|
111
111
|
|
|
112
|
+
def test_public_client_refresh_does_not_send_http_basic(self) -> None:
|
|
113
|
+
captured: dict[str, object] = {}
|
|
114
|
+
|
|
115
|
+
def fake_post(url: str, **kwargs: object) -> _Resp:
|
|
116
|
+
captured["url"] = url
|
|
117
|
+
captured["data"] = kwargs.get("data")
|
|
118
|
+
captured["auth"] = kwargs.get("auth")
|
|
119
|
+
return _Resp(200, {"access_token": "new", "refresh_token": "rt2", "expires_in": 60})
|
|
120
|
+
|
|
121
|
+
with patch("httpx2.post", fake_post):
|
|
122
|
+
token = refresh_oauth_token(
|
|
123
|
+
{"refresh_token": "rt1", "client_id": "391271953115120140"},
|
|
124
|
+
"https://csp.example",
|
|
125
|
+
client_id="391271953115120140",
|
|
126
|
+
)
|
|
127
|
+
self.assertEqual(token["access_token"], "new")
|
|
128
|
+
self.assertIsNone(captured.get("auth"))
|
|
129
|
+
self.assertEqual(
|
|
130
|
+
captured.get("data"),
|
|
131
|
+
{
|
|
132
|
+
"grant_type": "refresh_token",
|
|
133
|
+
"refresh_token": "rt1",
|
|
134
|
+
"client_id": "391271953115120140",
|
|
135
|
+
},
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
def test_refresh_uses_client_id_stamped_on_token(self) -> None:
|
|
139
|
+
captured: dict[str, object] = {}
|
|
140
|
+
|
|
141
|
+
def fake_post(_url: str, **kwargs: object) -> _Resp:
|
|
142
|
+
captured["data"] = kwargs.get("data")
|
|
143
|
+
return _Resp(200, {"access_token": "new", "expires_in": 60})
|
|
144
|
+
|
|
145
|
+
with patch("httpx2.post", fake_post):
|
|
146
|
+
refresh_oauth_token(
|
|
147
|
+
{"refresh_token": "rt1", "client_id": "391271953115120140"},
|
|
148
|
+
"https://csp.example",
|
|
149
|
+
)
|
|
150
|
+
data = captured.get("data")
|
|
151
|
+
assert isinstance(data, dict)
|
|
152
|
+
self.assertEqual(data.get("client_id"), "391271953115120140")
|
|
153
|
+
|
|
112
154
|
def test_org_id_from_opaque_access_and_id_token(self) -> None:
|
|
113
155
|
oauth = {
|
|
114
156
|
"access_token": "opaque-not-a-jwt",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|