From 28c278d769710fe8e786286c432e1d5c60358b92 Mon Sep 17 00:00:00 2001 From: cryppadotta <34892728+cryppadotta@users.noreply.github.com> Date: Wed, 7 Oct 2026 22:57:07 +0000 Subject: [PATCH] fix: keep callback handoff navigation single use Include rendered screenshot evidence for the callback page layouts. Co-Authored-By: Paperclip --- .../oauth-callback-pages/error-desktop.png | Bin 0 -> 36556 bytes .../oauth-callback-pages/success-mobile.png | Bin 0 -> 24081 bytes server/src/oauth-callback-page.ts | 6 +++--- .../tool-access-connection-intent.test.ts | 8 ++++++++ server/src/routes/tool-access.ts | 3 ++- 5 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 doc/assets/oauth-callback-pages/error-desktop.png create mode 100644 doc/assets/oauth-callback-pages/success-mobile.png diff --git a/doc/assets/oauth-callback-pages/error-desktop.png b/doc/assets/oauth-callback-pages/error-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4a9ebb1a3dc70910d61c32d413855ee54b323d GIT binary patch literal 36556 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
FmEz4GBMf$3S5R5FE4!C7v4YV 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 fe;gtwiNl|4G=t(dLgeLp) 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 S0tE005AufD^^$AuPyP+q101UW literal 0 HcmV?d00001 diff --git a/server/src/oauth-callback-page.ts b/server/src/oauth-callback-page.ts index 82c857926c4..22dd2497744 100644 --- a/server/src/oauth-callback-page.ts +++ b/server/src/oauth-callback-page.ts @@ -8,8 +8,8 @@ export function escapeCallbackHtml(value: string): string { export function oauthCallbackPage(input: { title: string; description: string; - actionHref: string; - actionLabel: string; + actionHref?: string; + actionLabel?: string; state?: "success" | "error" | "pending"; head?: string; script?: string; @@ -19,7 +19,7 @@ export function oauthCallbackPage(input: { :root{color-scheme:light dark;--bg:#faf9f6;--card:#fff;--text:#242320;--muted:#68665f;--line:#e5e3dc;--accent:#345d45} @media(prefers-color-scheme:dark){:root{--bg:#191a18;--card:#22231f;--text:#f2f1eb;--muted:#b1b2a8;--line:#3b3d35;--accent:#a5d3b4}} *{box-sizing:border-box}body{margin:0;min-height:100svh;display:grid;place-items:center;padding:24px;background:var(--bg);color:var(--text);font:16px/1.6 system-ui,sans-serif}main{width:100%;max-width:460px;padding:36px;background:var(--card);border:1px solid var(--line);border-radius:16px}.brand{font-weight:650;letter-spacing:-.03em;margin-bottom:36px}.mark{display:inline-block;margin-right:8px;color:var(--accent)}.status{display:grid;place-items:center;width:44px;height:44px;border:1px solid var(--line);border-radius:50%;font-size:24px;color:var(--accent)}h1{font-size:26px;line-height:1.25;letter-spacing:-.025em;margin:20px 0 12px}p{color:var(--muted);margin:0 0 28px}a{display:inline-block;background:var(--text);color:var(--card);padding:10px 18px;border-radius:8px;text-decoration:none;font-weight:600}a:focus-visible{outline:3px solid var(--accent);outline-offset:4px}.note{font-size:13px;margin:24px 0 0}@media(max-width:480px){main{padding:24px}} -

Paperclip

${escape(input.title)}

${escape(input.description)}

${escape(input.actionLabel)}

You can close this window and return to Paperclip.

${input.script ? `` : ""}`; +
Paperclip

${escape(input.title)}

${escape(input.description)}

${input.actionHref && input.actionLabel ? `${escape(input.actionLabel)}` : ""}

You can close this window and return to Paperclip.

${input.script ? `` : ""}`; } const callbackPaths = new Set([ diff --git a/server/src/routes/tool-access-connection-intent.test.ts b/server/src/routes/tool-access-connection-intent.test.ts index fa033141e2d..b407925d74a 100644 --- a/server/src/routes/tool-access-connection-intent.test.ts +++ b/server/src/routes/tool-access-connection-intent.test.ts @@ -3,6 +3,7 @@ import { cloudConnectorEnrollmentReturnPath, cloudConnectorEnrollmentOutcomeHtml, connectionIntentOAuthOutcomeHtml, + oauthCallbackInterstitialHtml, } from "./tool-access.js"; describe("Cloud connector enrollment return path", () => { @@ -117,3 +118,10 @@ describe("inline enrollment completion", () => { expect(html).not.toContain("/apps/connect"); }); }); + + it("offers only one navigation for the single-use callback handoff", () => { + const html = oauthCallbackInterstitialHtml("/api/tools/oauth/callback?state=one&code=two"); + expect(html.match(/http-equiv="refresh"/g)).toHaveLength(1); + expect(html).not.toContain(""); + }); diff --git a/server/src/routes/tool-access.ts b/server/src/routes/tool-access.ts index 737d71b113d..019cf749881 100644 --- a/server/src/routes/tool-access.ts +++ b/server/src/routes/tool-access.ts @@ -224,7 +224,8 @@ export function oauthCallbackInterstitialHtml(continuePath: string): string { // two racing follow-ups would let the loser render an expired-state error. return oauthCallbackPage({ title: "Finishing connection", description: "Please wait while Paperclip finishes connecting your app.", - actionHref: continuePath, actionLabel: "Continue to Paperclip", state: "pending", + // No link: a second navigation can race the single-use automatic refresh. + state: "pending", head: ``, }); }