12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import type { NextRequest } from 'next/server'
- import { NextResponse } from 'next/server'
- const NECESSARY_DOMAIN = '*.sentry.io http://localhost:* http://127.0.0.1:* https://analytics.google.com googletagmanager.com *.googletagmanager.com https://www.google-analytics.com https://api.github.com'
- export function middleware(request: NextRequest) {
- const isWhiteListEnabled = !!process.env.NEXT_PUBLIC_CSP_WHITELIST && process.env.NODE_ENV === 'production'
- if (!isWhiteListEnabled)
- return NextResponse.next()
- const whiteList = `${process.env.NEXT_PUBLIC_CSP_WHITELIST} ${NECESSARY_DOMAIN}`
- const nonce = Buffer.from(crypto.randomUUID()).toString('base64')
- const csp = `'nonce-${nonce}'`
- const scheme_source = 'data: mediastream: blob: filesystem:'
- const cspHeader = `
- default-src 'self' ${scheme_source} ${csp} ${whiteList};
- connect-src 'self' ${scheme_source} ${csp} ${whiteList};
- script-src 'self' ${scheme_source} ${csp} ${whiteList};
- style-src 'self' 'unsafe-inline' ${scheme_source} ${whiteList};
- worker-src 'self' ${scheme_source} ${csp} ${whiteList};
- media-src 'self' ${scheme_source} ${csp} ${whiteList};
- img-src 'self' ${scheme_source} ${csp} ${whiteList};
- font-src 'self';
- object-src 'none';
- base-uri 'self';
- form-action 'self';
- upgrade-insecure-requests;
- `
- // Replace newline characters and spaces
- const contentSecurityPolicyHeaderValue = cspHeader
- .replace(/\s{2,}/g, ' ')
- .trim()
- const requestHeaders = new Headers(request.headers)
- requestHeaders.set('x-nonce', nonce)
- requestHeaders.set(
- 'Content-Security-Policy',
- contentSecurityPolicyHeaderValue,
- )
- const response = NextResponse.next({
- request: {
- headers: requestHeaders,
- },
- })
- response.headers.set(
- 'Content-Security-Policy',
- contentSecurityPolicyHeaderValue,
- )
- return response
- }
- export const config = {
- matcher: [
- /*
- * Match all request paths except for the ones starting with:
- * - api (API routes)
- * - _next/static (static files)
- * - _next/image (image optimization files)
- * - favicon.ico (favicon file)
- */
- {
- // source: '/((?!api|_next/static|_next/image|favicon.ico).*)',
- source: '/((?!_next/static|_next/image|favicon.ico).*)',
- // source: '/(.*)',
- // missing: [
- // { type: 'header', key: 'next-router-prefetch' },
- // { type: 'header', key: 'purpose', value: 'prefetch' },
- // ],
- },
- ],
- }
|