Add non-pattern banned name list; ability to reload it & patterns

This commit is contained in:
Dorian Wouters 2016-08-23 11:28:52 +02:00
parent 75b96c7cf9
commit 7aec733ad6
No known key found for this signature in database
GPG Key ID: 6E9DA8063322434B

133
init.lua
View File

@ -17,50 +17,126 @@ temp = nil
exemptions[minetest.setting_get("name")] = true exemptions[minetest.setting_get("name")] = true
exemptions["singleplayer"] = true exemptions["singleplayer"] = true
local disallowed_names
local function load_forbidden_names()
disallowed_names = {}
local path = minetest.setting_get("name_restrictions.forbidden_names_list_path") or
minetest.get_worldpath("name_restrictions") .. "/forbidden_names.txt"
local file = io.open(path, 'r')
if file then
local count = 0
for line in file:lines() do
local low_line = line:lower()
disallowed_names[low_line] = true
count = count + 1
end
file:close()
return true, count .. " forbidden names loaded", 'verbose'
else
disallowed_names = {}
return true, path .. " doesn't exist, no forbidden names have been loaded", 'warning'
end
end
do
local ret, msg, lvl = load_forbidden_names()
if msg and lvl then
minetest.log(lvl, msg)
end
end
--------------------- ---------------------
-- Simple matching -- -- Simple matching --
--------------------- ---------------------
local msg_guest = "Guest accounts are disallowed on this server. ".. local disallowed
"Please choose a proper name and try again."
local msg_misleading = "Your player name is misleading. ".. local function load_disallowed()
"Please choose a more appropriate name." local path = minetest.setting_get("name_restrictions.forbidden_name_patterns_list_path") or
local disallowed = { minetest.get_worldpath("name_restrictions") .. "/forbidden_names_patterns.txt"
["^guest[0-9]+"] = msg_guest, local file = io.open(path, 'r')
["^squeakecrafter[0-9]+"] = msg_guest, if file then
["adm[1il]n"] = msg_misleading, local content = file:read('*all')
["[0o]wn[e3]r"] = msg_misleading, local imported = minetest.deserialize(content)
["^[0-9]+$"] = "All-numeric usernames are disallowed on this server.", local ret, msg, lvl = true, nil, nil
} if imported == nil then
disallowed = disallowed or {}
ret, msg, lvl = false, "Failed to parse " .. path .. "; patterns not imported", 'error'
elseif type(imported) ~= 'table' then
disallowed = disallowed or {}
ret, msg, lvl = false, "Parsing " .. path .. " returned a " .. type(imported) ..
" where a table was expected; patterns not imported", 'error'
else
disallowed = imported
local count = 0
for _ in pairs(disallowed) do
count = count + 1
end
msg, lvl = count .. " forbidden name patterns loaded", 'verbose'
end
file:close()
return ret, msg, lvl
else
disallowed = {}
return true, path .. " doesn't exist, no forbidden name patterns have been loaded", 'warning'
end
end
do
local ret, msg, lvl = load_disallowed()
if msg and lvl then
minetest.log(lvl, msg)
end
end
minetest.register_on_prejoinplayer(function(name, ip) minetest.register_on_prejoinplayer(function(name, ip)
if exemptions[name] then return end
-- Check for disallowed names
local lname = name:lower() local lname = name:lower()
for re, reason in pairs(disallowed) do for re, reason in pairs(disallowed) do
if lname:find(re) then if lname:find(re) then
return reason return reason
end end
end end
if disallowed_names[lname] then
return "Sorry. This name is forbidden."
end
end) end)
--------------------------------------
-- Simple matching config reloading --
--------------------------------------
minetest.register_chatcommand("forbidden_names_reload", {
params = "",
description = "Reloads forbidden_names match lists",
privs = {ban= true},
func = function(name)
local ret1, msg, lvl = load_forbidden_names()
if msg and lvl then
minetest.log(lvl, msg)
minetest.chat_send_player(name, msg)
end
local ret2
ret2, msg, lvl = load_disallowed()
if msg and lvl then
minetest.log(lvl, msg)
minetest.chat_send_player(name, msg)
end
return ret1 and ret2
end
})
------------------------ ------------------------
-- Case-insensitivity -- -- Case-insensitivity --
------------------------ ------------------------
minetest.register_on_prejoinplayer(function(name, ip) minetest.register_on_prejoinplayer(function(name, ip)
if exemptions[name] then return end
-- Check for used names
local lname = name:lower() local lname = name:lower()
for iname, data in pairs(minetest.auth_table) do for iname, data in pairs(minetest.auth_table) do
if iname:lower() == lname and iname ~= name then if iname:lower() == lname and iname ~= name then
return "Sorry, someone else is already using this" return "Sorry, someone else is already using this"
.." name. Please pick another name." .." name. Please pick another name."
.." Annother possibility is that you used the" .." Another possibility is that you used the"
.." wrong case for your name." .." wrong case for your name."
end end
end end
@ -68,9 +144,9 @@ end)
-- Compatability, for old servers with conflicting players -- Compatability, for old servers with conflicting players
minetest.register_chatcommand("choosecase", { minetest.register_chatcommand("choosecase", {
description = "Choose the casing that a player name should have.", description = "Choose the casing that a player name should have",
params = "<name>", params = "<name>",
privs = {server=true}, privs = {server = true},
func = function(name, params) func = function(name, params)
local lname = params:lower() local lname = params:lower()
local worldpath = minetest.get_worldpath() local worldpath = minetest.get_worldpath()
@ -78,7 +154,7 @@ minetest.register_chatcommand("choosecase", {
if iname:lower() == lname and iname ~= params then if iname:lower() == lname and iname ~= params then
minetest.auth_table[iname] = nil minetest.auth_table[iname] = nil
assert(not iname:find("[/\\]")) assert(not iname:find("[/\\]"))
os.remove(worldpath.."/players/"..iname) os.remove(worldpath .. "/players/" .. iname)
end end
end end
return true, "Done." return true, "Done."
@ -92,7 +168,7 @@ minetest.register_chatcommand("choosecase", {
-- Prevents names that are too similar to another player's name. -- Prevents names that are too similar to another player's name.
local similar_chars = { local similar_chars = {
-- Only A-Z, a-z, 1-9, dash, and underscore are allowed in player names -- Only A-Z, a-z, 1-9, dash, and underscore are allowed in playernames
"A4", "A4",
"B8", "B8",
"COco0", "COco0",
@ -148,13 +224,22 @@ end)
-- Name length -- -- Name length --
----------------- -----------------
local min_name_len = tonumber(minetest.setting_get("name_restrictions.minimum_name_length")) or 3 local min_name_len = tonumber(minetest.setting_get("name_restrictions.minimum_name_length")) or 2
local max_name_len = tonumber(minetest.setting_get("name_restrictions.maximum_name_length")) or 17
minetest.register_on_prejoinplayer(function(name, ip) minetest.register_on_prejoinplayer(function(name, ip)
if exemptions[name] then return end if exemptions[name] then return end
if #name < min_name_len then if #name < min_name_len then
return "Your player name is too short, please try a longer name." return "Your player name is too short"
.. " (" .. #name .. " characters, must be " .. min_name_len .. " characters at least)."
.. " Please try a longer name."
end
if #name > max_name_len then
return "Your player name is too long"
.. " (" .. #name .. " characters, must be " .. max_name_len .. " characters at most)."
.. " Please try a shorter name."
end end
end) end)