Commit Graph

3 Commits

  • PAC 4 - Add macOS system proxy resolver (#26709)
    ## Summary
    
    Stacked on #26708.
    
    Adds the macOS implementation of the shared system-proxy contract. This
    allows Codex-owned auth clients to use the route macOS selects for each
    auth URL through SystemConfiguration and CFNetwork, including PAC and
    WPAD results.
    
    The `respect_system_proxy` feature is disabled by default, so existing
    client behavior remains unchanged unless explicitly enabled.
    
    ## Implementation
    
    - Adds the macOS-only `system-configuration` dependency to
    `codex-client`.
    - Dispatches system-proxy resolution to `outbound_proxy/macos.rs` on
    macOS.
    - Reads system proxy settings from `SCDynamicStore` and resolves the
    target URL with `CFNetworkCopyProxiesForURL`.
    - Executes PAC URLs and inline PAC JavaScript through a bounded run loop
    with a five-second timeout.
    - Handles `DIRECT`, HTTP proxies, and CFNetwork HTTPS entries using HTTP
    CONNECT; unsupported SOCKS entries map to `UnsupportedProxyScheme`.
    - Builds concrete proxy URLs from host and port entries, including IPv6
    host bracketing.
    - Maps results into the shared `SystemProxyDecision::{Direct, Proxy,
    Unavailable}` contract.
    - Hashes URL-specific cache keys so PAC decisions remain distinct
    without retaining raw request URLs or query strings.
    
    ## End-user behavior
    
    - Disabled/default: existing client behavior is unchanged.
    - Enabled with `[features.respect_system_proxy]`:
      - macOS auth clients honor system proxy configuration, PAC, and WPAD;
      - valid OS/PAC `DIRECT` decisions use a direct connection;
    - unavailable system resolution falls back to explicit environment proxy
    variables, then `DIRECT`, through the shared contract from #26707.
    - Unsupported proxy schemes are not silently translated into another
    route.
    - Custom CA handling remains separate from proxy selection.
    - Known limitation: only the first supported system/PAC candidate is
    used. Subsequent proxy or `DIRECT` candidates are not attempted after a
    connection failure. This matches the current Windows behavior and leaves
    room for future ordered-fallback support.
    
    ## Tests
    
    - `just test -p codex-client` — 34 tests passed.
    - `just clippy -p codex-client`
    - `just fmt`
    - `just bazel-lock-check`
  • PAC 3 - Add Windows system proxy resolver (#26708)
    ## Summary
    
    Stacked on #26707.
    
    Adds the Windows implementation of the shared system-proxy contract.
    This allows Codex-owned auth clients to use the route Windows selects
    for each auth URL, including explicit PAC configuration, WPAD
    auto-detection, static proxies, and bypass rules.
    
    The `respect_system_proxy` feature is disabled by default, so existing
    client behavior remains unchanged unless explicitly enabled.
    
    ## Implementation
    
    - Adds Windows-only `codex-client` dependencies:
    - `windows-sys` with `Win32_Foundation` and `Win32_Networking_WinHttp`;
      - `sha2` for redacted cache keys.
    - Dispatches system-proxy resolution to `outbound_proxy/windows.rs` on
    Windows.
    - Reads the current-user WinHTTP/IE proxy configuration via
    `WinHttpGetIEProxyConfigForCurrentUser`.
    - Resolves explicit PAC URLs first, then OS-enabled WPAD auto-detection,
    then static proxy and bypass settings.
    - Uses `WinHttpGetProxyForUrl` for PAC/WPAD and maps results into the
    shared `SystemProxyDecision::{Direct, Proxy, Unavailable}` contract.
    - Parses `DIRECT`, `PROXY`, `HTTPS`, and keyed static proxy entries.
    - Treats unsupported schemes such as SOCKS as unavailable so the shared
    resolver can apply its environment-proxy fallback.
    - Handles Windows bypass entries, including `<local>` and host, suffix,
    wildcard, and port matching.
    - Releases WinHTTP-owned strings with `GlobalFree` and closes sessions
    with `WinHttpCloseHandle`.
    - Hashes URL-specific cache keys with SHA-256 so PAC decisions remain
    URL-specific without retaining raw request URLs or query strings.
    
    ## End-user behavior
    
    - Disabled/default: existing client behavior is unchanged.
    - Enabled with `[features.respect_system_proxy]`:
    - Windows auth clients honor explicit PAC configuration, OS-enabled
    WPAD, static proxies, and bypass rules;
      - valid OS/PAC `DIRECT` decisions use a direct connection;
    - unavailable system resolution falls back to explicit environment proxy
    variables, then `DIRECT`, through the shared contract from #26707.
    - Unsupported proxy schemes are not silently translated into a different
    route.
    - Custom CA handling remains separate from proxy selection.
    
    ## Tests
    
    Adds coverage for:
    
    - PAC-style proxy tokens such as `PROXY proxy.internal:8080` and `HTTPS
    proxy.internal:8443`;
    - static WinHTTP proxy entries keyed by target scheme;
    - `DIRECT` and unsupported proxy-token behavior;
    - Windows bypass matching, including `<local>`, wildcard, suffix, and
    port-qualified entries;
    - preserving URL-specific PAC cache decisions without retaining the raw
    URL on Windows.
  • PAC 2 - Add shared auth system proxy contract (#26707)
    ## Summary
    
    Stacked on #26706.
    
    Adds the shared auth/system-proxy contract that later platform resolver
    PRs plug into. This PR moves Codex-owned auth and startup HTTP clients
    through a common route-aware boundary, but does not yet add Windows or
    macOS system proxy resolution.
    
    The default path remains unchanged when `respect_system_proxy` is absent
    or disabled.
    
    ## Implementation
    
    - Adds `codex-client/src/outbound_proxy.rs` with the shared
    route-selection model:
      - `OutboundProxyConfig`;
      - `ClientRouteClass`;
      - `RouteFailureClass`;
      - `build_reqwest_client_for_route`.
    - Preserves the existing reqwest/default-client behavior when no route
    config is supplied.
    - Uses the fixed MVP routing policy when route config is supplied:
    platform system/PAC/WPAD discovery, then explicit env proxy variables,
    then direct connection.
    - Keeps platform-specific system discovery behind the shared client
    boundary. This PR provides the contract and fallback behavior; later
    resolver PRs plug in Windows and macOS discovery.
    - Adds `login::AuthRouteConfig` so auth call sites depend on a small
    policy type instead of platform resolver details.
    - Maps the resolved `Config.respect_system_proxy` boolean into
    `AuthRouteConfig` for auth-owned clients.
    - Wires the route config through browser login, device-code login,
    access-token login, login status, logout/revoke, token refresh, API-key
    exchange, app-server account login, TUI/app startup, cloud-config
    bootstrap, cloud tasks, plugin auth, and exec startup config loading.
    
    ## End-user behavior
    
    - No behavior changes by default.
    - When `respect_system_proxy = true`, auth-owned clients opt into the
    shared route-aware client path.
    - On platforms without a resolver implementation in this PR, system
    discovery is unavailable and the route-aware path falls back to explicit
    env proxy handling, then direct connection.
    - Custom CA handling remains separate from proxy route selection and
    still runs through the shared client builder.
    - No proxy URLs, PAC contents, or resolved platform details are exposed
    through the public config surface introduced here.
    
    ## Tests
    
    Adds or updates coverage for:
    
    - preserving default auth-client fallback behavior when no route config
    is provided;
    - injected environment-proxy fallback without mutating process
    environment;
    - existing login-server E2E flows using explicit `auth_route_config:
    None` to guard unchanged default behavior;
    - updated auth manager, login, logout, cloud-config, startup, and
    plugin-auth call sites passing route config explicitly.