Compare commits

...

10 Commits

Author SHA1 Message Date
bri cassa 0f62057622 Merge remote-tracking branch 'upstream/master' 2023-11-25 15:52:08 +01:00
David Leal e870b8d1d6
Add a license file (#27) 2023-09-11 20:49:22 +02:00
luk3yx c850d11a3c
Use JSON in xban.db (#26)
This should prevent bans database from resetting with a "function has more than 65536 constants" error. Older databases should still be loaded correctly.

Also makes use of minetest.safe_file_write to avoid data corruption.
2023-09-07 17:38:26 +02:00
Sys Quatre 1faa658651 Merge remote-tracking branch 'upstream/master' into nalc-1.2-dev 2020-06-14 23:11:26 +02:00
sfan5 d2cda4f73a Improve behavior of GUI search field 2020-06-02 13:09:52 +02:00
Sys Quatre 72a99b2b18 Merge branch 'master' of yunohost:minetest-mods/xban2 into nalc-1.2-dev 2019-12-22 16:08:18 +01:00
sfan5 37cdbf014e Fix list of names in log message upon (un-)banning 2019-11-05 16:49:50 +01:00
Thomas Rudin e937f5ff67 Add /xban_cleanup command to purge unbanned entries (#20)
Add documentation for /xban_cleanup
2019-06-06 18:54:46 +02:00
Sys Quatre 43acd1c620 Merge branch 'master' into nalc-1.2 2019-05-10 02:25:27 +02:00
Diego Martínez 3b70045365 Update to 5.0 auth. 2019-02-12 16:53:03 -03:00
5 changed files with 114 additions and 18 deletions

24
LICENSE Normal file
View File

@ -0,0 +1,24 @@
BSD 2-Clause License
Copyright (c) 2014-2023, Diego Martínez
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -104,3 +104,9 @@ the supported import plugins at the time of writing:
* `v2`: Old format used by xban (`players.iplist.v2`). * `v2`: Old format used by xban (`players.iplist.v2`).
**Example:** `/xban_dbi minetest` **Example:** `/xban_dbi minetest`
### `xban_cleanup`
Removes all non-banned entries from the xban db.
**Usage:** `/xban_cleanup`

View File

@ -9,9 +9,7 @@ local ESC = minetest.formspec_escape
local function make_list(filter) local function make_list(filter)
filter = filter or "" filter = filter or ""
local list, n, dropped = { }, 0, false local list, n, dropped = { }, 0, false
local enumerate, e1, e2, e3 = minetest.get_auth_handler().enumerate_auths for k in minetest.get_auth_handler().iterate() do
if enumerate then e1 = enumerate() else e1, e2, e3 = pairs(minetest.auth_table) end
for k in e1, e2, e3 do
if strfind(k, filter, 1, true) then if strfind(k, filter, 1, true) then
if n >= MAXLISTSIZE then if n >= MAXLISTSIZE then
dropped = true dropped = true
@ -63,7 +61,8 @@ local function make_fs(name)
"size[16,12]", "size[16,12]",
"label[0,-.1;Filter]", "label[0,-.1;Filter]",
"field[1.5,0;12.8,1;filter;;"..ESC(filter).."]", "field[1.5,0;12.8,1;filter;;"..ESC(filter).."]",
"button[14,-.3;2,1;search;Search]", "field_close_on_enter[filter;false]",
"button[14,-.3;2,1;search_submit;Search]",
} }
local fsn = #fs local fsn = #fs
fsn=fsn+1 fs[fsn] = format("textlist[0,.8;4,9.3;player;%s;%d;0]", fsn=fsn+1 fs[fsn] = format("textlist[0,.8;4,9.3;player;%s;%d;0]",
@ -124,7 +123,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
return return
end end
if fields.search then if fields.search_submit or fields.filter then
local filter = fields.filter or "" local filter = fields.filter or ""
state.filter = filter state.filter = filter
state.list = make_list(filter) state.list = make_list(filter)

View File

@ -25,6 +25,7 @@ end
local ACTION = make_logger("action") local ACTION = make_logger("action")
local WARNING = make_logger("warning") local WARNING = make_logger("warning")
local ERROR = make_logger("error")
local unit_to_secs = { local unit_to_secs = {
s = 1, m = 60, h = 3600, s = 1, m = 60, h = 3600,
@ -40,6 +41,14 @@ local function parse_time(t) --> secs
return secs return secs
end end
local function concat_keys(t, sep)
local keys = {}
for k, _ in pairs(t) do
keys[#keys + 1] = k
end
return table.concat(keys, sep)
end
function xban.find_entry(player, create) --> entry, index function xban.find_entry(player, create) --> entry, index
for index, e in ipairs(db) do for index, e in ipairs(db) do
for name in pairs(e.names) do for name in pairs(e.names) do
@ -111,7 +120,7 @@ function xban.ban_player(player, source, expires, reason) --> bool, err
end end
ACTION("%s bans %s until %s for reason: %s", source, player, ACTION("%s bans %s until %s for reason: %s", source, player,
date, reason) date, reason)
ACTION("Banned Names/IPs: %s", table.concat(e.names, ", ")) ACTION("Banned Names/IPs: %s", concat_keys(e.names, ", "))
return true return true
end end
@ -131,7 +140,7 @@ function xban.unban_player(player, source) --> bool, err
e.expires = nil e.expires = nil
e.time = nil e.time = nil
ACTION("%s unbans %s", source, player) ACTION("%s unbans %s", source, player)
ACTION("Unbanned Names/IPs: %s", table.concat(e.names, ", ")) ACTION("Unbanned Names/IPs: %s", concat_keys(e.names, ", "))
return true return true
end end
@ -314,6 +323,7 @@ minetest.register_chatcommand("xban_wl", {
end, end,
}) })
local function check_temp_bans() local function check_temp_bans()
minetest.after(60, check_temp_bans) minetest.after(60, check_temp_bans)
local to_rm = { } local to_rm = { }
@ -334,18 +344,12 @@ end
local function save_db() local function save_db()
minetest.after(SAVE_INTERVAL, save_db) minetest.after(SAVE_INTERVAL, save_db)
local f, e = io.open(DB_FILENAME, "wt")
db.timestamp = os.time() db.timestamp = os.time()
if f then local contents = assert(xban.serialize_db(db))
local ok, err = f:write(xban.serialize(db)) local ok = minetest.safe_file_write(DB_FILENAME, contents)
if not ok then if not ok then
WARNING("Unable to save database: %s", err) ERROR("Unable to save database")
end
else
WARNING("Unable to save database: %s", e)
end end
if f then f:close() end
return
end end
local function load_db() local function load_db()
@ -359,7 +363,7 @@ local function load_db()
WARNING("Unable to load database: %s", "Read failed") WARNING("Unable to load database: %s", "Read failed")
return return
end end
local t, e2 = minetest.deserialize(cont) local t, e2 = xban.deserialize_db(cont)
if not t then if not t then
WARNING("Unable to load database: %s", WARNING("Unable to load database: %s",
"Deserialization failed: "..(e2 or "unknown error")) "Deserialization failed: "..(e2 or "unknown error"))
@ -374,6 +378,30 @@ local function load_db()
end end
end end
minetest.register_chatcommand("xban_cleanup", {
description = "Removes all non-banned entries from the xban db",
privs = { server=true },
func = function(name, params)
local old_count = #db
local i = 1
while i <= #db do
if not db[i].banned then
-- not banned, remove from db
table.remove(db, i)
else
-- banned, hold entry back
i = i + 1
end
end
-- save immediately
save_db()
return true, "Removed " .. (old_count - #db) .. " entries, new db entry-count: " .. #db
end,
})
minetest.register_on_shutdown(save_db) minetest.register_on_shutdown(save_db)
minetest.after(SAVE_INTERVAL, save_db) minetest.after(SAVE_INTERVAL, save_db)
load_db() load_db()

View File

@ -27,5 +27,44 @@ local function my_serialize_2(t, level)
end end
function xban.serialize(t) function xban.serialize(t)
minetest.log("warning", "[xban2] xban.serialize() is deprecated")
return "return {\n"..my_serialize_2(t, 1).."\n}" return "return {\n"..my_serialize_2(t, 1).."\n}"
end end
-- JSON doesn't allow combined string+number keys, this function moves any
-- number keys into an "entries" table
function xban.serialize_db(t)
local res = {}
local entries = {}
for k, v in pairs(t) do
if type(k) == "number" then
entries[k] = v
else
res[k] = v
end
end
res.entries = entries
return minetest.write_json(res, true)
end
function xban.deserialize_db(s)
if s:sub(1, 1) ~= "{" then
-- Load legacy databases
return minetest.deserialize(s)
end
local res, err = minetest.parse_json(s)
if not res then
return nil, err
end
-- Remove all "null"s added by empty tables
for i, entry in ipairs(res.entries or {}) do
entry.names = entry.names or {}
entry.record = entry.record or {}
res[i] = entry
end
res.entries = nil
return res
end