| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 
							- 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' },
 
-       // ],
 
-     },
 
-   ],
 
- }
 
 
  |