import { NextResponse } from 'next/server'; import { logger } from '@/lib/logger'; import { configManager } from '@/lib/admin/config-manager'; import { readFileEnv } from '@/lib/read-file-env'; import { parseJmapServers, redactJmapServers } from '@/lib/admin/jmap-servers'; /** * Runtime configuration endpoint * * This endpoint serves configuration values that can be set at runtime * via environment variables or admin dashboard overrides, enabling * post-build configuration for Docker deployments. * * Priority order: * 1. Admin dashboard overrides (data/admin/config.json) * 2. Runtime env vars (APP_NAME, JMAP_SERVER_URL) * 3. Build-time env vars (NEXT_PUBLIC_APP_NAME, NEXT_PUBLIC_JMAP_SERVER_URL) * 4. Default values */ export async function GET() { logger.debug('Config requested'); await configManager.ensureLoaded(); const appName = configManager.get('appName') || process.env.NEXT_PUBLIC_APP_NAME || 'Webmail'; const jmapServerUrl = configManager.get('jmapServerUrl') || process.env.NEXT_PUBLIC_JMAP_SERVER_URL || ''; const oauthEnabled = configManager.get('oauthEnabled', false); const oauthOnly = oauthEnabled && configManager.get('oauthOnly', false); const stalwartFeaturesEnabled = configManager.get('stalwartFeaturesEnabled', true); const allowedFrameAncestors = configManager.get('allowedFrameAncestors', ''); return NextResponse.json({ appName, jmapServerUrl, oauthEnabled, oauthOnly, oauthClientId: configManager.get('oauthClientId', ''), oauthIssuerUrl: configManager.get('oauthIssuerUrl', ''), rememberMeEnabled: !!process.env.SESSION_SECRET || !!readFileEnv(process.env.SESSION_SECRET_FILE), settingsSyncEnabled: configManager.get('settingsSyncEnabled', false) && (!!process.env.SESSION_SECRET || !!readFileEnv(process.env.SESSION_SECRET_FILE)), stalwartFeaturesEnabled, devMode: configManager.get('devMode', false), faviconUrl: configManager.get('faviconUrl', '/branding/Bulwark_Favicon.svg'), appLogoLightUrl: configManager.get('appLogoLightUrl', ''), appLogoDarkUrl: configManager.get('appLogoDarkUrl', ''), loginLogoLightUrl: configManager.get('loginLogoLightUrl', '/branding/Bulwark_Logo_Color.svg'), loginLogoDarkUrl: configManager.get('loginLogoDarkUrl', '/branding/Bulwark_Logo_White.svg'), loginCompanyName: configManager.get('loginCompanyName', ''), loginImprintUrl: configManager.get('loginImprintUrl', ''), loginPrivacyPolicyUrl: configManager.get('loginPrivacyPolicyUrl', ''), loginWebsiteUrl: configManager.get('loginWebsiteUrl', ''), demoMode: configManager.get('demoMode', false), allowCustomJmapEndpoint: configManager.get('allowCustomJmapEndpoint', false), jmapServers: redactJmapServers(parseJmapServers(configManager.get('jmapServers', []))), jmapServerAutoPickByDomain: configManager.get('jmapServerAutoPickByDomain', false), autoSsoEnabled: configManager.get('autoSsoEnabled', false), embeddedMode: !!allowedFrameAncestors && allowedFrameAncestors !== "'none'", parentOrigin: configManager.get('parentOrigin', ''), }); }