/** * @copyright 2026 NHCarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { FastifyPluginAsync } from "fastify"; import fastifyPlugin from "fastify-plugin"; import fastifyHelmet from "@fastify/helmet"; const helmetPlugin: FastifyPluginAsync = async (app) => { await app.register(fastifyHelmet, { contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], // Angular uses inline styles for component encapsulation, so we need to allow them styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"], imgSrc: ["'self'", "data:", "https:"], scriptSrc: ["'self'"], connectSrc: ["'self'", process.env.FRONTEND_URL ?? "http://localhost:4200"], fontSrc: ["'self'", "data:", "https://fonts.gstatic.com"], objectSrc: ["'none'"], baseUri: ["'self'"], formAction: ["'self'"], frameAncestors: ["'none'"], }, }, crossOriginEmbedderPolicy: false, crossOriginResourcePolicy: { policy: "cross-origin" }, // Add additional security headers hsts: { maxAge: 31536000, // 1 year includeSubDomains: true, preload: true, }, frameguard: { action: "deny", }, referrerPolicy: { policy: "strict-origin-when-cross-origin", }, }); }; export default fastifyPlugin(helmetPlugin);