From 8871e49d153db694933537a6ac28219d7761478b Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Tue, 4 Aug 2026 17:43:17 -0400 Subject: [PATCH 1/2] fix(proxy): update redirect logic for signed-out users - Changed the redirect behavior for unauthenticated users to use the `sendTo` function instead of a direct URL redirect to the sign-in path. - This modification enhances the proxy's handling of user access based on authentication status. --- apps/app/proxy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/proxy.ts b/apps/app/proxy.ts index 7d982aaa..f9cdee7d 100644 --- a/apps/app/proxy.ts +++ b/apps/app/proxy.ts @@ -28,7 +28,7 @@ export async function proxy(request: NextRequest) { ) { return isPublic(pathname) ? NextResponse.next() - : NextResponse.redirect(new URL(SIGN_IN_PATH, request.nextUrl)); + : sendTo(SIGN_IN_PATH, request); } if (isUngated(pathname)) return NextResponse.next(); From 73875f0cc22852a035a4f832beb3ced6d111decd Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Tue, 4 Aug 2026 17:44:16 -0400 Subject: [PATCH 2/2] fix(proxy): refine redirect logic for sign-in path - Updated the proxy to ensure that requests to the sign-in path do not trigger a redirect, maintaining user experience for unauthenticated users. - Adjusted the public access logic to streamline the handling of landing page visibility based on authentication status. --- apps/app/proxy.ts | 12 +++++------- apps/app/test/onboarding-gate.spec.ts | 13 +++++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/app/proxy.ts b/apps/app/proxy.ts index f9cdee7d..4d955154 100644 --- a/apps/app/proxy.ts +++ b/apps/app/proxy.ts @@ -14,21 +14,21 @@ const LANDING_PATH = "/"; const SIGN_IN_PATH = "/sign-in"; -const PUBLIC = [SIGN_IN_PATH]; - -const UNGATED = [SIGN_IN_PATH, "/grant-access", "/eve"]; +const UNGATED = ["/grant-access", "/eve"]; const SECTIONS = ["/companies", "/contacts", "/deals", "/settings"]; export async function proxy(request: NextRequest) { const { pathname } = request.nextUrl; + if (pathname === SIGN_IN_PATH) return NextResponse.next(); + if ( getSessionCookie(request, { cookiePrefix: AUTH_COOKIE_PREFIX }) === null ) { return isPublic(pathname) ? NextResponse.next() - : sendTo(SIGN_IN_PATH, request); + : NextResponse.redirect(new URL(SIGN_IN_PATH, request.nextUrl)); } if (isUngated(pathname)) return NextResponse.next(); @@ -71,9 +71,7 @@ function isUnder(pathname: string, prefix: string): boolean { } function isPublic(pathname: string): boolean { - if (pathname === LANDING_PATH) return isMarketing(); - - return PUBLIC.some((prefix) => isUnder(pathname, prefix)); + return pathname === LANDING_PATH && isMarketing(); } function isUngated(pathname: string): boolean { diff --git a/apps/app/test/onboarding-gate.spec.ts b/apps/app/test/onboarding-gate.spec.ts index 42122b76..b1bd45e1 100644 --- a/apps/app/test/onboarding-gate.spec.ts +++ b/apps/app/test/onboarding-gate.spec.ts @@ -170,6 +170,19 @@ describe("proxy", () => { expect(redirectedTo(await proxy(request("/sign-in")))).toBeNull(); }); + it("never aims a redirect at the sign-in page itself", async () => { + marketing(undefined); + setup({ onboarded: false, configured: false }); + + expect(redirectedTo(await proxy(request("/sign-in")))).toBeNull(); + expect( + redirectedTo(await proxy(request("/sign-in", [SESSION_COOKIE]))), + ).toBeNull(); + expect( + redirectedTo(await proxy(request("/sign-in?method=google"))), + ).toBeNull(); + }); + it("reads the flag on every request, and only the literal true turns it on", async () => { marketing("false"); expect(redirectedTo(await proxy(request("/")))).toBe("/sign-in");