From 21c9242851a5bc83fa6a3f0806698c3928712436 Mon Sep 17 00:00:00 2001 From: 1dabread Date: Wed, 12 Aug 2026 20:26:43 -0500 Subject: [PATCH] fixed cookie https error. admin login should work now --- admin/app/utils/cookie_security.ts | 10 ++++++++++ admin/config/app.ts | 5 +++-- admin/config/session.ts | 6 ++++-- admin/tests/unit/cookie_security.spec.ts | 20 ++++++++++++++++++++ install/management_compose_new.yaml | 2 +- 5 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 admin/app/utils/cookie_security.ts create mode 100644 admin/tests/unit/cookie_security.spec.ts diff --git a/admin/app/utils/cookie_security.ts b/admin/app/utils/cookie_security.ts new file mode 100644 index 0000000..62f7d7a --- /dev/null +++ b/admin/app/utils/cookie_security.ts @@ -0,0 +1,10 @@ +/** + * Decide whether cookies should be marked Secure from the public URL users visit. + */ +export function shouldUseSecureCookies(publicUrl: string): boolean { + try { + return new URL(publicUrl).protocol === 'https:' + } catch { + return false + } +} diff --git a/admin/config/app.ts b/admin/config/app.ts index 1292af7..1a21c07 100644 --- a/admin/config/app.ts +++ b/admin/config/app.ts @@ -1,7 +1,7 @@ import env from '#start/env' -import app from '@adonisjs/core/services/app' import { Secret } from '@adonisjs/core/helpers' import { defineConfig } from '@adonisjs/core/http' +import { shouldUseSecureCookies } from '../app/utils/cookie_security.js' /** * The app key is used for encrypting cookies, generating signed URLs, @@ -11,6 +11,7 @@ import { defineConfig } from '@adonisjs/core/http' * changed. Therefore it is recommended to keep the app key secure. */ export const appKey = new Secret(env.get('APP_KEY')) +const secureCookies = shouldUseSecureCookies(env.get('URL')) /** * The configuration settings used by the HTTP server @@ -34,7 +35,7 @@ export const http = defineConfig({ path: '/', maxAge: '2h', httpOnly: true, - secure: app.inProduction, + secure: secureCookies, sameSite: 'lax', }, }) diff --git a/admin/config/session.ts b/admin/config/session.ts index 7c2c017..acff597 100644 --- a/admin/config/session.ts +++ b/admin/config/session.ts @@ -1,7 +1,9 @@ import env from '#start/env' -import app from '@adonisjs/core/services/app' +import { shouldUseSecureCookies } from '../app/utils/cookie_security.js' import { defineConfig, stores } from '@adonisjs/session' +const secureCookies = shouldUseSecureCookies(env.get('URL')) + const sessionConfig = defineConfig({ enabled: true, cookieName: 'nomad-admin-session', @@ -22,7 +24,7 @@ const sessionConfig = defineConfig({ cookie: { path: '/', httpOnly: true, - secure: app.inProduction, + secure: secureCookies, sameSite: 'lax', }, diff --git a/admin/tests/unit/cookie_security.spec.ts b/admin/tests/unit/cookie_security.spec.ts new file mode 100644 index 0000000..30feabc --- /dev/null +++ b/admin/tests/unit/cookie_security.spec.ts @@ -0,0 +1,20 @@ +import * as assert from 'node:assert/strict' +import { test } from 'node:test' + +import { shouldUseSecureCookies } from '../../app/utils/cookie_security.js' + +test('enables secure cookies for HTTPS public URLs', () => { + assert.equal(shouldUseSecureCookies('https://nomad.example.com'), true) + assert.equal(shouldUseSecureCookies('https://nomad.example.com:8443/admin'), true) +}) + +test('disables secure cookies for HTTP public URLs', () => { + assert.equal(shouldUseSecureCookies('http://home'), false) + assert.equal(shouldUseSecureCookies('http://localhost:8080'), false) + assert.equal(shouldUseSecureCookies('http://192.168.1.10:8080'), false) +}) + +test('disables secure cookies when the public URL is invalid', () => { + assert.equal(shouldUseSecureCookies('replaceme'), false) + assert.equal(shouldUseSecureCookies(''), false) +}) diff --git a/install/management_compose_new.yaml b/install/management_compose_new.yaml index e385529..2b3d54d 100644 --- a/install/management_compose_new.yaml +++ b/install/management_compose_new.yaml @@ -9,7 +9,7 @@ name: project-nomad services: admin: - image: nomad:app-button + image: nomad:admin-user container_name: nomad_admin restart: unless-stopped extra_hosts: