Spaces:
				
			
			
	
			
			
		Paused
		
	
	
	
			
			
	
	
	
	
		
		
		Paused
		
	| 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' }, | |
| // ], | |
| }, | |
| ], | |
| } | |
