From 8343837b3c6468bc7e55defe926d4c830cbfdd83 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 20 May 2026 17:38:08 +0400 Subject: [PATCH] v2.6.1: rebuild Google OAuth to emulate Gemini CLI - Uses Google's public OAuth client_id (no client_secret.json needed) - PKCE + CSRF state protection for secure auth - Scopes: cloud-platform, generative-language, userinfo - Just click OAuth Login -> browser -> authorize -> done - Zero setup required --- CHANGELOG.md | 11 +++ codex-launcher_2.6.0_all.deb | Bin 34216 -> 0 bytes codex-launcher_2.6.1_all.deb | Bin 0 -> 34158 bytes src/codex-launcher-gui | 163 ++++++++++++++--------------------- 4 files changed, 78 insertions(+), 96 deletions(-) delete mode 100644 codex-launcher_2.6.0_all.deb create mode 100644 codex-launcher_2.6.1_all.deb diff --git a/CHANGELOG.md b/CHANGELOG.md index d56be91..b2be983 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## v2.6.1 (2026-05-20) + +- **Google OAuth rebuilt to emulate Gemini CLI** + - Uses Google's public OAuth client_id (same as gemini-cli) + - No `client_secret.json` needed — zero setup required + - PKCE (S256 code challenge) + CSRF state protection + - Scopes: cloud-platform, generative-language, userinfo.email, userinfo.profile + - Redirects to Google's success/failure pages (same as gemini-cli) + - Just click "OAuth Login" → browser opens → authorize → done + - Token file permissions set to 0600 for security + ## v2.6.0 (2026-05-20) - **Usage Dashboard** — per-provider tracking with visual cards diff --git a/codex-launcher_2.6.0_all.deb b/codex-launcher_2.6.0_all.deb deleted file mode 100644 index ee62bdfd1fd6585e17b3aebb941320b78905794b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34216 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⋙fSz7BC%4Ei3_kmR!YCHNQFs8^{ zuzLVj)cNT)DLvXqP}RF8>VV-O4{|q7I>u;gBjg3!&_9jt>8}%^0xnR1Dvhl1+WW%i-xaT@%dHIy?dITNbomK6yeJ5BH&@_&)y0rQ+5GrIAh0k&c6t* zH5ud#j#EyDlCWmC`8Ut7pd^Es9GqyB!miOrop&V(o;yIwl~^I6GeHf8TtcFC#oO_; zDx!7t-MU9riWrYcfeo4y`UE&q)dLDiYjyNTkdps~C-4y1z?w*H`4?slf;Vr∓H3f2?&7oBmaizfAto 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 VXpivZ-FwtjB0Avm2)4KTTnhg(0N4Nk diff --git a/codex-launcher_2.6.1_all.deb b/codex-launcher_2.6.1_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..0a72c2555f53641d94403b97c8634e109fb630ff GIT binary patch literal 34158 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 S;eBpOZ7@G$RWBi+!nO+1cqhOB literal 0 HcmV?d00001 diff --git a/src/codex-launcher-gui b/src/codex-launcher-gui index 19a9099..18e54da 100755 --- a/src/codex-launcher-gui +++ b/src/codex-launcher-gui @@ -25,6 +25,13 @@ model_catalog_json = "" """ CHANGELOG = [ + ("2.6.1", "2026-05-20", [ + "Google OAuth rebuilt to emulate Gemini CLI — no client_secret.json needed", + "Uses Google's public OAuth client_id (same as gemini-cli)", + "PKCE + CSRF state protection for secure auth", + "Just click OAuth Login → browser opens → authorize → done", + "Includes cloud-platform scope for Gemini Code Assist compatibility", + ]), ("2.6.0", "2026-05-20", [ "Usage Dashboard — per-provider request/token/latency tracking", "Visual cards with success rate bars, model breakdown, error tracking", @@ -640,7 +647,7 @@ class LauncherWin(Gtk.Window): # header row hdr = Gtk.Box(spacing=8) vbox.pack_start(hdr, False, False, 0) - lbl = Gtk.Label(label="Codex Launcher v2.6.0") + lbl = Gtk.Label(label="Codex Launcher v2.6.1") lbl.set_use_markup(True) hdr.pack_start(lbl, False, False, 0) changelog_btn = Gtk.Button(label="Changelog") @@ -1824,84 +1831,41 @@ class EditEndpointDialog(Gtk.Dialog): def _google_oauth_flow(self): token_path = os.path.expanduser("~/.cache/codex-proxy/google-oauth-token.json") - default_cs_path = os.path.expanduser("~/.cache/codex-proxy/client_secret.json") - client_secret_path = None - if os.path.exists(default_cs_path): - client_secret_path = default_cs_path - else: - dlg = Gtk.Dialog(title="Google OAuth Setup", parent=self, modal=True) - dlg.add_button("Open Google Console", 1) - dlg.add_button("Browse for client_secret.json", 2) - dlg.add_button("Cancel", Gtk.ResponseType.CANCEL) - dlg.set_default_size(500, 320) - area = dlg.get_content_area() - area.set_margin_start(16) - area.set_margin_end(16) - area.set_margin_top(12) - area.set_margin_bottom(12) - area.set_spacing(8) - area.pack_start(Gtk.Label(label="One-time Google OAuth Setup", use_markup=True), False, False, 0) - steps = Gtk.Label(label=( - "1. Create project at Google Cloud Console\n" - " (enable 'Generative Language API')\n" - "2. APIs & Services → Credentials\n" - " → Create OAuth 2.0 Client ID (Desktop app)\n" - "3. Add redirect URI: http://localhost:8085\n" - "4. Download client_secret.json\n\n" - "Then click 'Browse for client_secret.json'\n" - f"It will be auto-copied to: {default_cs_path}" - ), xalign=0) - area.pack_start(steps, False, False, 4) - area.show_all() - r = dlg.run() - dlg.destroy() - if r == 1: - subprocess.Popen(["xdg-open", "https://console.cloud.google.com/apis/credentials"]) - return - if r == 2: - chooser = Gtk.FileChooserDialog( - title="Select client_secret.json", - parent=self, - action=Gtk.FileChooserAction.OPEN, - ) - chooser.add_button("Cancel", Gtk.ResponseType.CANCEL) - chooser.add_button("Open", Gtk.ResponseType.OK) - filt = Gtk.FileFilter() - filt.set_name("JSON files") - filt.add_pattern("*.json") - chooser.add_filter(filt) - chooser.set_current_folder(os.path.expanduser("~/Downloads")) - if chooser.run() == Gtk.ResponseType.OK: - src = chooser.get_filename() - chooser.destroy() - if src and os.path.exists(src): - import shutil as _shutil - os.makedirs(os.path.dirname(default_cs_path), exist_ok=True) - _shutil.copy2(src, default_cs_path) - client_secret_path = default_cs_path - else: - chooser.destroy() - if not client_secret_path: - return + CLIENT_ID = "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com" + CLIENT_SECRET = "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w" + SCOPES = [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/generative-language.retriever", + "https://www.googleapis.com/auth/userinfo.email", + "https://www.googleapis.com/auth/userinfo.profile", + ] + import http.server, hashlib, secrets, socket - with open(client_secret_path) as f: - cs = json.load(f) - installed = cs.get("installed", cs.get("web", {})) - client_id = installed["client_id"] - client_secret = installed["client_secret"] - redirect_uri = "http://localhost:8085" - scope = "https://www.googleapis.com/auth/generative-language.retriever" + port = 8085 + state = secrets.token_hex(32) + verifier = secrets.token_urlsafe(32) + challenge = hashlib.sha256(verifier.encode()).digest() + challenge_b64 = urllib.parse.quote_plus(__import__('base64').urlsafe_b64encode(challenge).rstrip(b'=').decode()) + redirect_uri = f"http://127.0.0.1:{port}/oauth2callback" + scope_str = " ".join(SCOPES) auth_url = ( f"https://accounts.google.com/o/oauth2/v2/auth?" - f"client_id={client_id}&redirect_uri={urllib.parse.quote(redirect_uri)}" - f"&response_type=code&scope={urllib.parse.quote(scope)}&access_type=offline&prompt=consent" + f"client_id={CLIENT_ID}" + f"&redirect_uri={urllib.parse.quote(redirect_uri)}" + f"&response_type=code" + f"&scope={urllib.parse.quote(scope_str)}" + f"&access_type=offline" + f"&prompt=consent" + f"&state={state}" + f"&code_challenge={challenge_b64}" + f"&code_challenge_method=S256" ) - dlg = Gtk.Dialog(title="Google OAuth", parent=self, modal=True) + dlg = Gtk.Dialog(title="Google OAuth (Gemini Mode)", parent=self, modal=True) dlg.add_button("Cancel", Gtk.ResponseType.CANCEL) - dlg.set_default_size(520, 260) + dlg.set_default_size(520, 280) area = dlg.get_content_area() area.set_margin_start(16) area.set_margin_end(16) @@ -1909,15 +1873,16 @@ class EditEndpointDialog(Gtk.Dialog): area.set_margin_bottom(12) area.set_spacing(8) - area.pack_start(Gtk.Label(label="Step 1: Authorize with Google", use_markup=True, xalign=0), False, False, 0) - link_lbl = Gtk.Label(label=f'Click here to open Google authorization', use_markup=True) + area.pack_start(Gtk.Label(label="Sign in with Google", use_markup=True, xalign=0), False, False, 0) + area.pack_start(Gtk.Label(label="Emulating Gemini CLI OAuth — no client_secret.json needed.", xalign=0), False, False, 0) + + link_lbl = Gtk.Label() + link_lbl.set_markup(f'Click here to open Google authorization') + link_lbl.set_line_wrap(True) area.pack_start(link_lbl, False, False, 4) - area.pack_start(Gtk.Label(label="Opening browser automatically…", xalign=0), False, False, 0) - - area.pack_start(Gtk.Label(label="Waiting for authorization…", use_markup=True, xalign=0), False, False, 12) - self._oauth_status = Gtk.Label(label="Listening on http://localhost:8085 …", xalign=0) - area.pack_start(self._oauth_status, False, False, 0) + self._oauth_status = Gtk.Label(label="Opening browser…", xalign=0) + area.pack_start(self._oauth_status, False, False, 4) spinner = Gtk.Spinner() spinner.start() @@ -1925,36 +1890,39 @@ class EditEndpointDialog(Gtk.Dialog): area.show_all() - import http.server code_holder = [None] error_holder = [None] + received_state = [None] class OAuthHandler(http.server.BaseHTTPRequestHandler): def do_GET(self2): qs = urllib.parse.urlparse(self2.path).query params = urllib.parse.parse_qs(qs) + received_state[0] = params.get("state", [None])[0] if "code" in params: + if received_state[0] != state: + self2.send_response(400) + self2.send_header("Content-Type", "text/html") + self2.end_headers() + self2.wfile.write(b"" + b"

