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.
		
		
		
		
		
			
		
			
				
					179 lines
				
				4.9 KiB
			
		
		
			
		
	
	
					179 lines
				
				4.9 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const t = require('tap')
							 | 
						||
| 
								 | 
							
								const { test, before } = t
							 | 
						||
| 
								 | 
							
								const sget = require('simple-get').concat
							 | 
						||
| 
								 | 
							
								const fastify = require('..')
							 | 
						||
| 
								 | 
							
								const dns = require('dns').promises
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const sgetForwardedRequest = (app, forHeader, path, protoHeader) => {
							 | 
						||
| 
								 | 
							
								  const headers = {
							 | 
						||
| 
								 | 
							
								    'X-Forwarded-For': forHeader,
							 | 
						||
| 
								 | 
							
								    'X-Forwarded-Host': 'example.com'
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (protoHeader) {
							 | 
						||
| 
								 | 
							
								    headers['X-Forwarded-Proto'] = protoHeader
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  sget({
							 | 
						||
| 
								 | 
							
								    method: 'GET',
							 | 
						||
| 
								 | 
							
								    headers,
							 | 
						||
| 
								 | 
							
								    url: 'http://localhost:' + app.server.address().port + path
							 | 
						||
| 
								 | 
							
								  }, () => {})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const testRequestValues = (t, req, options) => {
							 | 
						||
| 
								 | 
							
								  if (options.ip) {
							 | 
						||
| 
								 | 
							
								    t.ok(req.ip, 'ip is defined')
							 | 
						||
| 
								 | 
							
								    t.equal(req.ip, options.ip, 'gets ip from x-forwarded-for')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (options.hostname) {
							 | 
						||
| 
								 | 
							
								    t.ok(req.hostname, 'hostname is defined')
							 | 
						||
| 
								 | 
							
								    t.equal(req.hostname, options.hostname, 'gets hostname from x-forwarded-host')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (options.ips) {
							 | 
						||
| 
								 | 
							
								    t.same(req.ips, options.ips, 'gets ips from x-forwarded-for')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (options.protocol) {
							 | 
						||
| 
								 | 
							
								    t.ok(req.protocol, 'protocol is defined')
							 | 
						||
| 
								 | 
							
								    t.equal(req.protocol, options.protocol, 'gets protocol from x-forwarded-proto')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let localhost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								before(async function () {
							 | 
						||
| 
								 | 
							
								  const lookup = await dns.lookup('localhost')
							 | 
						||
| 
								 | 
							
								  localhost = lookup.address
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('trust proxy, not add properties to node req', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(8)
							 | 
						||
| 
								 | 
							
								  const app = fastify({
							 | 
						||
| 
								 | 
							
								    trustProxy: true
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxy', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1', hostname: 'example.com' })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxychain', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '2.2.2.2', ips: [localhost, '1.1.1.1', '2.2.2.2'] })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.teardown(app.close.bind(app))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.listen(0, (err) => {
							 | 
						||
| 
								 | 
							
								    app.server.unref()
							 | 
						||
| 
								 | 
							
								    t.error(err)
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '1.1.1.1', '/trustproxy')
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '2.2.2.2, 1.1.1.1', '/trustproxychain')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('trust proxy chain', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(3)
							 | 
						||
| 
								 | 
							
								  const app = fastify({
							 | 
						||
| 
								 | 
							
								    trustProxy: [localhost, '192.168.1.1']
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxychain', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1' })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.teardown(app.close.bind(app))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.listen(0, (err) => {
							 | 
						||
| 
								 | 
							
								    app.server.unref()
							 | 
						||
| 
								 | 
							
								    t.error(err)
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '192.168.1.1, 1.1.1.1', '/trustproxychain')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('trust proxy function', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(3)
							 | 
						||
| 
								 | 
							
								  const app = fastify({
							 | 
						||
| 
								 | 
							
								    trustProxy: (address) => address === localhost
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxyfunc', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1' })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.teardown(app.close.bind(app))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.listen(0, (err) => {
							 | 
						||
| 
								 | 
							
								    app.server.unref()
							 | 
						||
| 
								 | 
							
								    t.error(err)
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '1.1.1.1', '/trustproxyfunc')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('trust proxy number', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(4)
							 | 
						||
| 
								 | 
							
								  const app = fastify({
							 | 
						||
| 
								 | 
							
								    trustProxy: 1
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxynumber', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1', ips: [localhost, '1.1.1.1'] })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.teardown(app.close.bind(app))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.listen(0, (err) => {
							 | 
						||
| 
								 | 
							
								    app.server.unref()
							 | 
						||
| 
								 | 
							
								    t.error(err)
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '2.2.2.2, 1.1.1.1', '/trustproxynumber')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('trust proxy IP addresses', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(4)
							 | 
						||
| 
								 | 
							
								  const app = fastify({
							 | 
						||
| 
								 | 
							
								    trustProxy: `${localhost}, 2.2.2.2`
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxyipaddrs', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1', ips: [localhost, '1.1.1.1'] })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.teardown(app.close.bind(app))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.listen(0, (err) => {
							 | 
						||
| 
								 | 
							
								    app.server.unref()
							 | 
						||
| 
								 | 
							
								    t.error(err)
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '3.3.3.3, 2.2.2.2, 1.1.1.1', '/trustproxyipaddrs')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('trust proxy protocol', (t) => {
							 | 
						||
| 
								 | 
							
								  t.plan(13)
							 | 
						||
| 
								 | 
							
								  const app = fastify({
							 | 
						||
| 
								 | 
							
								    trustProxy: true
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxyprotocol', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'lorem' })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxynoprotocol', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'http' })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  app.get('/trustproxyprotocols', function (req, reply) {
							 | 
						||
| 
								 | 
							
								    testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'dolor' })
							 | 
						||
| 
								 | 
							
								    reply.code(200).send({ ip: req.ip, hostname: req.hostname })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t.teardown(app.close.bind(app))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  app.listen(0, (err) => {
							 | 
						||
| 
								 | 
							
								    app.server.unref()
							 | 
						||
| 
								 | 
							
								    t.error(err)
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '1.1.1.1', '/trustproxyprotocol', 'lorem')
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '1.1.1.1', '/trustproxynoprotocol')
							 | 
						||
| 
								 | 
							
								    sgetForwardedRequest(app, '1.1.1.1', '/trustproxyprotocols', 'ipsum, dolor')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 |