sovaria-cli 0.2.1__tar.gz → 0.2.2__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.
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/PKG-INFO +1 -1
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/__init__.py +1 -1
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/login.py +3 -3
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/utils/config.py +13 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/tests/test_config_profiles.py +7 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/tests/test_main_startup.py +1 -1
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/pyproject.toml +1 -1
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/.github/workflows/ci.yml +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/.github/workflows/publish.yml +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/.gitignore +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/.python-version +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/Makefile +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/README.md +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/__init__.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/__init__.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/admin.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/api.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/audit.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/auth_product.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/billing.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/chrono.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/context.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/data.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/db.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/deploy.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/governance.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/iam.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/init_cmd.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/keys.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/org.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/policy.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/project.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/realtime.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/scope.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/shell.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/sim.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/storage.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/commands/vector.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/main.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/utils/__init__.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/utils/api_client.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/utils/auth_store.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/utils/display.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/utils/migrations.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/src/utils/project_context.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/tests/test_auth_store_profiles.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/tests/test_cli_security.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/tests/test_cli_smoke_paths.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/apps/cli/tests/test_project_and_commands.py +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/pytest.ini +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/requirements-dev.txt +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/requirements.txt +0 -0
- {sovaria_cli-0.2.1 → sovaria_cli-0.2.2}/scripts/cli_sdk_happy_path.sh +0 -0
|
@@ -7,7 +7,7 @@ Phase 1 §9 Sprint 3.2:
|
|
|
7
7
|
|
|
8
8
|
Flow:
|
|
9
9
|
1. Generate code_verifier (43-128 random chars) + code_challenge = BASE64URL(SHA-256(verifier))
|
|
10
|
-
2. Open https://{
|
|
10
|
+
2. Open https://{console}/cli/oauth/authorize?response_type=code&...&code_challenge=...
|
|
11
11
|
3. Start a temporary HTTP callback server (configured via env variables).
|
|
12
12
|
4. Exchange authorization_code + verifier for token pair.
|
|
13
13
|
5. Persist tokens via auth_store.save_tokens().
|
|
@@ -33,7 +33,7 @@ import typer
|
|
|
33
33
|
|
|
34
34
|
from apps.cli.src.utils.api_client import CLIMfaRequiredError, _apply_login_response
|
|
35
35
|
from apps.cli.src.utils.auth_store import clear_mfa_pending, clear_tokens, load_mfa_pending, load_tokens, save_tokens
|
|
36
|
-
from apps.cli.src.utils.config import get_api_url
|
|
36
|
+
from apps.cli.src.utils.config import get_api_url, get_console_url
|
|
37
37
|
|
|
38
38
|
app = typer.Typer()
|
|
39
39
|
|
|
@@ -240,7 +240,7 @@ def _pkce_login(api_url: str, *, profile: str | None = None) -> None:
|
|
|
240
240
|
state = secrets.token_hex(16)
|
|
241
241
|
redirect_uri = _redirect_uri()
|
|
242
242
|
|
|
243
|
-
auth_url = f"{
|
|
243
|
+
auth_url = f"{get_console_url(profile)}/cli/oauth/authorize?" + urlencode(
|
|
244
244
|
{
|
|
245
245
|
"response_type": "code",
|
|
246
246
|
"client_id": "sovaria-cli",
|
|
@@ -76,6 +76,19 @@ def _profile_env_default(profile: str) -> str:
|
|
|
76
76
|
return _DEFAULT_API_URL or DEFAULT_CLOUD_API_URL
|
|
77
77
|
|
|
78
78
|
|
|
79
|
+
def get_console_url(profile: str | None = None) -> str:
|
|
80
|
+
"""Console origin used for browser OAuth (PKCE) flows."""
|
|
81
|
+
explicit = os.getenv("SOVARIA_CLI_CONSOLE_URL", "").strip()
|
|
82
|
+
if explicit:
|
|
83
|
+
return explicit.rstrip("/")
|
|
84
|
+
|
|
85
|
+
api_url = get_api_url(profile)
|
|
86
|
+
if "://api." in api_url:
|
|
87
|
+
return api_url.replace("://api.", "://console.", 1).rstrip("/")
|
|
88
|
+
|
|
89
|
+
return "https://console.sovaria.in"
|
|
90
|
+
|
|
91
|
+
|
|
79
92
|
def get_api_url(profile: str | None = None) -> str:
|
|
80
93
|
cfg = _load_yaml()
|
|
81
94
|
prof = profile or get_active_profile()
|
|
@@ -45,6 +45,13 @@ def test_get_api_url_defaults_to_cloud_when_unconfigured(
|
|
|
45
45
|
assert config.get_api_url("prod") == config.DEFAULT_CLOUD_API_URL
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
def test_get_console_url_defaults_from_api(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
|
|
49
|
+
monkeypatch.setattr(config, "_CONFIG_FILE", tmp_path / "missing.yaml")
|
|
50
|
+
monkeypatch.delenv("SOVARIA_CLI_CONSOLE_URL", raising=False)
|
|
51
|
+
monkeypatch.delenv("SOVARIA_CLI_DEFAULT_API_URL", raising=False)
|
|
52
|
+
assert config.get_console_url() == "https://console.sovaria.in"
|
|
53
|
+
|
|
54
|
+
|
|
48
55
|
def test_get_scope_coerces_string_profile(
|
|
49
56
|
monkeypatch: pytest.MonkeyPatch, tmp_path: Path
|
|
50
57
|
) -> None:
|
|
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
|