/*! * koa-ip-filter * * Copyright (c) 2015-2016 Charlike Mike Reagent, contributors. * Released under the MIT license. */ /* jshint asi:true, esnext:true */ 'use strict' var test = require('mukla') var ipFilter = require('./index') var request = require('supertest') var helloWorld = require('koa-hello-world') var koa = require('koa') function middleware (fn) { return koa().use(fn).use(helloWorld()).callback() } test('should yield next middleware if no `opts.filter` given', function (done) { var server = middleware(ipFilter()) request(server) .get('/') .expect(200, 'Hello World') .end(done) }) test('should have `opts.id` and it should be binded to koa this', function (done) { var server = middleware(ipFilter({ id: function _id_ (ctx) { this.set('x-github-username', 'tunnckoCore') return ctx.request.header['x-koaip'] } })) request(server).get('/') .expect('x-github-username', 'tunnckoCore') .expect(200) .expect('Hello World') .end(done) }) test('should `403 Forbidden` if not match to `opts.filter`', function (done) { var server = middleware(ipFilter({ id: function () { return this.request.header['x-koaip'] }, filter: '1.2.3.*' })) request(server).get('/').set('x-koaip', '4.4.8.8') .expect('403 Forbidden').expect(403, done) }) test('should `403 Forbidden` if IP is in blacklist', function (done) { request(middleware(ipFilter({ id: function () { return this.request.header['x-koaip'] }, filter: ['*', '!89.???.30.*'] }))) .get('/').set('x-koaip', '89.111.30.8') .expect(403, '403 Forbidden') .end(done) }) test('should `200 OK` if not in blacklist range', function (done) { var mw = ipFilter({ id: function () { var header = this.request.header['x-koaip'] return header }, // it can be double star - globstar // or *.*.*.* filter: ['*.*.*.*', '!111.??.244.*'] }) request(middleware(mw)) .get('/') .set('x-koaip', '4.4.8.8') .expect(200, 'Hello World') .end(done) }) test('should support custom message for 403 Forbidden', function (done) { var server = middleware(ipFilter({ id: function () { return this.request.header['x-koaip'] }, filter: ['*', '!89.???.30.*'], forbidden: '403, Get out of here!' })) request(server) .get('/') .set('x-koaip', '89.111.30.8') .expect(403, '403, Get out of here!') .end(done) }) test('should be able `opts.forbidden` to be function', function (done) { var server = middleware(ipFilter({ id: function () { return this.request.header['x-koaip'] }, filter: '123.225.23.120', forbidden: function (ctx) { this.set('X-Forbidden', 'Can be function') ctx.set('X-Seriously', 'yes') return 'opts.forbidden can be function' } })) request(server) .get('/') .set('x-koaip', '55.55.55.55') .expect('X-Forbidden', 'Can be function') .expect('X-Seriously', 'yes') .expect(403, 'opts.forbidden can be function') .end(done) }) test('should have `this.filter` and `this.identifier` in next middleware', function (done) { var ok = false var server = koa() .use(ipFilter({ // it can be double star - globstar // or *.*.*.* filter: ['**', '!213.15.*'] })) .use(helloWorld()) .use(function * (next) { test.ok(this.filter, 'should have `this.filter` in next') test.ok(this.identifier, 'should have `this.identifier` in next') test.equal(typeof this.filter, 'function', 'should have `this.filter` method') test.equal(typeof this.identifier, 'string', 'should have `this.identifier`') ok = true yield next }) request(server.callback()) .get('/') .set('x-koaip', '7.7.7.7') .expect(200, 'Hello World') .end(function (err) { test.ifError(err) test.equal(ok, true) done() }) }) test('should not have `this.filter` if no `opts.filter` given', function (done) { var ok = false var server = koa().use(ipFilter()).use(helloWorld()).use(function * (next) { test.ok(!this.filter, 'should not have `this.filter` in next') test.ok(!this.identifier, 'should not have `this.identifier` in next') ok = true yield next }).callback() request(server) .get('/') .expect('Hello World') .expect(200, function (err) { test.ifError(err) test.equal(ok, true) done() }) })