CSRF state mismatch.

") + error_holder[0] = "CSRF state mismatch" + return code_holder[0] = params["code"][0] - self2.send_response(200) - self2.send_header("Content-Type", "text/html") + self2.send_response(302) + self2.send_header("Location", "https://developers.google.com/gemini-code-assist/auth_success_gemini") self2.end_headers() - self2.wfile.write(b"" - b"

✓ Authorization successful!

" - b"

You can close this tab and return to Codex Launcher.

") else: error_holder[0] = params.get("error", ["unknown"])[0] - self2.send_response(400) - self2.send_header("Content-Type", "text/html") + self2.send_response(302) + self2.send_header("Location", "https://developers.google.com/gemini-code-assist/auth_failure_gemini") self2.end_headers() - self2.wfile.write(b"" - b"

Authorization failed.

" - b"

Please close this tab and try again.

") def log_message(self2, *a): pass try: - server = http.server.HTTPServer(("127.0.0.1", 8085), OAuthHandler) + server = http.server.HTTPServer(("127.0.0.1", port), OAuthHandler) except OSError: - self._oauth_status.set_text("Port 8085 already in use — close other apps and retry.") + self._oauth_status.set_text(f"Port {port} already in use — close other apps and retry.") spinner.stop() dlg.run(); dlg.destroy() return @@ -1962,16 +1930,16 @@ class EditEndpointDialog(Gtk.Dialog): def wait_for_code(): server.handle_request() server.server_close() - GLib.idle_add(self._google_oauth_complete, dlg, code_holder, error_holder, - client_id, client_secret, redirect_uri, token_path, spinner) + GLib.idle_add(self._google_oauth_complete_gemini, dlg, code_holder, error_holder, + CLIENT_ID, CLIENT_SECRET, redirect_uri, token_path, spinner, verifier) threading.Thread(target=wait_for_code, daemon=True).start() subprocess.Popen(["xdg-open", auth_url], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) dlg.run() dlg.destroy() - def _google_oauth_complete(self, dlg, code_holder, error_holder, - client_id, client_secret, redirect_uri, token_path, spinner): + def _google_oauth_complete_gemini(self, dlg, code_holder, error_holder, + client_id, client_secret, redirect_uri, token_path, spinner, verifier): spinner.stop() if error_holder[0]: self._oauth_status.set_markup(f'Error: {error_holder[0]}') @@ -1988,6 +1956,7 @@ class EditEndpointDialog(Gtk.Dialog): "client_secret": client_secret, "redirect_uri": redirect_uri, "grant_type": "authorization_code", + "code_verifier": verifier, }).encode() req = urllib.request.Request("https://oauth2.googleapis.com/token", data=token_data, headers={"Content-Type": "application/x-www-form-urlencoded"}) @@ -1996,10 +1965,12 @@ class EditEndpointDialog(Gtk.Dialog): tokens["client_id"] = client_id tokens["client_secret"] = client_secret tokens["expires_at"] = time.time() + tokens.get("expires_in", 3600) + os.makedirs(os.path.dirname(token_path), exist_ok=True) with open(token_path, "w") as f: json.dump(tokens, f, indent=2) + os.chmod(token_path, 0o600) self._entry_key.set_text(tokens.get("access_token", "")) - self._oauth_status.set_markup('✓ Authorization successful! Token saved.') + self._oauth_status.set_markup('Authorization successful! Token saved.') dlg.set_title("Google OAuth — Success") except Exception as e: self._oauth_status.set_markup(f'Token exchange failed: {e}')