63 lines
1.9 KiB
Plaintext
63 lines
1.9 KiB
Plaintext
access_by_lua_block {
|
|
|
|
local logger = require "logger"
|
|
local datastore = require "datastore"
|
|
local plugins = require "plugins"
|
|
|
|
-- Don't process internal requests
|
|
if ngx.req.is_internal() then
|
|
logger.log(ngx.INFO, "ACCESS", "Skipped access phase because request is internal")
|
|
return
|
|
end
|
|
|
|
logger.log(ngx.INFO, "ACCESS", "Access phase started")
|
|
|
|
-- Process bans as soon as possible
|
|
local banned, err = datastore:get("bans_ip_" .. ngx.var.remote_addr)
|
|
if banned then
|
|
logger.log(ngx.WARN, "ACCESS", "IP " .. ngx.var.remote_addr .. " is banned with reason : " .. banned)
|
|
ngx.exit(ngx.HTTP_FORBIDDEN)
|
|
end
|
|
|
|
-- List all plugins
|
|
local list, err = plugins:list()
|
|
if not list then
|
|
logger.log(ngx.ERR, "ACCESS", "Can't list loaded plugins : " .. err)
|
|
list = {}
|
|
end
|
|
|
|
-- Call access method of plugins
|
|
for i, plugin in ipairs(list) do
|
|
local ret, plugin_lua = pcall(require, plugin.id .. "/" .. plugin.id)
|
|
if ret then
|
|
local plugin_obj = plugin_lua.new()
|
|
if plugin_obj.access ~= nil then
|
|
logger.log(ngx.INFO, "ACCESS", "Executing access() of " .. plugin.id)
|
|
local ok, err, ret, value = plugin_obj:access()
|
|
if not ok then
|
|
logger.log(ngx.ERR, "ACCESS", "Error while calling access() on plugin " .. plugin.id .. " : " .. err)
|
|
else
|
|
logger.log(ngx.INFO, "ACCESS", "Return value from " .. plugin.id .. ".access() is : " .. err)
|
|
end
|
|
if ret then
|
|
if type(value) == "number" then
|
|
if value == ngx.HTTP_FORBIDDEN then
|
|
logger.log(ngx.WARN, "ACCESS", "Denied access from " .. plugin.id .. " : " .. err)
|
|
ngx.var.reason = plugin.id
|
|
else
|
|
logger.log(ngx.NOTICE, "ACCESS", plugin.id .. " returned status " .. tostring(value) .. " : " .. err)
|
|
end
|
|
return ngx.exit(value)
|
|
else
|
|
return value
|
|
end
|
|
end
|
|
else
|
|
logger.log(ngx.INFO, "ACCESS", "access() method not found in " .. plugin.id .. ", skipped execution")
|
|
end
|
|
end
|
|
end
|
|
|
|
logger.log(ngx.INFO, "ACCESS", "Access phase ended")
|
|
|
|
} |