You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.1 KiB
Lua
152 lines
3.1 KiB
Lua
local Model = require("lapis.db.model").Model
|
|
local Bans = Model:extend("bans", {
|
|
relations = {
|
|
{ "board", belongs_to="Boards" },
|
|
}
|
|
})
|
|
|
|
Bans.valid_record = {
|
|
{ "board_id", is_integer=true },
|
|
{ "ip", max_length=255, exists=true },
|
|
{ "time", exists=true }
|
|
}
|
|
|
|
--- Create a ban
|
|
-- @tparam table params Ban parameters
|
|
-- @treturn boolean success
|
|
-- @treturn string err
|
|
function Bans:new(params)
|
|
local ban = self:create(params)
|
|
return ban and ban or nil, { "err_create_ban", { params.ip } }
|
|
end
|
|
|
|
--- Modify a ban
|
|
-- @tparam table params Board parameters
|
|
-- @treturn boolean success
|
|
-- @treturn string error
|
|
function Bans:modify(params)
|
|
local ban = self:get(params.id)
|
|
if not ban then
|
|
return nil, { "err_create_board", { params.name, params.title } } -- FIXME: wrong error message
|
|
end
|
|
|
|
local success, err = ban:update(params)
|
|
return success and ban or nil, "FIXME: " .. tostring(err)
|
|
end
|
|
|
|
--- Delete a ban
|
|
-- @tparam number id Ban's ID
|
|
-- @treturn boolean success
|
|
-- @treturn string err
|
|
function Bans:delete(id)
|
|
local ban = self:get(id)
|
|
if not ban then
|
|
return nil, "FIXME"
|
|
end
|
|
|
|
local success = ban:delete()
|
|
return success and ban or nil, "FIXME"
|
|
end
|
|
|
|
--- Get all bans
|
|
-- @treturn table users List of bans
|
|
function Bans:get_all()
|
|
local bans = self:select("order by board_id asc, time + duration desc, ip asc")
|
|
|
|
for i=#bans, 1, -1 do
|
|
local ban = bans[i]
|
|
if not self:validate(ban) then
|
|
table.remove(bans, i)
|
|
end
|
|
end
|
|
|
|
return bans
|
|
end
|
|
|
|
--- Get board bans
|
|
-- @treturn table users List of bans
|
|
function Bans:get_board(board_id)
|
|
local bans = self:select("where board_id=? order by board_id asc, time + duration desc, ip asc", board_id)
|
|
|
|
for i=#bans, 1, -1 do
|
|
local ban = bans[i]
|
|
if not self:validate(ban) then
|
|
table.remove(bans, i)
|
|
end
|
|
end
|
|
|
|
return bans
|
|
end
|
|
|
|
--- Get ban data
|
|
-- @tparam number id Ban's ID
|
|
-- @treturn table ban
|
|
function Bans:get(id)
|
|
local ban = self:find(id)
|
|
if not ban then
|
|
return nil, "FIXME: ALART!"
|
|
end
|
|
|
|
local valid, err = self:validate(ban)
|
|
if not valid then
|
|
return nil, err
|
|
end
|
|
|
|
return ban
|
|
end
|
|
|
|
--- Get bans for specific ip
|
|
-- @tparam string ip IP address
|
|
-- @treturn table ban
|
|
function Bans:get_ip(ip)
|
|
local bans = self:select("where ip=?", ip)
|
|
|
|
for i=#bans, 1, -1 do
|
|
local ban = bans[i]
|
|
if not self:validate(ban) then
|
|
table.remove(bans, i)
|
|
end
|
|
end
|
|
|
|
return bans
|
|
end
|
|
|
|
--- Validate ban
|
|
-- @tparam table ban Ban data
|
|
-- @treturn boolean valid
|
|
function Bans:validate(ban)
|
|
local time = os.time()
|
|
local finish = ban.time + ban.duration
|
|
|
|
if time >= finish then
|
|
self:delete(ban)
|
|
return nil, "FIXME: ban has exired"
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
--- Format ban paramaters for DB insertion
|
|
-- @tparam table params Ban parameters
|
|
function Bans.format_to_db(_, params)
|
|
-- Convert duration from days to seconds
|
|
params.duration = (tonumber(params.duration) or 0) * 86400
|
|
|
|
if not params.board_id then
|
|
params.board_id = 0
|
|
end
|
|
end
|
|
|
|
--- Format ban parameters for User consumption
|
|
-- @tparam table params Ban parameters
|
|
function Bans.format_from_db(_, params)
|
|
-- Convert duration from seconds to days
|
|
params.duration = tonumber(params.duration) / 86400
|
|
|
|
if params.board_id == 0 then
|
|
params.board_id = nil
|
|
end
|
|
end
|
|
|
|
return Bans
|