fix(webview-accounts): zoom Sign in with Google escapes to system browser (#1294)#1329
Merged
senamakel merged 3 commits intotinyhumansai:mainfrom May 7, 2026
Merged
Conversation
…inyhumansai#1294) Zoom's "Sign in with Google" popup hits popup_should_navigate_parent which gates on provider_supports_google_sso. Without zoom in the SSO allowlist the popup falls through to open_in_system_browser, the Google session lands in the wrong cookie jar, and Zoom's callback fails with error 300. Also update the SSO matrix test to assert the new behavior. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…nyhumansai#1294) Once popup_should_navigate_parent reroutes Zoom's Google sign-in to the embedded webview, url_is_internal must accept the OAuth callback hosts or the navigation gets rejected and the auth chain breaks. Mirror Slack's Google host list verbatim — same hosts, same order — since the OAuth flow shape is identical. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…oute (tinyhumansai#1294) Mirror the Slack/Gmeet patterns: - zoom_supports_google_sso: assert provider_supports_google_sso("zoom") - zoom_popup_navigates_parent_for_google_sso: assert window.open of accounts.google.com/v3/signin/identifier from zoom is rerouted to the parent webview rather than the system browser - zoom_allowed_hosts_covers_google_oauth: assert url_is_internal("zoom", ...) accepts accounts.google.com, oauth2.googleapis.com, and www.googleapis.com — the hosts touched by the post-popup OAuth chain Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
📝 WalkthroughWalkthroughZoom is now classified as a Google-SSO-supporting provider in the embedded-webview account integration. The allowed-host list for Zoom is expanded to explicitly permit Google OAuth and identity domains. Unit tests verify allowed-host coverage, Google SSO support status, and popup-navigation behavior for Zoom Google-auth flows. ChangesZoom Google SSO Support in Embedded Webview
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
11 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
"zoom"toprovider_supports_google_sso()so Zoom Google OAuth popups reroute into the parent webview instead of escaping to the system browser.provider_allowed_hosts()arm with the same Google OAuth host set Slack uses (accounts.google.com,accounts.googleusercontent.com,oauth2.googleapis.com,www.googleapis.com, etc.) so the rerouted parent navigation is classified internal.Problem
Clicking "Sign in with Google" inside the Zoom embedded webview redirected to the external browser and surfaced Zoom error 300 ("Oops! We were unable to complete your request. Please try again."). The Google OAuth
window.open("https://accounts.google.com/...")popup walked every reroute branch inapp/src-tauri/src/webview_accounts/mod.rson_new_window(line 2132) and fell through toopen_in_system_browserat line 2212 because Zoom was missing from two adjacent allowlists:provider_supports_google_sso()at lines 277-279 — only"google-meet" | "slack"were gated true; Zoom failed the gate at line 293 insidepopup_should_navigate_parent().provider_allowed_hosts()arm at line 116 — only Zoom's own domains were listed; no Google OAuth hosts.Once OAuth escaped to the system browser, the Google session cookie landed outside the per-account CEF profile (line 1879). The callback to the embedded Zoom webview lost the Google session and Zoom returned error 300.
Solution
Mirror the existing Slack/Google-Meet pattern that already works for Google sign-in inside embedded webviews:
"zoom"inprovider_supports_google_sso(). This flips the gate atpopup_should_navigate_parentline 293 so the Google OAuth popup is rerouted into the parent webview instead of denied.provider_allowed_hosts()arm. Without this, the rerouted parent navigation would be classified external byurl_is_internal()(lines 172-194) and bounced.zoom_supports_google_sso,zoom_popup_navigates_parent_for_google_sso,zoom_allowed_hosts_covers_google_oauth. The popup test URL uses/v3/signin/identifier(matchesis_google_auth_popup's path keywords, mirrors the working Slack test exactly) instead of the OAuth init URL/o/oauth2/v2/auth?...(which intentionally bypasses the popup detector).provider_supports_google_sso_matrixtest at line 3807 explicitly asserted!provider_supports_google_sso("zoom")— flipped to positive for consistency.No CDP grant changes (
cdp/session.rs), no recipe.js, no frontend changes, no other providers touched.Submission Checklist
docs/TESTING-STRATEGY.md— 3 new unit tests cover SSO gate, popup-to-parent reroute, host allowlist; existing Slack/Gmeet/Zoom-native tests remain green (76/76 pass undercargo test webview_accounts).## Related— no matrix row touched.docs/TESTING-STRATEGY.md) — no network calls, only allowlist + match arm changes.docs/RELEASE-MANUAL-SMOKE.md.Closes #NNNin the## Relatedsection.Impact
app.zoom.us, and session persists across app restart (per-account CEF profile cookie jar).notificationspercdp/session.rs:346); no media-capture grants added by this PR.--no-verifybecause the husky pre-push hook fails on pre-existing main-branch breakage in unrelated areas (Prettier/lint/TypeScript/Rust warnings unrelated towebview_accounts/mod.rs). Changed Rust file is verified clean againstcargo fmt --check,cargo clippy -- -D warnings, andcargo test webview_accounts(76/76 pass).Related
AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
fix/1294-zoom-google-sso(headoxoxDev:fix/1294-zoom-google-sso)46d49ff0(tip; chain:4d558cb0→0369638d→46d49ff0, all GPG-signed)Validation Run
pnpm --filter openhuman-app format:check— N/A: no frontend files touched; pre-existing main breakage unrelated to this branch.pnpm typecheck— N/A: no TypeScript changed.cargo test --manifest-path app/src-tauri/Cargo.toml webview_accounts— 76 passed, 0 failed, 0 ignored.cargo fmt --checkclean onapp/src-tauri/src/webview_accounts/mod.rs;cargo clippy --manifest-path app/src-tauri/Cargo.toml -- -D warningsclean on changed file (pre-existing warnings elsewhere unrelated).Validation Blocked
command:git push origin fix/1294-zoom-google-sso(without--no-verify)error:husky pre-push hook reportsPre-push checks failed. Please fix format (Prettier + cargo fmt for core and Tauri), lint, TypeScript, and/or Rust errors before pushing.— failures all in pre-existing main-branch code (unused imports inslack_backfill.rs,ops_create.rs,compatible.rs,tools.rs,schemas.rs,browser.rs,agent_harness_public.rs, plus design-token regex check onapp/src/components/commands/). None in files touched by this PR.impact:Pushed with--no-verifyper the project's CLAUDE.md guidance ("If a pre-push hook fails on something unrelated to your changes, push with --no-verify and call it out in the PR body").Behavior Changes
Parity Contract
zoom.us,zoom.com,zoomgov.com,zdassets.com) remain in the allowlist. The existingzoom_allowed_hosts_covers_core_domainstest (line 3337) continues to pass after the host-list extension.popup_should_navigate_parentfor Slack and Google-Meet behavior unchanged.on_new_windowreroute order (rewrite_provider_deep_link→popup_should_navigate_parent→popup_should_stay_in_app→is_provider_native_deep_link_scheme→open_in_system_browser) unchanged.Duplicate / Superseded PR Handling