From 722127586b9d7f5fd6e867fdd6a9b43fbf2eec60 Mon Sep 17 00:00:00 2001 From: Loongphy Date: Fri, 29 May 2026 00:50:18 +0800 Subject: [PATCH 1/3] fix: remove browser UA spoofing for ChatGPT API requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace Chrome browser User-Agent with honest `codex-auth/` identifier for all requests to chatgpt.com backend-api endpoints (usage, account check). The previous Chrome UA string was unnecessary — the API works fine with a transparent client identifier, matching how the official Codex CLI identifies itself as `codex_cli_rs/`. --- src/api/http_types.zig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/http_types.zig b/src/api/http_types.zig index c664e38c..41179b03 100644 --- a/src/api/http_types.zig +++ b/src/api/http_types.zig @@ -1,11 +1,12 @@ const std = @import("std"); +const version = @import("../version.zig"); pub const request_timeout_secs: []const u8 = "5"; pub const request_timeout_ms: []const u8 = "5000"; pub const request_timeout_ms_value: u64 = 5000; pub const child_process_timeout_ms: []const u8 = "7000"; pub const child_process_timeout_ms_value: u64 = 7000; -pub const browser_user_agent: []const u8 = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36"; +pub const browser_user_agent: []const u8 = "codex-auth/" ++ version.app_version; pub const node_executable_env = "CODEX_AUTH_NODE_EXECUTABLE"; pub const node_use_env_proxy_env = "NODE_USE_ENV_PROXY"; pub const node_requirement_hint = "Node.js 22+ is required for ChatGPT API refresh. Install Node.js 22+ or use the npm package."; From bc47eff839a8e23596f0616a26606b0f754dee22 Mon Sep 17 00:00:00 2001 From: Loongphy Date: Fri, 29 May 2026 00:58:53 +0800 Subject: [PATCH 2/3] Apply suggestion from @greptile-apps[bot] Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- src/api/http_types.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/http_types.zig b/src/api/http_types.zig index 41179b03..34f356ff 100644 --- a/src/api/http_types.zig +++ b/src/api/http_types.zig @@ -6,7 +6,7 @@ pub const request_timeout_ms: []const u8 = "5000"; pub const request_timeout_ms_value: u64 = 5000; pub const child_process_timeout_ms: []const u8 = "7000"; pub const child_process_timeout_ms_value: u64 = 7000; -pub const browser_user_agent: []const u8 = "codex-auth/" ++ version.app_version; +pub const user_agent: []const u8 = "codex-auth/" ++ version.app_version; pub const node_executable_env = "CODEX_AUTH_NODE_EXECUTABLE"; pub const node_use_env_proxy_env = "NODE_USE_ENV_PROXY"; pub const node_requirement_hint = "Node.js 22+ is required for ChatGPT API refresh. Install Node.js 22+ or use the npm package."; From bf66e5472e1a7d878f17161ee7d4e08677d7c97e Mon Sep 17 00:00:00 2001 From: Loongphy Date: Fri, 29 May 2026 01:02:40 +0800 Subject: [PATCH 3/3] fix: update remaining browser_user_agent references to user_agent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The remote rename of browser_user_agent → user_agent in http_types.zig left stale references in http.zig and http_node.zig. --- src/api/http.zig | 2 +- src/api/http_node.zig | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/api/http.zig b/src/api/http.zig index d4377633..68311d08 100644 --- a/src/api/http.zig +++ b/src/api/http.zig @@ -11,7 +11,7 @@ pub const request_timeout_ms = types.request_timeout_ms; pub const request_timeout_ms_value = types.request_timeout_ms_value; pub const child_process_timeout_ms = types.child_process_timeout_ms; pub const child_process_timeout_ms_value = types.child_process_timeout_ms_value; -pub const browser_user_agent = types.browser_user_agent; +pub const user_agent = types.user_agent; pub const node_executable_env = types.node_executable_env; pub const node_use_env_proxy_env = types.node_use_env_proxy_env; pub const node_requirement_hint = types.node_requirement_hint; diff --git a/src/api/http_node.zig b/src/api/http_node.zig index db3f9eda..9c042fef 100644 --- a/src/api/http_node.zig +++ b/src/api/http_node.zig @@ -13,7 +13,7 @@ const BatchItemResult = types.BatchItemResult; const request_timeout_ms = types.request_timeout_ms; const request_timeout_ms_value = types.request_timeout_ms_value; const child_process_timeout_ms_value = types.child_process_timeout_ms_value; -const browser_user_agent = types.browser_user_agent; +const user_agent = types.user_agent; const getEnvMap = env.getEnvMap; const resolveNodeExecutable = executable.resolveNodeExecutable; const resolveNodeExecutableForLaunchAlloc = executable.resolveNodeExecutableForLaunchAlloc; @@ -266,7 +266,7 @@ fn runNodeBearerGetJsonCommand( endpoint, access_token, request_timeout_ms, - browser_user_agent, + user_agent, }, child_process_timeout_ms_value, &env_map) catch |err| switch (err) { error.OutOfMemory => return err, error.FileNotFound => { @@ -334,7 +334,7 @@ fn runNodeGetJsonCommand( access_token, account_id, request_timeout_ms, - browser_user_agent, + user_agent, }, child_process_timeout_ms_value, &env_map) catch |err| switch (err) { error.OutOfMemory => return err, error.FileNotFound => { @@ -411,7 +411,7 @@ fn runNodeGetJsonBatchCommand( .endpoint = endpoint, .timeout_ms = request_timeout_ms_value, .concurrency = @max(@as(usize, 1), max_concurrency), - .user_agent = browser_user_agent, + .user_agent = user_agent, .requests = requests, }, .{}, &payload_writer.writer);