From fae15f073e3382efa0cb3b4e8dc0b1a3cc6e2653 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Thu, 14 May 2026 21:49:37 +0200 Subject: [PATCH] fix: honor cookieSameSite admin config override #284 --- app/api/auth/session/route.ts | 12 +++++++----- lib/oauth/cookie-config.ts | 15 +++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/api/auth/session/route.ts b/app/api/auth/session/route.ts index 5711df57..7d9dce6c 100644 --- a/app/api/auth/session/route.ts +++ b/app/api/auth/session/route.ts @@ -20,10 +20,12 @@ import { recordLogin } from '@/lib/telemetry/login-tracker'; import { parseJmapServers, resolveTrustedJmapUrl } from '@/lib/admin/jmap-servers'; import { MAX_ACCOUNT_SLOTS } from '@/lib/account-utils'; -const COOKIE_OPTIONS = { - ...getCookieOptions(), - maxAge: SESSION_COOKIE_MAX_AGE, -}; +function sessionCookieOptions() { + return { + ...getCookieOptions(), + maxAge: SESSION_COOKIE_MAX_AGE, + }; +} function getSlot(request: NextRequest): number { const raw = request.nextUrl.searchParams.get('slot'); @@ -88,7 +90,7 @@ export async function POST(request: NextRequest) { : await verifyJmapAuth(upstreamUrl, authHeader, { trusted: false }); const token = encryptSession(normalizedServerUrl, username, password); const cookieStore = await cookies(); - cookieStore.set(cookieName, token, COOKIE_OPTIONS); + cookieStore.set(cookieName, token, sessionCookieOptions()); setStalwartAuthContextInStore(cookieStore, slot, { serverUrl: normalizedServerUrl, username, diff --git a/lib/oauth/cookie-config.ts b/lib/oauth/cookie-config.ts index 5e111a42..96a4d82c 100644 --- a/lib/oauth/cookie-config.ts +++ b/lib/oauth/cookie-config.ts @@ -1,13 +1,16 @@ -const COOKIE_SAME_SITE = (process.env.COOKIE_SAME_SITE || 'lax') as 'lax' | 'none' | 'strict'; -const COOKIE_SECURE = process.env.COOKIE_SECURE !== undefined - ? process.env.COOKIE_SECURE === 'true' - : (COOKIE_SAME_SITE === 'none' || process.env.NODE_ENV === 'production'); +import { configManager } from '@/lib/admin/config-manager'; + +type SameSite = 'lax' | 'none' | 'strict'; export function getCookieOptions() { + const sameSite = configManager.get('cookieSameSite', 'lax'); + const secure = process.env.COOKIE_SECURE !== undefined + ? process.env.COOKIE_SECURE === 'true' + : (sameSite === 'none' || process.env.NODE_ENV === 'production'); return { httpOnly: true, - secure: COOKIE_SECURE, - sameSite: COOKIE_SAME_SITE, + secure, + sameSite, path: '/', maxAge: 30 * 24 * 60 * 60, };