From ea1468c89206ae12dba6fff4e1febe5b5340b7dc Mon Sep 17 00:00:00 2001 From: spastorelli Date: Thu, 19 Dec 2024 11:16:06 +0100 Subject: [PATCH] Send redirectOnError param to getPublishedContent when token is pulled from cookie (#2626) --- .changeset/nasty-apricots-wash.md | 6 ++ bun.lockb | Bin 574840 -> 574448 bytes packages/gitbook/e2e/pages.spec.ts | 76 ++++++++++++++++++++++- packages/gitbook/package.json | 2 +- packages/gitbook/src/lib/api.ts | 2 + packages/gitbook/src/lib/visitor-auth.ts | 10 +++ packages/gitbook/src/middleware.ts | 14 ++++- packages/react-contentkit/package.json | 2 +- 8 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 .changeset/nasty-apricots-wash.md diff --git a/.changeset/nasty-apricots-wash.md b/.changeset/nasty-apricots-wash.md new file mode 100644 index 000000000..fc9c8b3b5 --- /dev/null +++ b/.changeset/nasty-apricots-wash.md @@ -0,0 +1,6 @@ +--- +'@gitbook/react-contentkit': minor +'gitbook': minor +--- + +Send redirectOnError param to getPublishedContent when token is pulled from cookie diff --git a/bun.lockb b/bun.lockb index 55de3ded1de276d255454b74fdcfc39d5b212df4..1b543f8ea330aea3c30ab1f90258494628cab81e 100755 GIT binary patch delta 48354 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 delta 48090 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 diff --git a/packages/gitbook/e2e/pages.spec.ts b/packages/gitbook/e2e/pages.spec.ts index 7d545604d..85609eeaf 100644 --- a/packages/gitbook/e2e/pages.spec.ts +++ b/packages/gitbook/e2e/pages.spec.ts @@ -6,20 +6,25 @@ import { CustomizationHeaderPreset, CustomizationIconsStyle, CustomizationLocale, + CustomizationSidebarBackgroundStyle, + CustomizationSidebarListStyle, CustomizationThemeMode, SiteCustomizationSettings, } from '@gitbook/api'; -import { test, expect, Page } from '@playwright/test'; +import { test, expect, Page, BrowserContext } from '@playwright/test'; import deepMerge from 'deepmerge'; import jwt from 'jsonwebtoken'; import rison from 'rison'; import { DeepPartial } from 'ts-essentials'; +import { getVisitorAuthCookieName, getVisitorAuthCookieValue } from '@/lib/visitor-auth'; + import { getContentTestURL } from '../tests/utils'; interface Test { name: string; url: string; // URL to visit for testing + cookies?: Parameters[0]; run?: (page: Page) => Promise; // The test to run fullPage?: boolean; // Whether the test should be fullscreened during testing screenshot?: false; // Should a screenshot be stored @@ -867,6 +872,60 @@ const testCases: TestsCase[] = [ }, ], }, + { + name: 'Visitor Auth - Site (redirects to fallback/auth URL)', + baseUrl: `https://gitbook-open-e2e-sites.gitbook.io/va-site-redirects-fallback/`, + tests: [ + { + name: 'Redirect to fallback on invalid token pulled from cookie', + url: '', + screenshot: false, + cookies: (() => { + const basePath = '/va-site-redirects-fallback/'; + const invalidToken = jwt.sign( + { + name: 'gitbook-open-tests', + }, + 'invalidKey', + { + expiresIn: '24h', + }, + ); + return [ + { + name: getVisitorAuthCookieName(basePath), + value: getVisitorAuthCookieValue(basePath, invalidToken), + httpOnly: true, + }, + ]; + })(), + run: async (page) => { + await expect(page).toHaveURL(/https:\/\/www.google.com/); + }, + }, + { + name: 'Show error message when invalid token is passed to url', + screenshot: false, + url: (() => { + const token = jwt.sign( + { + name: 'gitbook-open-tests', + }, + 'invalidKey', + { + expiresIn: '24h', + }, + ); + return `?jwt_token=${token}`; + })(), + run: async (page) => { + await expect(page.locator('pre')).toContainText( + 'Error while validating the JWT token. Reason: The token signature is invalid.', + ); + }, + }, + ], + }, { name: 'Languages', baseUrl: 'https://gitbook.gitbook.io/test-gitbook-open/', @@ -1112,9 +1171,18 @@ for (const testCase of testCases) { test.describe(testCase.name, () => { for (const testEntry of testCase.tests) { const testFn = testEntry.only ? test.only : test; - testFn(testEntry.name, async ({ page, baseURL }) => { + testFn(testEntry.name, async ({ page, baseURL, context }) => { const contentUrl = new URL(testEntry.url, testCase.baseUrl); const url = getContentTestURL(contentUrl.toString(), baseURL); + if (testEntry.cookies) { + await context.addCookies( + testEntry.cookies.map((cookie) => ({ + ...cookie, + domain: new URL(url).host, + path: '/', + })), + ); + } await page.goto(url); if (testEntry.run) { await testEntry.run(page); @@ -1152,6 +1220,10 @@ function getCustomizationURL(partial: DeepPartial): s font: CustomizationFont.Inter, background: CustomizationBackground.Plain, icons: CustomizationIconsStyle.Regular, + sidebar: { + background: CustomizationSidebarBackgroundStyle.Default, + list: CustomizationSidebarListStyle.Default, + }, }, internationalization: { locale: CustomizationLocale.En, diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index f359a16ae..e508d3287 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -16,7 +16,7 @@ "clean": "rm -rf ./.next && rm -rf ./public/~gitbook/static" }, "dependencies": { - "@gitbook/api": "^0.81.0", + "@gitbook/api": "^0.83.0", "@gitbook/cache-do": "workspace:*", "@gitbook/emoji-codepoints": "workspace:*", "@gitbook/icons": "workspace:*", diff --git a/packages/gitbook/src/lib/api.ts b/packages/gitbook/src/lib/api.ts index b96f4dbca..e9f30bcc6 100644 --- a/packages/gitbook/src/lib/api.ts +++ b/packages/gitbook/src/lib/api.ts @@ -214,6 +214,7 @@ export const getPublishedContentByUrl = cache({ get: async ( url: string, visitorAuthToken: string | undefined, + redirectOnError: boolean | undefined, options: CacheFunctionOptions, ) => { try { @@ -221,6 +222,7 @@ export const getPublishedContentByUrl = cache({ { url, visitorAuthToken, + redirectOnError, }, { signal: options.signal, diff --git a/packages/gitbook/src/lib/visitor-auth.ts b/packages/gitbook/src/lib/visitor-auth.ts index ef52ade8e..6a1023687 100644 --- a/packages/gitbook/src/lib/visitor-auth.ts +++ b/packages/gitbook/src/lib/visitor-auth.ts @@ -12,6 +12,16 @@ export type VisitorAuthCookieValue = { token: string; }; +export function isVisitorAuthTokenFromCookies( + visitorAuthToken: NonNullable>, +) { + return ( + typeof visitorAuthToken !== 'string' && + 'basePath' in visitorAuthToken && + 'token' in visitorAuthToken + ); +} + /** * Get the visitor authentication token for the request. This token can either be in the * query parameters or stored as a cookie. diff --git a/packages/gitbook/src/middleware.ts b/packages/gitbook/src/middleware.ts index 2dfa807f2..3a15a3789 100644 --- a/packages/gitbook/src/middleware.ts +++ b/packages/gitbook/src/middleware.ts @@ -27,6 +27,7 @@ import { getVisitorAuthCookieName, getVisitorAuthCookieValue, getVisitorAuthToken, + isVisitorAuthTokenFromCookies, normalizeVisitorAuthURL, } from '@/lib/visitor-auth'; @@ -685,14 +686,21 @@ async function lookupSiteByAPI( `lookup content for url "${url.toString()}", with ${lookup.urls.length} alternatives`, ); + // When the visitor auth token is pulled from the cookie, set redirectOnError when calling getPublishedContentByUrl to allow + // redirecting when the token is invalid as we could be dealing with stale token stored in the cookie. + // For example when the VA backend signature has changed but the token stored in the cookie is not yet expired. + const redirectOnError = + typeof visitorAuthToken !== 'undefined' && isVisitorAuthTokenFromCookies(visitorAuthToken); + const result = await race(lookup.urls, async (alternative, { signal }) => { const data = await getPublishedContentByUrl( alternative.url, typeof visitorAuthToken === 'undefined' ? undefined - : typeof visitorAuthToken === 'string' - ? visitorAuthToken - : visitorAuthToken.token, + : isVisitorAuthTokenFromCookies(visitorAuthToken) + ? visitorAuthToken.token + : visitorAuthToken, + typeof visitorAuthToken === 'undefined' ? undefined : redirectOnError, { signal, }, diff --git a/packages/react-contentkit/package.json b/packages/react-contentkit/package.json index 82b92e432..c8f9b8c10 100644 --- a/packages/react-contentkit/package.json +++ b/packages/react-contentkit/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "classnames": "^2.5.1", - "@gitbook/api": "^0.77.0", + "@gitbook/api": "^0.83.0", "assert-never": "^1.2.1" }, "peerDependencies": {