const express = require('express'); const path = require('path'); const crypto = require('crypto'); const fs = require('fs'); const app = express(); const port = 8080; // Generate a random nonce function generateNonce() { return crypto.randomBytes(16).toString('base64'); } // Security headers middleware app.use((req, res, next) => { const nonce = generateNonce(); res.locals.nonce = nonce; // Content Security Policy with nonce and hash res.setHeader( 'Content-Security-Policy', "default-src 'self'; " + `script-src 'self' 'nonce-${nonce}' 'sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544='; ` + "style-src 'self' 'unsafe-inline'; " + "img-src 'self' data: https: http:; " + "font-src 'self'; " + "connect-src 'self'" ); // Other security headers res.setHeader('X-Content-Type-Options', 'nosniff'); res.setHeader('X-Frame-Options', 'DENY'); res.setHeader('X-XSS-Protection', '1; mode=block'); res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin'); res.setHeader('Permissions-Policy', 'geolocation=(), microphone=(), camera=()'); res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains'); next(); }); // Custom middleware to inject nonce into HTML app.use((req, res, next) => { if (req.path.endsWith('.html')) { const filePath = path.join(__dirname, '../docker/resume', req.path); let html = fs.readFileSync(filePath, 'utf8'); // Add nonce to all script tags html = html.replace(/