forked from mtcontrib/name_restrictions
Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
87ed4ade88 | |||
1e6d9e01b7 |
202
init.lua
202
init.lua
@ -17,128 +17,84 @@ temp = nil
|
||||
exemptions[minetest.setting_get("name")] = 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'
|
||||
local function player_exempted(name)
|
||||
-- Allow specifically exempted players
|
||||
if exemptions[name] then
|
||||
return true
|
||||
end
|
||||
|
||||
-- Allow players that already exist
|
||||
local auth = minetest.get_auth_handler()
|
||||
if auth.get_auth(name) then
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
do
|
||||
local ret, msg, lvl = load_forbidden_names()
|
||||
if msg and lvl then
|
||||
minetest.log(lvl, msg)
|
||||
end
|
||||
end
|
||||
|
||||
---------------------
|
||||
-- Simple matching --
|
||||
---------------------
|
||||
|
||||
local disallowed
|
||||
local msg_guest = "Guest accounts are disallowed on this server. "..
|
||||
"Please choose a proper name and try again."
|
||||
local msg_misleading = "Your player name is misleading. "..
|
||||
"Please choose a more appropriate name."
|
||||
local disallowed = {
|
||||
["^guest[0-9]+"] = msg_guest,
|
||||
["^squeakecrafter[0-9]+"] = msg_guest,
|
||||
["adm[1il]n"] = msg_misleading,
|
||||
["[0o]wn[e3]r"] = msg_misleading,
|
||||
["^[0-9]+$"] = "All-numeric usernames are disallowed on this server.",
|
||||
}
|
||||
|
||||
local function load_disallowed()
|
||||
local path = minetest.setting_get("name_restrictions.forbidden_name_patterns_list_path") or
|
||||
minetest.get_worldpath("name_restrictions") .. "/forbidden_names_patterns.txt"
|
||||
local file = io.open(path, 'r')
|
||||
if file then
|
||||
local content = file:read('*all')
|
||||
local imported = minetest.deserialize(content)
|
||||
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'
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if player_exempted(name) then return end
|
||||
|
||||
-- Check for disallowed names
|
||||
local lname = name:lower()
|
||||
for re, reason in pairs(disallowed) do
|
||||
if lname:find(re) then
|
||||
return reason
|
||||
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
|
||||
end)
|
||||
|
||||
do
|
||||
local ret, msg, lvl = load_disallowed()
|
||||
if msg and lvl then
|
||||
minetest.log(lvl, msg)
|
||||
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 --
|
||||
------------------------
|
||||
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if player_exempted(name) then return end
|
||||
|
||||
-- Check for used names
|
||||
local lname = name:lower()
|
||||
for iname, data in pairs(minetest.auth_table) do
|
||||
if iname:lower() == lname and iname ~= name then
|
||||
return "Sorry, someone else is already using this"
|
||||
.." name. Please pick another name."
|
||||
.." Annother possibility is that you used the"
|
||||
.." wrong case for your name."
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Compatability, for old servers with conflicting players
|
||||
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>",
|
||||
privs = {server = true},
|
||||
privs = {server=true},
|
||||
func = function(name, params)
|
||||
local lname = params:lower()
|
||||
local worldpath = minetest.get_worldpath()
|
||||
local enumerate, e1, e2, e3 = minetest.get_auth_handler().enumerate_auths
|
||||
if enumerate then e1 = enumerate() else e1, e2, e3 = pairs(minetest.auth_table) end
|
||||
for iname, data in e1, e2, e3 do
|
||||
for iname, data in pairs(minetest.auth_table) do
|
||||
if iname:lower() == lname and iname ~= params then
|
||||
local delete = minetest.get_auth_handler().delete_auth
|
||||
if delete then
|
||||
delete(iname)
|
||||
else
|
||||
minetest.auth_table[iname] = nil
|
||||
end
|
||||
minetest.auth_table[iname] = nil
|
||||
assert(not iname:find("[/\\]"))
|
||||
os.remove(worldpath .. "/players/" .. iname)
|
||||
os.remove(worldpath.."/players/"..iname)
|
||||
end
|
||||
end
|
||||
return true, "Done."
|
||||
@ -152,7 +108,7 @@ minetest.register_chatcommand("choosecase", {
|
||||
-- Prevents names that are too similar to another player's name.
|
||||
|
||||
local similar_chars = {
|
||||
-- Only A-Z, a-z, 1-9, dash, and underscore are allowed in playernames
|
||||
-- Only A-Z, a-z, 1-9, dash, and underscore are allowed in player names
|
||||
"A4",
|
||||
"B8",
|
||||
"COco0",
|
||||
@ -189,40 +145,19 @@ all_chars = all_chars .. "]"
|
||||
|
||||
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
--MFF crabman (fix new player disallow old player with similaire name)
|
||||
local exists = minetest.get_auth_handler().get_auth(name)
|
||||
if exists then return end
|
||||
if player_exempted(name) then return end
|
||||
|
||||
local lname = name:lower()
|
||||
for re, reason in pairs(disallowed) do
|
||||
if lname:find(re) then
|
||||
return reason
|
||||
end
|
||||
-- String off dashes and underscores from the start and end of the name.
|
||||
local stripped_name = name:match("^[_-]*(.-)[_-]*$")
|
||||
if not stripped_name or stripped_name == "" then
|
||||
return "Your name is composed solely of whitespace-like characters."
|
||||
end
|
||||
if disallowed_names[lname] then
|
||||
return "Sorry. This name is forbidden."
|
||||
end
|
||||
|
||||
local enumerate, e1, e2, e3 = minetest.get_auth_handler().enumerate_auths
|
||||
if enumerate then e1 = enumerate() else e1, e2, e3 = pairs(minetest.auth_table) end
|
||||
for iname, data in e1, e2, e3 do
|
||||
if iname:lower() == lname and iname ~= name then
|
||||
return "Sorry, someone else is already using this"
|
||||
.." name. Please pick another name."
|
||||
.." Another possibility is that you used the"
|
||||
.." wrong case for your name."
|
||||
end
|
||||
end
|
||||
|
||||
if exemptions[name] then return end
|
||||
|
||||
-- Generate a regular expression to match all similar names
|
||||
local re = name:gsub(all_chars, char_map)
|
||||
local re = stripped_name:gsub(all_chars, char_map)
|
||||
re = "^[_-]*" .. re .. "[_-]*$"
|
||||
|
||||
local enumerate, e1, e2, e3 = minetest.get_auth_handler().enumerate_auths
|
||||
if enumerate then e1 = enumerate() else e1, e2, e3 = pairs(minetest.auth_table) end
|
||||
for authName, _ in e1, e2, e3 do
|
||||
for authName, _ in pairs(minetest.auth_table) do
|
||||
if authName ~= name and authName:match(re) then
|
||||
return "Your name is too similar to another player's name."
|
||||
end
|
||||
@ -235,22 +170,13 @@ end)
|
||||
-- Name length --
|
||||
-----------------
|
||||
|
||||
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
|
||||
local min_name_len = tonumber(minetest.setting_get("name_restrictions.minimum_name_length")) or 3
|
||||
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if exemptions[name] then return end
|
||||
if player_exempted(name) then return end
|
||||
|
||||
if #name < min_name_len then
|
||||
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."
|
||||
return "Your player name is too short, please try a longer name."
|
||||
end
|
||||
end)
|
||||
|
||||
@ -310,7 +236,7 @@ end
|
||||
local pronounceability = tonumber(minetest.setting_get("name_restrictions.pronounceability"))
|
||||
if pronounceability then
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if exemptions[name] then return end
|
||||
if player_exempted(name) then return end
|
||||
|
||||
if not pronounceable(pronounceability, name) then
|
||||
return "Your player name does not seem to be pronounceable."
|
||||
|
Reference in New Issue
Block a user