mirror of
https://github.com/headroomlabs-ai/headroom.git
synced 2026-08-27 14:17:10 -04:00
Route GitHub Copilot CLI subscription traffic through the Headroom OpenAI-compatible proxy path and resolve the account-specific Copilot API endpoint before launch. Add source-aware Copilot token discovery for explicit Copilot env vars, macOS Keychain, Windows Credential Manager, Linux Secret Service, credential files, and generic GitHub fallbacks. Validate subscription candidates against GitHub Copilot user metadata so generic GH_TOKEN/GITHUB_TOKEN values do not shadow Copilot CLI auth. Document the subscription command and platform status in README: macOS Keychain auth reuse has been smoke-tested, while Windows, Linux, Docker, and CI auth-discovery paths still need real OS validation. Tests: .venv/bin/python -m pytest tests/test_copilot_auth.py tests/test_copilot_macos_keychain.py tests/test_copilot_linux_secret.py tests/test_cli/test_wrap_copilot.py tests/test_cli/test_wrap_persistent.py tests/test_proxy_copilot_auth_hooks.py
68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from types import SimpleNamespace
|
|
|
|
from headroom import copilot_linux_secret
|
|
|
|
|
|
def test_read_copilot_oauth_token_uses_secret_tool(monkeypatch) -> None:
|
|
calls: list[list[str]] = []
|
|
|
|
def fake_run(command, **kwargs): # noqa: ANN001, ANN003
|
|
calls.append(command)
|
|
assert kwargs["capture_output"] is True
|
|
return SimpleNamespace(returncode=0, stdout="gho-secret\n")
|
|
|
|
monkeypatch.setattr(copilot_linux_secret.sys, "platform", "linux")
|
|
monkeypatch.setattr(copilot_linux_secret, "_read_copilot_config_login", lambda: "octo")
|
|
monkeypatch.setattr(copilot_linux_secret.subprocess, "run", fake_run)
|
|
|
|
assert copilot_linux_secret.read_copilot_oauth_token(host="github.com") == "gho-secret"
|
|
assert calls[0] == ["secret-tool", "lookup", "service", "copilot-cli"]
|
|
|
|
|
|
def test_read_copilot_oauth_token_returns_none_off_linux(monkeypatch) -> None:
|
|
monkeypatch.setattr(copilot_linux_secret.sys, "platform", "darwin")
|
|
|
|
assert copilot_linux_secret.read_copilot_oauth_token() is None
|
|
|
|
|
|
def test_candidate_secret_tool_commands_include_login_specific_lookup() -> None:
|
|
commands = copilot_linux_secret._candidate_secret_tool_commands(
|
|
"secret-tool",
|
|
"github.com",
|
|
"octo",
|
|
)
|
|
|
|
assert [
|
|
"secret-tool",
|
|
"lookup",
|
|
"service",
|
|
"copilot-cli",
|
|
"account",
|
|
"https://github.com:octo",
|
|
] in commands
|
|
|
|
|
|
def test_read_copilot_oauth_token_tries_until_match(monkeypatch) -> None:
|
|
expected = [
|
|
"secret-tool",
|
|
"lookup",
|
|
"service",
|
|
"copilot-cli",
|
|
"account",
|
|
"https://github.com:octo",
|
|
]
|
|
calls: list[list[str]] = []
|
|
|
|
def fake_run(command, **kwargs): # noqa: ANN001, ANN003
|
|
calls.append(command)
|
|
stdout = "gho-secret\n" if command == expected else ""
|
|
return SimpleNamespace(returncode=0, stdout=stdout)
|
|
|
|
monkeypatch.setattr(copilot_linux_secret.sys, "platform", "linux")
|
|
monkeypatch.setattr(copilot_linux_secret, "_read_copilot_config_login", lambda: "octo")
|
|
monkeypatch.setattr(copilot_linux_secret.subprocess, "run", fake_run)
|
|
|
|
assert copilot_linux_secret.read_copilot_oauth_token(host="github.com") == "gho-secret"
|
|
assert expected in calls
|