forked from mtcontrib/name_restrictions
Add non-pattern banned name list; ability to reload it & patterns
This commit is contained in:
parent
75b96c7cf9
commit
7aec733ad6
133
init.lua
133
init.lua
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user