377 lines
9.7 KiB
Lua
377 lines
9.7 KiB
Lua
local helpers = require "spec.helpers"
|
|
|
|
|
|
local HELLOWORLD = "HelloWorld" -- just a test value
|
|
local FACEBOOK = "facebookexternalhit/1.1" -- matches a known bot in `rules.lua`
|
|
|
|
|
|
for _, strategy in helpers.each_strategy() do
|
|
describe("Plugin: bot-detection (access) [#" .. strategy .. "]", function()
|
|
local proxy_client
|
|
|
|
lazy_setup(function()
|
|
local bp = helpers.get_db_utils(strategy, {
|
|
"plugins",
|
|
"routes",
|
|
"services",
|
|
})
|
|
|
|
local route1 = bp.routes:insert {
|
|
hosts = { "bot.test" },
|
|
}
|
|
|
|
local route2 = bp.routes:insert {
|
|
hosts = { "bot2.test" },
|
|
}
|
|
|
|
local route3 = bp.routes:insert {
|
|
hosts = { "bot3.test" },
|
|
}
|
|
|
|
local grpc_service = bp.services:insert {
|
|
name = "grpc1",
|
|
url = helpers.grpcbin_url,
|
|
}
|
|
|
|
local route_grpc1 = assert(bp.routes:insert {
|
|
protocols = { "grpc" },
|
|
paths = { "/hello.HelloService/" },
|
|
hosts = { "bot-grpc1.test" },
|
|
service = grpc_service,
|
|
})
|
|
|
|
local route_grpc2 = assert(bp.routes:insert {
|
|
protocols = { "grpc" },
|
|
paths = { "/hello.HelloService/" },
|
|
hosts = { "bot-grpc2.test" },
|
|
service = grpc_service,
|
|
})
|
|
|
|
local route_grpc3 = assert(bp.routes:insert {
|
|
protocols = { "grpc" },
|
|
paths = { "/hello.HelloService/" },
|
|
hosts = { "bot-grpc3.test" },
|
|
service = grpc_service,
|
|
})
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route1.id },
|
|
name = "bot-detection",
|
|
config = {},
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route2.id },
|
|
name = "bot-detection",
|
|
config = {
|
|
deny = { HELLOWORLD },
|
|
},
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route3.id },
|
|
name = "bot-detection",
|
|
config = {
|
|
allow = { FACEBOOK },
|
|
},
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route_grpc1.id },
|
|
name = "bot-detection",
|
|
config = {},
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route_grpc2.id },
|
|
name = "bot-detection",
|
|
config = {
|
|
deny = { HELLOWORLD },
|
|
},
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = { id = route_grpc3.id },
|
|
name = "bot-detection",
|
|
config = {
|
|
allow = { FACEBOOK },
|
|
},
|
|
}
|
|
|
|
assert(helpers.start_kong({
|
|
database = strategy,
|
|
nginx_conf = "spec/fixtures/custom_nginx.template",
|
|
}))
|
|
end)
|
|
|
|
lazy_teardown(function()
|
|
helpers.stop_kong()
|
|
end)
|
|
|
|
before_each(function()
|
|
proxy_client = helpers.proxy_client()
|
|
end)
|
|
|
|
after_each(function()
|
|
if proxy_client then
|
|
proxy_client:close()
|
|
end
|
|
end)
|
|
|
|
it("allows regular requests", function()
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = { host = "bot.test" }
|
|
})
|
|
assert.response(res).has.status(200)
|
|
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
|
|
}
|
|
})
|
|
assert.response(res).has.status(200)
|
|
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = HELLOWORLD
|
|
}
|
|
})
|
|
assert.response(res).has.status(200)
|
|
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = "curl/7.43.0"
|
|
}
|
|
})
|
|
assert.response(res).has.status(200)
|
|
end)
|
|
|
|
it("allows regular requests #grpc", function()
|
|
local ok = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc1.test",
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.truthy(ok)
|
|
|
|
local ok = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc1.test",
|
|
["-user-agent"] = "'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'",
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.truthy(ok)
|
|
|
|
local ok = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc1.test",
|
|
["-user-agent"] = HELLOWORLD,
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.truthy(ok)
|
|
|
|
local ok = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc1.test",
|
|
["-user-agent"] = "curl/7.43.0",
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.truthy(ok)
|
|
end)
|
|
|
|
it("blocks bots", function()
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = "Googlebot/2.1 (+http://www.google.com/bot.html)"
|
|
},
|
|
})
|
|
assert.response(res).has.status(403)
|
|
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = FACEBOOK,
|
|
}
|
|
})
|
|
assert.response(res).has.status(403)
|
|
end)
|
|
|
|
it("blocks bots #grpc", function()
|
|
local ok, err = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc1.test",
|
|
["-user-agent"] = "'Googlebot/2.1 (+http://www.google.com/bot.html)'",
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.falsy(ok)
|
|
assert.matches("Code: PermissionDenied", err)
|
|
|
|
local ok, err = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc1.test",
|
|
["-user-agent"] = FACEBOOK,
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.falsy(ok)
|
|
assert.matches("Code: PermissionDenied", err)
|
|
end)
|
|
|
|
it("blocks denied user-agents", function()
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot2.test",
|
|
["user-agent"] = HELLOWORLD,
|
|
}
|
|
})
|
|
assert.response(res).has.status(403)
|
|
end)
|
|
|
|
it("blocks denied user-agents #grpc", function()
|
|
local ok, err = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc2.test",
|
|
["-user-agent"] = HELLOWORLD,
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.falsy(ok)
|
|
assert.matches("Code: PermissionDenied", err)
|
|
end)
|
|
|
|
it("allows allowed user-agents", function()
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot3.test",
|
|
["user-agent"] = FACEBOOK
|
|
}
|
|
})
|
|
assert.response(res).has.status(200)
|
|
end)
|
|
|
|
it("allows allowed user-agents #grpc", function()
|
|
local ok = helpers.proxy_client_grpc(){
|
|
service = "hello.HelloService.SayHello",
|
|
opts = {
|
|
["-authority"] = "bot-grpc3.test",
|
|
["-user-agent"] = FACEBOOK,
|
|
["-v"] = true,
|
|
},
|
|
}
|
|
assert.truthy(ok)
|
|
end)
|
|
end)
|
|
|
|
describe("Plugin: bot-detection configured global (access) [#" .. strategy .. "]", function()
|
|
local proxy_client
|
|
|
|
lazy_setup(function()
|
|
local bp = helpers.get_db_utils(strategy, {
|
|
"plugins",
|
|
"routes",
|
|
"services",
|
|
})
|
|
|
|
bp.routes:insert {
|
|
hosts = { "bot.test" },
|
|
}
|
|
|
|
bp.plugins:insert {
|
|
route = nil, -- apply globally
|
|
name = "bot-detection",
|
|
config = {},
|
|
}
|
|
|
|
assert(helpers.start_kong({
|
|
database = strategy,
|
|
nginx_conf = "spec/fixtures/custom_nginx.template",
|
|
}))
|
|
end)
|
|
|
|
lazy_teardown(function()
|
|
helpers.stop_kong()
|
|
end)
|
|
|
|
before_each(function()
|
|
proxy_client = helpers.proxy_client()
|
|
end)
|
|
|
|
after_each(function()
|
|
if proxy_client then
|
|
proxy_client:close()
|
|
end
|
|
end)
|
|
|
|
it("allows regular requests", function()
|
|
local res = assert(proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = { host = "bot.test" }
|
|
})
|
|
assert.response(res).has.status(200)
|
|
|
|
local res = assert( proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
|
|
}
|
|
})
|
|
assert.response(res).has.status(200)
|
|
|
|
local res = assert(proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = HELLOWORLD
|
|
}
|
|
})
|
|
assert.response(res).has.status(200)
|
|
|
|
local res = assert(proxy_client:send {
|
|
method = "GET",
|
|
path = "/request",
|
|
headers = {
|
|
host = "bot.test",
|
|
["user-agent"] = "curl/7.43.0"
|
|
}
|
|
})
|
|
assert.response(res).has.status(200)
|
|
end)
|
|
end)
|
|
end
|