import { FastifyReply, FastifyRequest } from "fastify"; import { config } from "../config/env"; export async function securityHeaders( _request: FastifyRequest, reply: FastifyReply, ): Promise { reply.header("X-Content-Type-Options", "nosniff"); reply.header("X-Frame-Options", "DENY"); reply.header("Referrer-Policy", "strict-origin-when-cross-origin"); reply.header( "Permissions-Policy", "camera=(), microphone=(), geolocation=(self)", ); if (config.isProduction) { reply.header( "Strict-Transport-Security", "max-age=31536000; includeSubDomains", ); reply.header( "Content-Security-Policy", [ "default-src 'self'", "script-src 'self'", "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com", "font-src 'self' https://fonts.gstatic.com", "img-src 'self' data: blob: https://*.tile.openstreetmap.org", "connect-src 'self' https://nominatim.openstreetmap.org", ].join("; "), ); } }