-
Notifications
You must be signed in to change notification settings - Fork 9
/
index.js
43 lines (37 loc) · 1.1 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
const assert = require('assert')
const isPlainObject = require('lodash.isplainobject')
const requestIp = require('request-ip')
const debug = require('debug')('koa-ip')
module.exports = function (opts) {
assert(opts, 'koa-ip missing opts')
if (!isPlainObject(opts)) {
opts = { whitelist: Array.isArray(opts) ? opts : [opts] }
}
return async function koaIp (ctx, next) {
const ip = ctx.ip || requestIp.getClientIp(ctx.req)
let pass = true
if (opts.whitelist && Array.isArray(opts.whitelist)) {
pass = opts.whitelist.some((item) => {
return new RegExp(item).test(ip)
})
}
if (pass && opts.blacklist && Array.isArray(opts.blacklist)) {
pass = !opts.blacklist.some((item) => {
return new RegExp(item).test(ip)
})
}
// pass
if (pass) {
debug(`${new Date()}: "${ip} -> ✓"`)
return next()
}
// not pass
if (typeof opts.handler === 'function') {
debug(`${new Date()}: "${ip} -> handler"`)
await opts.handler(ctx, next)
} else {
debug(`${new Date()}: "${ip} -> ×"`)
ctx.throw(403)
}
}
}