From 259c5c4afb632ca8819bf9c1e8d436b7e502914e Mon Sep 17 00:00:00 2001 From: Michael Lam Date: Mon, 4 May 2026 14:07:16 -0700 Subject: [PATCH] feat: add Codex OAuth onboarding flow --- api/oauth.py | 546 +++++++++++++----- api/onboarding.py | 5 +- api/routes.py | 74 ++- docs/pr-media/1362/codex-oauth-onboarding.png | Bin 0 -> 154809 bytes static/onboarding.js | 175 +++--- .../test_issue1362_codex_oauth_onboarding.py | 182 ++++++ 6 files changed, 720 insertions(+), 262 deletions(-) create mode 100644 docs/pr-media/1362/codex-oauth-onboarding.png create mode 100644 tests/test_issue1362_codex_oauth_onboarding.py diff --git a/api/oauth.py b/api/oauth.py index 4cf4f180..63eb1ed2 100644 --- a/api/oauth.py +++ b/api/oauth.py @@ -1,196 +1,428 @@ -"""In-app OAuth flow implementations for providers like OpenAI Codex. +"""In-app OAuth flow implementations for onboarding. -Uses only stdlib (urllib.request, json, time) — no external dependencies. -Credentials are stored in ~/.hermes/auth.json under the credential_pool. +The browser receives only WebUI-local flow metadata (flow_id, user_code, +verification_uri, high-level status). Provider device/auth codes and OAuth +tokens stay server-side and are persisted to the active Hermes profile's +``auth.json`` credential_pool. """ +from __future__ import annotations + import json import logging +import os +import stat +import threading import time import uuid -import urllib.request -import urllib.parse import urllib.error +import urllib.parse +import urllib.request +from datetime import datetime, timezone from pathlib import Path +from typing import Any logger = logging.getLogger(__name__) +# Compatibility for older helper tests and self-heal code that import these. AUTH_JSON_PATH = Path.home() / ".hermes" / "auth.json" -# ── Codex OAuth constants (from hermes_cli/auth.py) ── -CODEX_CLIENT_ID = "pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh" -CODEX_AUTH_URL = "https://auth.openai.com/oauth/device/authorize" -CODEX_TOKEN_URL = "https://auth.openai.com/oauth/token" -CODEX_SCOPE = "openid profile email offline_access" -CODEX_GRANT_TYPE_DEVICE = "urn:ietf:params:oauth:grant-type:device_code" +CODEX_ISSUER = "https://auth.openai.com" +CODEX_CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann" +CODEX_VERIFICATION_URI = f"{CODEX_ISSUER}/codex/device" +CODEX_USER_CODE_URL = f"{CODEX_ISSUER}/api/accounts/deviceauth/usercode" +CODEX_DEVICE_TOKEN_URL = f"{CODEX_ISSUER}/api/accounts/deviceauth/token" +CODEX_TOKEN_URL = f"{CODEX_ISSUER}/oauth/token" +CODEX_REDIRECT_URI = f"{CODEX_ISSUER}/deviceauth/callback" +CODEX_BASE_URL = "https://chatgpt.com/backend-api/codex" +CODEX_FLOW_MAX_WAIT_SECONDS = 15 * 60 + +_ALLOWED_ONBOARDING_OAUTH_PROVIDERS = {"openai-codex"} +_REJECTED_ONBOARDING_OAUTH_PROVIDERS = { + "anthropic", + "claude", + "claude-code", + "nous", + "qwen-oauth", + "gemini-cli", + "google-gemini-cli", + "minimax", + "minimax-oauth", + "copilot", + "copilot-acp", +} + +_OAUTH_FLOWS: dict[str, dict[str, Any]] = {} +_OAUTH_FLOWS_LOCK = threading.Lock() -# ── auth.json helpers ── +def _get_active_hermes_home() -> Path: + try: + from api.profiles import get_active_hermes_home -def _read_auth_json(): - """Read auth.json and return parsed dict, or empty dict.""" - if AUTH_JSON_PATH.exists(): + return Path(get_active_hermes_home()) + except Exception: + return Path.home() / ".hermes" + + +# ── legacy auth.json helpers ──────────────────────────────────────────────── + +def _read_auth_json(auth_path: Path | None = None) -> dict[str, Any]: + """Read auth.json and return parsed dict, or an empty compatible store.""" + path = auth_path or AUTH_JSON_PATH + if path.exists(): try: - return json.loads(AUTH_JSON_PATH.read_text()) + loaded = json.loads(path.read_text(encoding="utf-8")) + return loaded if isinstance(loaded, dict) else {} except json.JSONDecodeError as exc: - logger.warning("Failed to parse %s: %s", AUTH_JSON_PATH, exc) + logger.warning("Failed to parse %s: %s", path, exc) return {} return {} def read_auth_json(): - """Public wrapper for _read_auth_json. - - Used by the streaming layer's credential self-heal logic (#1401) to - re-read credentials without coupling to the private helper. - """ + """Public wrapper for streaming credential self-heal code.""" return _read_auth_json() -def _write_auth_json(data): - """Atomically write auth.json via temp-file rename. +def _write_auth_json(data: dict[str, Any], auth_path: Path | None = None) -> Path: + """Atomically write auth.json with owner-only permissions. - SECURITY: auth.json contains OAuth access/refresh tokens. ``tmp.replace()`` - preserves the temp file's mode (created with the process umask, typically - 0644 or 0664), NOT the prior auth.json mode. Without an explicit chmod, - tokens land world-readable on shared systems. Set 0600 BEFORE the rename - so there is no window where the final file is world-readable. - (Opus pre-release advisor finding.) + OAuth access/refresh tokens live in this file. The temp file is chmod 0600 + before rename so the final path never inherits a permissive process umask. """ - import os, stat - AUTH_JSON_PATH.parent.mkdir(parents=True, exist_ok=True) - tmp = AUTH_JSON_PATH.with_suffix('.tmp') - tmp.write_text(json.dumps(data, indent=2, ensure_ascii=False)) + path = auth_path or AUTH_JSON_PATH + path.parent.mkdir(parents=True, exist_ok=True) + tmp = path.with_name(f"{path.name}.tmp.{os.getpid()}.{uuid.uuid4().hex}") try: - tmp.chmod(0o600) - except OSError as e: - # Best-effort: if chmod fails (e.g. on a filesystem that doesn't - # support POSIX modes), don't abort. The startup permission fixer - # in api.startup will sweep auth.json on the next process start. - logger.warning("Failed to chmod 0600 on %s: %s", tmp, e) - tmp.replace(AUTH_JSON_PATH) + tmp.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + try: + tmp.chmod(0o600) + except OSError as exc: + logger.warning("Failed to chmod 0600 on %s: %s", tmp, exc) + tmp.replace(path) + try: + path.chmod(stat.S_IRUSR | stat.S_IWUSR) + except OSError: + pass + return path + finally: + try: + if tmp.exists(): + tmp.unlink() + except OSError: + pass -# ── Codex device-code flow ── +def _now_iso() -> str: + return datetime.now(timezone.utc).isoformat().replace("+00:00", "Z") -def start_codex_device_code(): - """Start Codex OAuth device-code flow. - Returns dict: { device_code, user_code, verification_uri, expires_in, interval } - Raises RuntimeError on network error. - """ - params = { - "client_id": CODEX_CLIENT_ID, - "scope": CODEX_SCOPE, +def _persist_codex_credentials(hermes_home: Path, token_data: dict[str, Any]) -> Path: + """Persist Codex OAuth credentials to active-profile auth.json.""" + access_token = str(token_data.get("access_token") or "").strip() + refresh_token = str(token_data.get("refresh_token") or "").strip() + if not access_token: + raise RuntimeError("Codex token exchange did not return an access_token") + + auth_path = Path(hermes_home) / "auth.json" + auth = _read_auth_json(auth_path) + auth.setdefault("version", 1) + pool = auth.setdefault("credential_pool", {}) + if not isinstance(pool, dict): + pool = {} + auth["credential_pool"] = pool + entries = pool.setdefault("openai-codex", []) + if not isinstance(entries, list): + entries = [] + pool["openai-codex"] = entries + + now = _now_iso() + entry = None + for candidate in entries: + if isinstance(candidate, dict) and candidate.get("source") == "manual:device_code": + entry = candidate + break + if entry is None: + entry = { + "id": "codex-oauth-" + uuid.uuid4().hex[:12], + "label": "Codex OAuth", + "auth_type": "oauth", + "priority": 0, + "source": "manual:device_code", + "base_url": CODEX_BASE_URL, + "created_at": now, + } + entries.insert(0, entry) + + entry.update( + { + "label": "Codex OAuth", + "auth_type": "oauth", + "priority": 0, + "source": "manual:device_code", + "access_token": access_token, + "refresh_token": refresh_token, + "base_url": CODEX_BASE_URL, + "last_refresh": now, + "updated_at": now, + } + ) + auth["updated_at"] = now + path = _write_auth_json(auth, auth_path) + + try: + from api.config import invalidate_credential_pool_cache + + invalidate_credential_pool_cache("openai-codex") + except Exception: + logger.debug("Failed to invalidate openai-codex credential cache", exc_info=True) + + return path + + +# Backward-compatible wrapper used by older code/tests. +def _save_codex_credentials(token_data): + return _persist_codex_credentials(_get_active_hermes_home(), token_data) + + +# ── Codex protocol ────────────────────────────────────────────────────────── + +def _json_request(url: str, payload: dict[str, Any], *, form: bool = False) -> dict[str, Any]: + if form: + data = urllib.parse.urlencode(payload).encode("utf-8") + content_type = "application/x-www-form-urlencoded" + else: + data = json.dumps(payload).encode("utf-8") + content_type = "application/json" + req = urllib.request.Request( + url, + data=data, + method="POST", + headers={"Content-Type": content_type, "Accept": "application/json"}, + ) + with urllib.request.urlopen(req, timeout=15) as resp: + return json.loads(resp.read().decode("utf-8")) + + +def _request_codex_user_code() -> dict[str, Any]: + return _json_request(CODEX_USER_CODE_URL, {"client_id": CODEX_CLIENT_ID}) + + +def _poll_codex_authorization(device_auth_id: str, user_code: str) -> dict[str, Any] | None: + try: + return _json_request( + CODEX_DEVICE_TOKEN_URL, + {"device_auth_id": device_auth_id, "user_code": user_code}, + ) + except urllib.error.HTTPError as exc: + if exc.code in (403, 404): + return None + raise + + +def _exchange_codex_authorization(authorization_code: str, code_verifier: str) -> dict[str, Any]: + return _json_request( + CODEX_TOKEN_URL, + { + "grant_type": "authorization_code", + "code": authorization_code, + "redirect_uri": CODEX_REDIRECT_URI, + "client_id": CODEX_CLIENT_ID, + "code_verifier": code_verifier, + }, + form=True, + ) + + +def _public_start_payload(flow_id: str, flow: dict[str, Any]) -> dict[str, Any]: + return { + "ok": True, + "provider": "openai-codex", + "flow_id": flow_id, + "status": flow.get("status", "pending"), + "verification_uri": CODEX_VERIFICATION_URI, + "user_code": flow.get("user_code", ""), + "expires_at": flow.get("expires_at"), + "poll_interval_seconds": flow.get("poll_interval_seconds", 5), } - data = urllib.parse.urlencode(params).encode() - req = urllib.request.Request(CODEX_AUTH_URL, data=data, method="POST") - req.add_header("Content-Type", "application/x-www-form-urlencoded") + + +def _public_status_payload(flow_id: str, flow: dict[str, Any]) -> dict[str, Any]: + payload = { + "ok": True, + "provider": "openai-codex", + "flow_id": flow_id, + "status": flow.get("status", "error"), + } + if flow.get("status") == "error" and flow.get("error"): + payload["error"] = str(flow.get("error"))[:200] + return payload + + +def _drop_sensitive_flow_fields(flow: dict[str, Any]) -> None: + for key in ( + "device_auth_id", + "authorization_code", + "code_verifier", + "access_token", + "refresh_token", + "token_data", + ): + flow.pop(key, None) + + +def _cleanup_oauth_flows(now: float | None = None) -> None: + now = now or time.time() + cutoff = now - 300 + with _OAUTH_FLOWS_LOCK: + for fid, flow in list(_OAUTH_FLOWS.items()): + status = flow.get("status") + if status == "pending" and float(flow.get("expires_at") or 0) <= now: + flow["status"] = "expired" + _drop_sensitive_flow_fields(flow) + if status in {"success", "expired", "cancelled", "error"} and float(flow.get("updated_at") or 0) < cutoff: + _OAUTH_FLOWS.pop(fid, None) + + +def _spawn_codex_oauth_worker(flow_id: str) -> None: + worker = threading.Thread(target=_run_codex_oauth_worker, args=(flow_id,), daemon=True) + worker.start() + + +def _set_flow_status(flow_id: str, status: str, **fields: Any) -> None: + with _OAUTH_FLOWS_LOCK: + flow = _OAUTH_FLOWS.get(flow_id) + if not flow: + return + flow["status"] = status + flow["updated_at"] = time.time() + flow.update(fields) + if status in {"success", "expired", "cancelled", "error"}: + _drop_sensitive_flow_fields(flow) + + +def _run_codex_oauth_worker(flow_id: str) -> None: + while True: + with _OAUTH_FLOWS_LOCK: + flow = dict(_OAUTH_FLOWS.get(flow_id) or {}) + if not flow: + return + status = flow.get("status") + if status != "pending": + return + if float(flow.get("expires_at") or 0) <= time.time(): + _set_flow_status(flow_id, "expired") + return + + time.sleep(max(1, int(flow.get("poll_interval_seconds") or 5))) + + with _OAUTH_FLOWS_LOCK: + live = dict(_OAUTH_FLOWS.get(flow_id) or {}) + if live.get("status") != "pending": + return + try: + code_resp = _poll_codex_authorization( + str(live.get("device_auth_id") or ""), + str(live.get("user_code") or ""), + ) + if code_resp is None: + continue + authorization_code = str(code_resp.get("authorization_code") or "").strip() + code_verifier = str(code_resp.get("code_verifier") or "").strip() + if not authorization_code or not code_verifier: + raise RuntimeError("Device auth response missing authorization_code or code_verifier") + tokens = _exchange_codex_authorization(authorization_code, code_verifier) + _persist_codex_credentials(Path(live["hermes_home"]), tokens) + _set_flow_status(flow_id, "success") + return + except Exception as exc: + logger.warning("Codex OAuth onboarding flow failed: %s", exc) + _set_flow_status(flow_id, "error", error=str(exc)) + return + + +def start_onboarding_oauth_flow(body: dict[str, Any] | None) -> dict[str, Any]: + """Start the supported onboarding OAuth flow. + + Currently v1 intentionally supports only OpenAI Codex. Other providers are + rejected instead of silently falling back to terminal-first setup. + """ + _cleanup_oauth_flows() + provider = str((body or {}).get("provider") or "").strip().lower() + if provider not in _ALLOWED_ONBOARDING_OAUTH_PROVIDERS: + if provider in _REJECTED_ONBOARDING_OAUTH_PROVIDERS or provider: + raise ValueError("Only OpenAI Codex OAuth is supported in WebUI onboarding right now") + raise ValueError("provider is required") + + hermes_home = _get_active_hermes_home() try: - with urllib.request.urlopen(req, timeout=15) as resp: - return json.loads(resp.read().decode()) - except Exception as e: - raise RuntimeError(f"Failed to start Codex OAuth: {e}") from e + device = _request_codex_user_code() + except Exception as exc: + raise RuntimeError(f"Failed to start Codex OAuth: {exc}") from exc + + user_code = str(device.get("user_code") or "").strip() + device_auth_id = str(device.get("device_auth_id") or "").strip() + if not user_code or not device_auth_id: + raise RuntimeError("Device code response missing required fields") + + interval = max(3, int(device.get("interval") or 5)) + expires_in = int(device.get("expires_in") or CODEX_FLOW_MAX_WAIT_SECONDS) + expires_at = time.time() + min(max(expires_in, 60), CODEX_FLOW_MAX_WAIT_SECONDS) + flow_id = uuid.uuid4().hex + flow = { + "provider": "openai-codex", + "status": "pending", + "device_auth_id": device_auth_id, + "user_code": user_code, + "expires_at": expires_at, + "poll_interval_seconds": interval, + "hermes_home": str(hermes_home), + "created_at": time.time(), + "updated_at": time.time(), + } + with _OAUTH_FLOWS_LOCK: + _OAUTH_FLOWS[flow_id] = flow + _spawn_codex_oauth_worker(flow_id) + return _public_start_payload(flow_id, flow) + + +def poll_onboarding_oauth_flow(flow_id: str) -> dict[str, Any]: + _cleanup_oauth_flows() + fid = str(flow_id or "").strip() + if not fid: + raise ValueError("flow_id is required") + with _OAUTH_FLOWS_LOCK: + flow = _OAUTH_FLOWS.get(fid) + if not flow: + raise KeyError("OAuth flow not found") + if flow.get("status") == "pending" and float(flow.get("expires_at") or 0) <= time.time(): + flow["status"] = "expired" + flow["updated_at"] = time.time() + _drop_sensitive_flow_fields(flow) + return _public_status_payload(fid, dict(flow)) + + +def cancel_onboarding_oauth_flow(body: dict[str, Any] | None) -> dict[str, Any]: + fid = str((body or {}).get("flow_id") or "").strip() + if not fid: + raise ValueError("flow_id is required") + with _OAUTH_FLOWS_LOCK: + flow = _OAUTH_FLOWS.get(fid) + if not flow: + return {"ok": True, "provider": "openai-codex", "flow_id": fid, "status": "cancelled"} + if flow.get("status") == "pending": + flow["status"] = "cancelled" + flow["updated_at"] = time.time() + _drop_sensitive_flow_fields(flow) + return _public_status_payload(fid, dict(flow)) + + +# Backward-compatible names from the abandoned spike. They intentionally do not +# expose provider device secrets to callers anymore. +def start_codex_device_code(): + return start_onboarding_oauth_flow({"provider": "openai-codex"}) def poll_codex_token(device_code, interval=5): - """Poll for Codex OAuth token. Generator that yields status dicts. - - Yields: - {"status": "polling", "attempt": N, "max_attempts": 40} - {"status": "success", "credentials": {...}} - {"status": "error", "error": "..."} - """ - params = { - "grant_type": CODEX_GRANT_TYPE_DEVICE, - "device_code": device_code, - "client_id": CODEX_CLIENT_ID, - } - data = urllib.parse.urlencode(params).encode() - max_attempts = 40 # 40 * 5 = 200s max - - for attempt in range(max_attempts): - yield {"status": "polling", "attempt": attempt + 1, "max_attempts": max_attempts} - - req = urllib.request.Request(CODEX_TOKEN_URL, data=data, method="POST") - req.add_header("Content-Type", "application/x-www-form-urlencoded") - try: - with urllib.request.urlopen(req, timeout=15) as resp: - token_data = json.loads(resp.read().decode()) - # Save to auth.json credential_pool - _save_codex_credentials(token_data) - yield {"status": "success", "credentials": { - "access_token": "***", - "refresh_token": "***", - "token_type": token_data.get("token_type"), - "expires_in": token_data.get("expires_in"), - }} - return - except urllib.error.HTTPError as e: - body = e.read().decode() - try: - err_data = json.loads(body) - error = err_data.get("error", "") - if error == "authorization_pending": - time.sleep(interval) - continue - elif error == "slow_down": - time.sleep(interval + 5) - continue - elif error == "expired_token": - yield {"status": "error", "error": "Device code expired. Please try again."} - return - else: - yield {"status": "error", "error": err_data.get("error_description", error)} - return - except Exception: - yield {"status": "error", "error": body[:200]} - return - except Exception as e: - yield {"status": "error", "error": str(e)} - return - - yield {"status": "error", "error": "OAuth flow timed out. Please try again."} - - -def _save_codex_credentials(token_data): - """Save Codex OAuth credentials to auth.json credential_pool.""" - auth = _read_auth_json() - if "credential_pool" not in auth: - auth["credential_pool"] = {} - pool = auth["credential_pool"] - - if "openai-codex" not in pool: - pool["openai-codex"] = [] - - # Check if an oauth_device entry already exists (update in place) - updated = False - _now_iso = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) - for entry in pool["openai-codex"]: - if entry.get("source") == "oauth_device": - entry["access_token"] = token_data.get("access_token", "") - entry["refresh_token"] = token_data.get("refresh_token", "") - entry["auth_type"] = "oauth" - entry["updated_at"] = _now_iso - updated = True - break - - if not updated: - existing_ids = {e["id"] for e in pool.get("openai-codex", [])} - for _ in range(3): # retry on collision - cred_id = "codex-oauth-" + uuid.uuid4().hex[:8] - if cred_id not in existing_ids: - break - pool["openai-codex"].append({ - "id": cred_id, - "label": "Codex OAuth", - "auth_type": "oauth", - "source": "oauth_device", - "access_token": token_data.get("access_token", ""), - "refresh_token": token_data.get("refresh_token", ""), - "priority": 1, - "created_at": _now_iso, - }) - - auth["updated_at"] = _now_iso - _write_auth_json(auth) + yield {"status": "error", "error": "Use /api/onboarding/oauth/poll with flow_id"} diff --git a/api/onboarding.py b/api/onboarding.py index b572c542..af9d82ce 100644 --- a/api/onboarding.py +++ b/api/onboarding.py @@ -185,8 +185,9 @@ _PROVIDER_CATEGORIES = [ ] _UNSUPPORTED_PROVIDER_NOTE = ( - "OAuth and advanced provider flows such as Nous Portal, OpenAI Codex, and GitHub " - "Copilot are still terminal-first. Use `hermes model` for those flows." + "Advanced provider flows such as Nous Portal and GitHub Copilot are still " + "terminal-first. OpenAI Codex can be authenticated in this onboarding flow " + "when your Hermes config selects the openai-codex provider." ) diff --git a/api/routes.py b/api/routes.py index 47a2b12e..1be8a3ae 100644 --- a/api/routes.py +++ b/api/routes.py @@ -1252,6 +1252,11 @@ from api.onboarding import ( complete_onboarding, probe_provider_endpoint, ) +from api.oauth import ( + cancel_onboarding_oauth_flow, + poll_onboarding_oauth_flow, + start_onboarding_oauth_flow, +) # Approval system (optional -- graceful fallback if agent not available) try: @@ -2279,38 +2284,19 @@ def handle_get(handler, parsed) -> bool: return j(handler, {"error": "not found"}, status=404) return _handle_clarify_inject(handler, parsed) - # ── OAuth (Codex device-code) ── - if parsed.path == "/api/oauth/codex/start": - """Start Codex device-code OAuth flow. Returns user_code + verification_uri.""" - try: - from api.oauth import start_codex_device_code - result = start_codex_device_code() - return j(handler, result) - except Exception as e: - return j(handler, {"error": str(e)}, status=500) - - if parsed.path == "/api/oauth/codex/poll": - """SSE endpoint for polling Codex OAuth token.""" + if parsed.path == "/api/onboarding/oauth/poll": qs = parse_qs(parsed.query) - device_code = qs.get("device_code", [""])[0] - if not device_code: - return j(handler, {"error": "device_code required"}, status=400) - handler.send_response(200) - handler.send_header("Content-Type", "text/event-stream") - handler.send_header("Cache-Control", "no-cache") - handler.send_header("Connection", "keep-alive") - handler.end_headers() + flow_id = qs.get("flow_id", [""])[0] try: - from api.oauth import poll_codex_token - for event in poll_codex_token(device_code): - handler.wfile.write(f"data: {json.dumps(event)}\n\n".encode()) - handler.wfile.flush() - if event.get("status") in ("success", "error"): - break - except Exception as e: - handler.wfile.write(f"data: {json.dumps({'status': 'error', 'error': str(e)})}\n\n".encode()) - handler.wfile.flush() - return # SSE handled, no JSON response + return j( + handler, + poll_onboarding_oauth_flow(flow_id), + extra_headers={"Cache-Control": "no-store"}, + ) + except ValueError as e: + return bad(handler, str(e)) + except KeyError as e: + return bad(handler, str(e), 404) # ── Cron API (GET) ── # All cron handlers touch cron.jobs which resolves HERMES_HOME from @@ -3280,6 +3266,34 @@ def handle_post(handler, parsed) -> bool: handler.wfile.write(response_body) return True + if parsed.path == "/api/onboarding/oauth/start": + from api.auth import is_auth_enabled + import os as _os + if not is_auth_enabled() and not _os.getenv("HERMES_WEBUI_ONBOARDING_OPEN"): + import ipaddress + try: + _xff = handler.headers.get("X-Forwarded-For", "").split(",")[0].strip() + _xri = handler.headers.get("X-Real-IP", "").strip() + _raw = handler.client_address[0] + addr = ipaddress.ip_address(_xff or _xri or _raw) + is_local = addr.is_loopback or addr.is_private + except ValueError: + is_local = False + if not is_local: + return bad(handler, "Onboarding OAuth is only available from local networks when auth is not enabled. To bypass this on a remote server, set HERMES_WEBUI_ONBOARDING_OPEN=1.", 403) + try: + return j(handler, start_onboarding_oauth_flow(body), extra_headers={"Cache-Control": "no-store"}) + except ValueError as e: + return bad(handler, str(e)) + except RuntimeError as e: + return bad(handler, str(e), 500) + + if parsed.path == "/api/onboarding/oauth/cancel": + try: + return j(handler, cancel_onboarding_oauth_flow(body), extra_headers={"Cache-Control": "no-store"}) + except ValueError as e: + return bad(handler, str(e)) + if parsed.path == "/api/onboarding/setup": # Writing API keys to disk - restrict to local/private networks unless auth is active. # In Docker, requests arrive from the bridge network (172.x.x.x), not 127.0.0.1, diff --git a/docs/pr-media/1362/codex-oauth-onboarding.png b/docs/pr-media/1362/codex-oauth-onboarding.png new file mode 100644 index 0000000000000000000000000000000000000000..9d184151c5a7f7bee64e9f9ac8b02b7ddca14af1 GIT binary patch literal 154809 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%0Aqy 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

FBMw)WbR92ZoP~yhvC~JNlG-w)o^`YASQ8w1% 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�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 literal 0 HcmV?d00001 diff --git a/static/onboarding.js b/static/onboarding.js index 05582576..bd0f9650 100644 --- a/static/onboarding.js +++ b/static/onboarding.js @@ -265,6 +265,9 @@ function _renderOnboardingBody(){ if(currentIsOauth){ const isReady=!!(ONBOARDING.status.system||{}).chat_ready; const providerLabel=esc(currentProviderName); + const codexOauthPendingBody=currentProviderName==='openai-codex' + ? 'This instance is configured to use openai-codex, which uses OAuth rather than an API key. Use the button below to authenticate with ChatGPT, then continue once provider status refreshes.' + : t('onboarding_oauth_provider_not_ready_body').replace('{provider}',providerLabel); if(isReady){ _setOnboardingNotice(t('onboarding_notice_setup_already_ready'),'success'); body.innerHTML=` @@ -288,9 +291,10 @@ function _renderOnboardingBody(){ body.innerHTML=`

⚠
-
+
${t('onboarding_oauth_provider_not_ready_title')} -

${t('onboarding_oauth_provider_not_ready_body').replace('{provider}',providerLabel)}

+

${codexOauthPendingBody}

+ ${currentProviderName==='openai-codex'?`
`:''}

${t('onboarding_oauth_switch_hint')}

@@ -314,17 +318,6 @@ function _renderOnboardingBody(){ ${_renderOnboardingApiKeyField()} ${_renderOnboardingBaseUrlField(showBaseUrl)}

${keyHelp}

-
-
🔑
-
- ${t('oauth_login_codex')} -

- ${t('onboarding_oauth_switch_hint')} -

-
- -
- ${showBaseUrl?`

${t('onboarding_base_url_help')}

`:''}

${esc(setup.unsupported_note||'')||''}

`; return; @@ -552,23 +545,100 @@ async function nextOnboardingStep(){ } /* ── Codex OAuth device-code flow ── */ -let _codexOAuthSSE=null; +let _codexOAuthPollTimer=null; +let _codexOAuthFlowId=null; + +function _clearCodexOAuthPoll(){ + if(_codexOAuthPollTimer){clearTimeout(_codexOAuthPollTimer);_codexOAuthPollTimer=null;} +} + +function _setCodexOAuthButton(enabled){ + const btn=$('codexOAuthBtn'); + if(btn){btn.disabled=!enabled;btn.textContent=enabled?t('oauth_login_codex'):'...';} +} + +async function copyCodexOAuthCode(code){ + try{ + await navigator.clipboard.writeText(code||''); + showToast('Code copied'); + }catch(e){ + showToast(code||''); + } +} + +async function cancelCodexOAuth(){ + const flowDiv=$('codexOAuthFlow'); + const flowId=_codexOAuthFlowId; + _clearCodexOAuthPoll(); + _codexOAuthFlowId=null; + if(flowId){ + try{await api('/api/onboarding/oauth/cancel',{method:'POST',body:JSON.stringify({flow_id:flowId})});}catch(e){} + } + _setCodexOAuthButton(true); + if(flowDiv){ + flowDiv.innerHTML=`
⏹
OAuth login cancelled

Start again whenever you're ready.

`; + } +} + +function _renderCodexOAuthTerminal(status,message){ + const flowDiv=$('codexOAuthFlow'); + if(!flowDiv)return; + const ok=status==='success'; + const icon=ok?'✅':status==='expired'?'⌛':status==='cancelled'?'⏹':'❌'; + const title=ok?t('oauth_codex_success'):(status==='expired'?t('oauth_codex_expired'):(status==='cancelled'?'OAuth login cancelled':t('oauth_codex_error'))); + flowDiv.innerHTML=` +
+
${icon}
+
${title}

${esc(message||'')}

+
`; +} + +async function _pollCodexOAuth(){ + const flowId=_codexOAuthFlowId; + if(!flowId)return; + try{ + const resp=await api('/api/onboarding/oauth/poll?flow_id='+encodeURIComponent(flowId)); + const status=(resp&&resp.status)||'error'; + if(status==='pending'){ + _codexOAuthPollTimer=setTimeout(_pollCodexOAuth,3000); + return; + } + _clearCodexOAuthPoll(); + _codexOAuthFlowId=null; + _setCodexOAuthButton(true); + if(status==='success'){ + _renderCodexOAuthTerminal('success','Credentials saved to the Hermes credential pool. Refreshing provider status…'); + showToast(t('oauth_codex_success')); + try{await loadOnboardingWizard();}catch(e){} + }else if(status==='expired'){ + _renderCodexOAuthTerminal('expired','The code expired. Start a new login flow to try again.'); + }else if(status==='cancelled'){ + _renderCodexOAuthTerminal('cancelled','The login flow was cancelled.'); + }else{ + _renderCodexOAuthTerminal('error',(resp&&resp.error)||'OAuth login failed. Please try again.'); + } + }catch(e){ + _clearCodexOAuthPoll(); + _codexOAuthFlowId=null; + _setCodexOAuthButton(true); + _renderCodexOAuthTerminal('error',(e&&e.message)||String(e)); + } +} async function startCodexOAuth(){ const flowDiv=$('codexOAuthFlow'); - const btn=$('codexOAuthBtn'); if(!flowDiv)return; - if(btn){btn.disabled=true;btn.textContent='...';} + _clearCodexOAuthPoll(); + _codexOAuthFlowId=null; + _setCodexOAuthButton(false); flowDiv.style.display='block'; flowDiv.innerHTML=`
⏳
${t('oauth_codex_polling')}

Starting device-code flow…

`; try{ - const resp=await api('/api/oauth/codex/start',{method:'POST'}); + const resp=await api('/api/onboarding/oauth/start',{method:'POST',body:JSON.stringify({provider:'openai-codex'})}); if(resp.error) throw new Error(resp.error); - const{device_code,user_code,verification_uri}=resp; - if(!device_code||!user_code||!verification_uri) throw new Error('Invalid OAuth response'); - // Open verification URI in new tab - window.open(verification_uri,'_blank'); - // Show user code prominently + const{flow_id,user_code,verification_uri}=resp; + if(!flow_id||!user_code||!verification_uri) throw new Error('Invalid OAuth response'); + _codexOAuthFlowId=flow_id; flowDiv.innerHTML=`
📋
@@ -576,60 +646,19 @@ async function startCodexOAuth(){ ${t('oauth_codex_step1')}

${esc(verification_uri)}

${t('oauth_codex_step2')}

- ${esc(user_code)} +
+ ${esc(user_code)} + + +

${t('oauth_codex_polling')}

`; - // Connect to SSE poll endpoint - const pollUrl=new URL('api/oauth/codex/poll?device_code='+encodeURIComponent(device_code),location.href); - if(_codexOAuthSSE){_codexOAuthSSE.close();_codexOAuthSSE=null;} - _codexOAuthSSE=new EventSource(pollUrl.href); - _codexOAuthSSE.onmessage=function(ev){ - let data; - try{data=JSON.parse(ev.data);}catch(e){return;} - if(data.status==='success'){ - if(_codexOAuthSSE){_codexOAuthSSE.close();_codexOAuthSSE=null;} - flowDiv.innerHTML=` -
-
✅
-
${t('oauth_codex_success')} -

Token saved to credential pool. You can now use Codex as a provider.

-
`; - if(btn){btn.disabled=false;btn.textContent=t('oauth_login_codex');} - showToast(t('oauth_codex_success')); - // Refresh onboarding status in background - loadOnboardingWizard().catch(()=>{}); - }else if(data.status==='error'){ - if(_codexOAuthSSE){_codexOAuthSSE.close();_codexOAuthSSE=null;} - const isExpired=(data.error||'').includes('expired'); - flowDiv.innerHTML=` -
-
❌
-
${isExpired?t('oauth_codex_expired'):t('oauth_codex_error')} -

${esc(data.error||'Unknown error')}

-
`; - if(btn){btn.disabled=false;btn.textContent=t('oauth_login_codex');} - } - // 'polling' status — keep waiting - }; - _codexOAuthSSE.onerror=function(){ - if(_codexOAuthSSE){_codexOAuthSSE.close();_codexOAuthSSE=null;} - if(btn){btn.disabled=false;btn.textContent=t('oauth_login_codex');} - // Don't overwrite if already showing success/error - if(!flowDiv.querySelector('.onboarding-oauth-ready')&&!flowDiv.querySelector('[style*="error"]')){ - flowDiv.innerHTML=` -
-
❌
-
${t('oauth_codex_error')}

Connection lost. Please try again.

-
`; - } - }; + _codexOAuthPollTimer=setTimeout(_pollCodexOAuth,Math.max(1000,Number(resp.poll_interval_seconds||3)*1000)); }catch(e){ - flowDiv.innerHTML=` -
-
❌
-
${t('oauth_codex_error')}

${esc(e.message||String(e))}

-
`; - if(btn){btn.disabled=false;btn.textContent=t('oauth_login_codex');} + _clearCodexOAuthPoll(); + _codexOAuthFlowId=null; + _renderCodexOAuthTerminal('error',(e&&e.message)||String(e)); + _setCodexOAuthButton(true); } } diff --git a/tests/test_issue1362_codex_oauth_onboarding.py b/tests/test_issue1362_codex_oauth_onboarding.py new file mode 100644 index 00000000..669fd90e --- /dev/null +++ b/tests/test_issue1362_codex_oauth_onboarding.py @@ -0,0 +1,182 @@ +"""Regression tests for issue #1362 — Codex OAuth from onboarding.""" + +from __future__ import annotations + +import json +import stat +import time +from pathlib import Path + +import pytest + +REPO = Path(__file__).resolve().parents[1] + + +def test_onboarding_codex_oauth_routes_use_post_start_cancel_and_get_poll(): + routes = (REPO / "api" / "routes.py").read_text(encoding="utf-8") + get_idx = routes.find("def handle_get(") + post_idx = routes.find("def handle_post(") + assert get_idx != -1 and post_idx != -1 + get_body = routes[get_idx:post_idx] + post_body = routes[post_idx:] + + assert '"/api/onboarding/oauth/poll"' in get_body + assert '"/api/onboarding/oauth/start"' not in get_body + assert '"/api/oauth/codex/start"' not in routes + assert '"/api/oauth/codex/poll"' not in routes + assert '"/api/onboarding/oauth/start"' in post_body + assert '"/api/onboarding/oauth/cancel"' in post_body + + +def test_onboarding_oauth_rejects_non_codex_providers(monkeypatch): + import api.oauth as oauth + + for provider in ("anthropic", "claude", "claude-code", "nous", "qwen-oauth", "copilot", "bogus"): + with pytest.raises(ValueError): + oauth.start_onboarding_oauth_flow({"provider": provider}) + + +def test_start_payload_does_not_leak_provider_device_secrets(monkeypatch, tmp_path): + import api.oauth as oauth + + oauth._OAUTH_FLOWS.clear() + monkeypatch.setattr(oauth, "_get_active_hermes_home", lambda: tmp_path) + monkeypatch.setattr(oauth, "_request_codex_user_code", lambda: { + "device_auth_id": "device-secret", + "user_code": "ABCD-EFGH", + "interval": 3, + }) + monkeypatch.setattr(oauth, "_spawn_codex_oauth_worker", lambda flow_id: None) + + payload = oauth.start_onboarding_oauth_flow({"provider": "openai-codex"}) + + assert payload["ok"] is True + assert payload["provider"] == "openai-codex" + assert payload["status"] == "pending" + assert payload["verification_uri"] == "https://auth.openai.com/codex/device" + assert payload["user_code"] == "ABCD-EFGH" + serialized = json.dumps(payload) + for forbidden in ( + "device_auth_id", + "device-secret", + "authorization_code", + "code_verifier", + "access_token", + "refresh_token", + ): + assert forbidden not in serialized + + +def test_poll_returns_high_level_status_only(monkeypatch, tmp_path): + import api.oauth as oauth + + oauth._OAUTH_FLOWS.clear() + flow_id = "flow-test" + oauth._OAUTH_FLOWS[flow_id] = { + "provider": "openai-codex", + "status": "pending", + "device_auth_id": "device-secret", + "user_code": "ABCD-EFGH", + "code_verifier": "verifier-secret", + "authorization_code": "auth-secret", + "expires_at": time.time() + 60, + "poll_interval_seconds": 3, + "hermes_home": tmp_path, + } + + payload = oauth.poll_onboarding_oauth_flow(flow_id) + + assert payload == {"ok": True, "provider": "openai-codex", "flow_id": flow_id, "status": "pending"} + serialized = json.dumps(payload) + for forbidden in ("device_auth_id", "device-secret", "code_verifier", "authorization_code"): + assert forbidden not in serialized + + +def test_cancel_marks_flow_cancelled_and_poll_stops(tmp_path): + import api.oauth as oauth + + oauth._OAUTH_FLOWS.clear() + flow_id = "flow-cancel" + oauth._OAUTH_FLOWS[flow_id] = { + "provider": "openai-codex", + "status": "pending", + "expires_at": time.time() + 60, + "hermes_home": tmp_path, + } + + cancelled = oauth.cancel_onboarding_oauth_flow({"flow_id": flow_id}) + polled = oauth.poll_onboarding_oauth_flow(flow_id) + + assert cancelled["status"] == "cancelled" + assert polled["status"] == "cancelled" + + +def test_expired_flow_reports_expired_and_drops_sensitive_lifecycle(tmp_path): + import api.oauth as oauth + + oauth._OAUTH_FLOWS.clear() + flow_id = "flow-expired" + oauth._OAUTH_FLOWS[flow_id] = { + "provider": "openai-codex", + "status": "pending", + "device_auth_id": "device-secret", + "expires_at": time.time() - 1, + "hermes_home": tmp_path, + } + + payload = oauth.poll_onboarding_oauth_flow(flow_id) + + assert payload["status"] == "expired" + assert oauth._OAUTH_FLOWS[flow_id]["status"] == "expired" + assert "device_auth_id" not in oauth._OAUTH_FLOWS[flow_id] + + +def test_codex_credentials_written_to_active_profile_auth_json(monkeypatch, tmp_path): + import api.oauth as oauth + from api.onboarding import _provider_oauth_authenticated + + active_home = tmp_path / "active-profile" + realish_home = tmp_path / "process-home" + active_home.mkdir() + realish_home.mkdir() + monkeypatch.setattr(Path, "home", lambda: realish_home) + + auth_path = oauth._persist_codex_credentials( + active_home, + {"access_token": "access-secret", "refresh_token": "refresh-secret"}, + ) + + assert auth_path == active_home / "auth.json" + assert auth_path.exists() + assert not (realish_home / ".hermes" / "auth.json").exists() + mode = stat.S_IMODE(auth_path.stat().st_mode) + assert mode == 0o600 + store = json.loads(auth_path.read_text(encoding="utf-8")) + entry = store["credential_pool"]["openai-codex"][0] + assert entry["auth_type"] == "oauth" + assert entry["source"] == "manual:device_code" + assert entry["base_url"] == "https://chatgpt.com/backend-api/codex" + assert _provider_oauth_authenticated("openai-codex", active_home) is True + + +def test_frontend_uses_onboarding_oauth_endpoints_and_no_secret_poll_url(): + js = (REPO / "static" / "onboarding.js").read_text(encoding="utf-8") + assert "/api/onboarding/oauth/start" in js + assert "/api/onboarding/oauth/poll" in js + assert "/api/onboarding/oauth/cancel" in js + assert "window.open(verification_uri" not in js + assert "device_code=" not in js + assert "device_code" not in js + assert "flow_id" in js + assert "copyCodexOAuthCode" in js + assert "cancelCodexOAuth" in js + + +def test_unsupported_note_no_longer_calls_openai_codex_terminal_first(): + src = (REPO / "api" / "onboarding.py").read_text(encoding="utf-8") + start = src.find("_UNSUPPORTED_PROVIDER_NOTE") + body = src[start:start + 400] + assert "OpenAI Codex, and GitHub" not in body + assert "OpenAI Codex" in body and "authenticated in this onboarding flow" in body + assert "Anthropic" not in body + assert "Claude" not in body