mirror of
https://github.com/ShadowNinja/name_restrictions.git
synced 2025-07-14 21:30:23 +02:00
Compare commits
10 Commits
master
...
nalc-1.2.0
Author | SHA1 | Date | |
---|---|---|---|
2f4569266e | |||
227445d5c7 | |||
3160d7a624 | |||
c58a4d5e49 | |||
97592b5eec | |||
c9df43a1f6 | |||
19167a0ff1 | |||
a560b387d4 | |||
fcf825e715 | |||
7aec733ad6 |
193
init.lua
193
init.lua
@ -7,78 +7,139 @@
|
||||
-- For legitimate player names that are caught by the filters.
|
||||
|
||||
local exemptions = {}
|
||||
local temp = minetest.setting_get("name_restrictions.exemptions")
|
||||
local temp = minetest.settings:get("name_restrictions.exemptions")
|
||||
temp = temp and temp:split() or {}
|
||||
for _, allowed_name in pairs(temp) do
|
||||
exemptions[allowed_name] = true
|
||||
end
|
||||
temp = nil
|
||||
-- Exempt server owner
|
||||
exemptions[minetest.setting_get("name")] = true
|
||||
exemptions[minetest.settings:get("name")] = true
|
||||
exemptions["singleplayer"] = true
|
||||
|
||||
local disallowed_names
|
||||
|
||||
local function load_forbidden_names()
|
||||
disallowed_names = {}
|
||||
local path = minetest.settings:get("name_restrictions.forbidden_names_list_path") or
|
||||
minetest.get_worldpath() .. "/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 --
|
||||
---------------------
|
||||
|
||||
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 disallowed
|
||||
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if exemptions[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
|
||||
local function load_disallowed()
|
||||
local path = minetest.settings:get("name_restrictions.forbidden_name_patterns_list_path") or
|
||||
minetest.get_worldpath() .. "/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'
|
||||
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 exemptions[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()
|
||||
for iname, data in pairs(minetest.auth_table) do
|
||||
local auth_handler = minetest.get_auth_handler()
|
||||
local enumerate, e1, e2, e3 = auth_handler.enumerate_auths
|
||||
if enumerate then e1 = enumerate() else e1, e2, e3 = auth_handler.iterate() end
|
||||
for iname, data in e1, e2, e3 do
|
||||
if iname:lower() == lname and iname ~= params then
|
||||
minetest.auth_table[iname] = nil
|
||||
local delete = auth_handler.delete_auth
|
||||
if delete then
|
||||
delete(iname)
|
||||
else
|
||||
minetest.auth_table[iname] = nil
|
||||
end
|
||||
assert(not iname:find("[/\\]"))
|
||||
os.remove(worldpath.."/players/"..iname)
|
||||
os.remove(worldpath .. "/players/" .. iname)
|
||||
end
|
||||
end
|
||||
return true, "Done."
|
||||
@ -92,7 +153,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 player names
|
||||
-- Only A-Z, a-z, 1-9, dash, and underscore are allowed in playernames
|
||||
"A4",
|
||||
"B8",
|
||||
"COco0",
|
||||
@ -129,13 +190,41 @@ all_chars = all_chars .. "]"
|
||||
|
||||
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
--MFF crabman & sys4 (fix new player disallow old player with similaire name)
|
||||
local auth_handler = minetest.get_auth_handler()
|
||||
local exists = auth_handler.get_auth(name)
|
||||
if exists then return end
|
||||
|
||||
local lname = name:lower()
|
||||
for re, reason in pairs(disallowed) do
|
||||
if lname:find(re) then
|
||||
return reason
|
||||
end
|
||||
end
|
||||
if disallowed_names[lname] then
|
||||
return "Sorry. This name is forbidden."
|
||||
end
|
||||
|
||||
local enumerate, e1, e2, e3 = auth_handler.enumerate_auths
|
||||
if enumerate then e1 = enumerate() else e1, e2, e3 = auth_handler.iterate() 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)
|
||||
re = "^[_-]*" .. re .. "[_-]*$"
|
||||
|
||||
for authName, _ in pairs(minetest.auth_table) do
|
||||
local enumerate, e1, e2, e3 = auth_handler.enumerate_auths
|
||||
if enumerate then e1 = enumerate() else e1, e2, e3 = auth_handler.iterate() end
|
||||
for authName, _ in e1, e2, e3 do
|
||||
if authName ~= name and authName:match(re) then
|
||||
return "Your name is too similar to another player's name."
|
||||
end
|
||||
@ -148,13 +237,22 @@ end)
|
||||
-- Name length --
|
||||
-----------------
|
||||
|
||||
local min_name_len = tonumber(minetest.setting_get("name_restrictions.minimum_name_length")) or 3
|
||||
local min_name_len = tonumber(minetest.settings:get("name_restrictions.minimum_name_length")) or 2
|
||||
local max_name_len = tonumber(minetest.settings:get("name_restrictions.maximum_name_length")) or 17
|
||||
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if exemptions[name] then return end
|
||||
|
||||
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)
|
||||
|
||||
@ -211,7 +309,7 @@ end
|
||||
-- 0.5 = Strict checking.
|
||||
-- 1 = Normal checking.
|
||||
-- 2 = Relaxed checking.
|
||||
local pronounceability = tonumber(minetest.setting_get("name_restrictions.pronounceability"))
|
||||
local pronounceability = tonumber(minetest.settings:get("name_restrictions.pronounceability"))
|
||||
if pronounceability then
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if exemptions[name] then return end
|
||||
@ -223,3 +321,4 @@ if pronounceability then
|
||||
end)
|
||||
end
|
||||
|
||||
minetest.log("action", "[name_restrictions] loaded.")
|
||||
|
Reference in New Issue
Block a user