11import Fastify from 'fastify' ;
22import FastifyVite from '@fastify/vite' ;
3+ import cors from '@fastify/cors' ;
34import helmet from '@fastify/helmet' ;
45import { fileURLToPath } from 'node:url' ;
56import path from 'node:path' ;
@@ -12,8 +13,6 @@ import { injectDynatraceTag } from './server/config/dynatrace.js';
1213
1314dotenv . config ( ) ;
1415
15- console . log ( process . env ) ;
16-
1716const { DYNATRACE_SCRIPT_URL } = process . env ;
1817if ( DYNATRACE_SCRIPT_URL ) {
1918 injectDynatraceTag ( DYNATRACE_SCRIPT_URL ) ;
@@ -70,6 +69,33 @@ const fastify = Fastify({
7069Sentry . setupFastifyErrorHandler ( fastify ) ;
7170await fastify . register ( envPlugin ) ;
7271
72+ fastify . register ( cors , {
73+ origin : isLocalDev
74+ ? true // Allow all origins in local development
75+ : ( origin , callback ) => {
76+ // In production, validate against allowed origins
77+ const allowedOrigins =
78+ // @ts -ignore
79+ fastify . config . ALLOWED_CORS_ORIGINS && fastify . config . ALLOWED_CORS_ORIGINS . trim ( )
80+ ? // @ts -ignore
81+ fastify . config . ALLOWED_CORS_ORIGINS . split ( ',' )
82+ // @ts -ignore
83+ . map ( ( o ) => o . trim ( ) )
84+ // @ts -ignore
85+ . filter ( ( o ) => o )
86+ : // @ts -ignore
87+ [ fastify . config . POST_LOGIN_REDIRECT ] ; // Fallback to POST_LOGIN_REDIRECT
88+
89+ if ( ! origin || allowedOrigins . includes ( origin ) ) {
90+ callback ( null , true ) ;
91+ } else {
92+ callback ( null , false ) ;
93+ }
94+ } ,
95+ methods : [ 'GET' , 'HEAD' , 'POST' , 'PUT' , 'PATCH' , 'DELETE' ] ,
96+ credentials : true , // Required for cookie-based sessions
97+ } ) ;
98+
7399let sentryHost = '' ;
74100// @ts -ignore
75101if ( fastify . config . FRONTEND_SENTRY_DSN && fastify . config . FRONTEND_SENTRY_DSN . length > 0 ) {
@@ -94,6 +120,10 @@ if (DYNATRACE_SCRIPT_URL) {
94120fastify . register ( helmet , {
95121 contentSecurityPolicy : {
96122 directives : {
123+ defaultSrc : [ "'self'" ] ,
124+ // styleSrc: unsafe-inline is needed for our styling
125+ styleSrc : [ "'self'" , "'unsafe-inline'" ] ,
126+ imgSrc : [ "'self'" , 'data:' ] ,
97127 'connect-src' : [ "'self'" , 'sdk.openui5.org' , sentryHost , dynatraceOrigin ] ,
98128 'script-src' : isLocalDev
99129 ? [ "'self'" , "'unsafe-inline'" , "'unsafe-eval'" , sentryHost , dynatraceOrigin ]
@@ -102,6 +132,12 @@ fastify.register(helmet, {
102132 'frame-ancestors' : [ ...fastify . config . FRAME_ANCESTORS . split ( ',' ) ] ,
103133 } ,
104134 } ,
135+ // Needed for https enforcement
136+ hsts : {
137+ maxAge : 31536000 ,
138+ includeSubDomains : true ,
139+ preload : true ,
140+ } ,
105141} ) ;
106142
107143fastify . register ( proxy , {
0 commit comments