kong/spec/03-plugins/29-acme/03-access_spec.lua (174 lines of code) (raw):
local helpers = require "spec.helpers"
local dummy_id = "ZR02iVO6PFywzFLj6igWHd6fnK2R07C-97dkQKC7vJo"
local do_domain = "acme.noatld"
local skip_domain = "notacme.noatld"
for _, strategy in helpers.each_strategy() do
describe("Plugin: acme (handler.access) [#" .. strategy .. "]", function()
local bp, db
local proxy_client
lazy_setup(function()
bp, db = helpers.get_db_utils(strategy, {
"certificates",
"snis",
"services",
"routes",
"plugins",
"acme_storage",
}, { "acme", })
assert(bp.routes:insert {
paths = { "/" },
})
assert(bp.plugins:insert {
name = "acme",
config = {
account_email = "test@test.com",
api_uri = "https://api.acme.org",
storage = "kong",
domains = { do_domain, "*.subdomain." .. do_domain },
},
})
assert(bp.plugins:insert {
name = "key-auth",
})
assert(db.acme_storage:insert {
key = dummy_id .. "#http-01",
value = "isme",
})
assert(helpers.start_kong({
plugins = "bundled,acme",
database = strategy,
}))
proxy_client = helpers.proxy_client()
end)
lazy_teardown(function()
if proxy_client then
proxy_client:close()
end
helpers.stop_kong()
end)
it("terminates validation path", function()
local body
local res = assert( proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/yay",
headers = { host = do_domain }
})
-- key-auth should not run
assert.response(res).has.status(404)
body = res:read_body()
assert.match("Not found", body)
res = assert( proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/" .. dummy_id,
headers = { host = do_domain }
})
-- key-auth should not run
assert.response(res).has.status(200)
body = res:read_body()
assert.equal("isme\n", body)
end)
it("doesn't terminate validation path with host not in whitelist", function()
local res = assert( proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/yay",
headers = { host = skip_domain }
})
-- key-auth should take over
assert.response(res).has.status(401)
end)
it("dots in wildcard in domain is escaped correctly", function()
local res = assert( proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/" .. dummy_id,
headers = { host = "a.subdomain." .. do_domain }
})
-- key-auth should not run
local body = assert.response(res).has.status(200)
assert.equal("isme", body)
res = assert( proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/" .. dummy_id,
headers = { host = "asdsubdomain." .. do_domain }
})
-- key-auth should take over
assert.response(res).has.status(401)
end)
pending("serves default cert", function()
end)
end)
describe("Plugin: acme (handler.access) allow any domain (via admin API) [#" .. strategy .. "]", function()
local bp, db
local proxy_client
lazy_setup(function()
bp, db = helpers.get_db_utils(strategy, {
"certificates",
"snis",
"services",
"routes",
"plugins",
"acme_storage",
}, { "acme", })
assert(bp.routes:insert {
paths = { "/" },
})
assert(bp.plugins:insert {
name = "key-auth",
})
assert(db.acme_storage:insert {
key = dummy_id .. "#http-01",
value = "isme",
})
assert(helpers.start_kong({
plugins = "bundled,acme",
database = strategy,
}))
local client = helpers.admin_client()
assert(client:send({
method = "POST",
path = "/plugins",
headers = {
["Content-Type"] = "application/json",
},
body = {
name = "acme",
config = {
account_email = "test@test.com",
api_uri = "https://api.acme.org",
storage = "kong",
allow_any_domain = true,
},
},
}))
client:close()
proxy_client = helpers.proxy_client()
end)
lazy_teardown(function()
if proxy_client then
proxy_client:close()
end
helpers.stop_kong()
end)
it("allow any domain", function()
local res
-- wait until admin API takes effect
helpers.wait_until(function()
res = proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/" .. dummy_id,
headers = { host = "a.subdomain." .. do_domain }
}
return res and res.status == 200
end, 5)
-- key-auth should not run
local body = assert.response(res).has.status(200)
assert.equal("isme", body)
res = assert( proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/" .. dummy_id,
headers = { host = "asdsubdomain." .. do_domain }
})
-- key-auth should not run
local body = assert.response(res).has.status(200)
assert.equal("isme", body)
res = assert( proxy_client:send {
method = "GET",
path = "/.well-known/acme-challenge/" .. dummy_id,
headers = { skip_domain }
})
-- key-auth should not run
local body = assert.response(res).has.status(200)
assert.equal("isme", body)
end)
end)
end