You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					46 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					46 lines
				
				1.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const { test } = require('tap')
							 | 
						||
| 
								 | 
							
								const Fastify = require('fastify')
							 | 
						||
| 
								 | 
							
								const fastifySwagger = require('../index')
							 | 
						||
| 
								 | 
							
								const fastifyHelmet = require('fastify-helmet')
							 | 
						||
| 
								 | 
							
								const swaggerCSP = require('../static/csp.json')
							 | 
						||
| 
								 | 
							
								test('fastify will response swagger csp', t => {
							 | 
						||
| 
								 | 
							
								  t.plan(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const scriptCSP = swaggerCSP.script.length > 0 ? ` ${swaggerCSP.script.join(' ')}` : ''
							 | 
						||
| 
								 | 
							
								  const styleCSP = swaggerCSP.style.length > 0 ? ` ${swaggerCSP.style.join(' ')}` : ''
							 | 
						||
| 
								 | 
							
								  const csp = `default-src 'self';img-src 'self' data: validator.swagger.io;script-src 'self'${scriptCSP};style-src 'self' https:${styleCSP}`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const fastify = Fastify()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fastify.register(fastifySwagger)
							 | 
						||
| 
								 | 
							
								  fastify.register(fastifyHelmet, instance => {
							 | 
						||
| 
								 | 
							
								    return {
							 | 
						||
| 
								 | 
							
								      contentSecurityPolicy: {
							 | 
						||
| 
								 | 
							
								        directives: {
							 | 
						||
| 
								 | 
							
								          defaultSrc: ["'self'"],
							 | 
						||
| 
								 | 
							
								          imgSrc: ["'self'", 'data:', 'validator.swagger.io'],
							 | 
						||
| 
								 | 
							
								          scriptSrc: ["'self'"].concat(instance.swaggerCSP.script),
							 | 
						||
| 
								 | 
							
								          styleSrc: ["'self'", 'https:'].concat(instance.swaggerCSP.style)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // route for testing CSP headers
							 | 
						||
| 
								 | 
							
								  fastify.get('/', (req, reply) => {
							 | 
						||
| 
								 | 
							
								    reply.send({
							 | 
						||
| 
								 | 
							
								      foo: 'bar'
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fastify.inject({
							 | 
						||
| 
								 | 
							
								    method: 'GET',
							 | 
						||
| 
								 | 
							
								    url: '/'
							 | 
						||
| 
								 | 
							
								  }, (err, res) => {
							 | 
						||
| 
								 | 
							
								    t.error(err)
							 | 
						||
| 
								 | 
							
								    t.same(res.headers['content-security-policy'], csp)
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 |