diff --git a/builtin/builtin.lua b/builtin/builtin.lua index 35501787c..2ca5f15a2 100644 --- a/builtin/builtin.lua +++ b/builtin/builtin.lua @@ -990,11 +990,7 @@ minetest.register_chatcommand("privs", { minetest.chat_send_player(name, "Privileges of "..param.." are hidden from you.") end end - privs = {} - for priv, _ in pairs(minetest.get_player_privs(param)) do - table.insert(privs, priv) - end - minetest.chat_send_player(name, "Privileges of "..param..": "..table.concat(privs, " ")) + minetest.chat_send_player(name, "Privileges of "..param..": "..minetest.privs_to_string(minetest.get_player_privs(param), ' ')) end, }) minetest.register_chatcommand("grant", { @@ -1013,6 +1009,10 @@ minetest.register_chatcommand("grant", { privs[priv] = true end minetest.set_player_privs(grantname, privs) + minetest.chat_send_player(name, "Privileges of "..grantname..": "..minetest.privs_to_string(minetest.get_player_privs(grantname), ' ')) + if grantname ~= name then + minetest.chat_send_player(grantname, name.." granted you privileges: "..minetest.privs_to_string(grantprivs, ' ')) + end end, }) minetest.register_chatcommand("revoke", { @@ -1031,6 +1031,10 @@ minetest.register_chatcommand("revoke", { privs[priv] = nil end minetest.set_player_privs(revokename, privs) + minetest.chat_send_player(name, "Privileges of "..revokename..": "..minetest.privs_to_string(minetest.get_player_privs(revokename), ' ')) + if revokename ~= name then + minetest.chat_send_player(revokename, name.." revoked privileges from you: "..minetest.privs_to_string(revokeprivs, ' ')) + end end, }) minetest.register_chatcommand("setpassword", { @@ -1056,6 +1060,20 @@ minetest.register_chatcommand("clearpassword", { end, }) +minetest.register_chatcommand("auth_reload", { + params = "", + description = "reload authentication data", + privs = {server=true}, + func = function(name, param) + local done = minetest.auth_reload() + if done then + minetest.chat_send_player(name, "Done.") + else + minetest.chat_send_player(name, "Failed.") + end + end, +}) + minetest.register_chatcommand("teleport", { params = ",, | | ,, | ", description = "teleport to given position", @@ -1179,24 +1197,26 @@ end) -- Authentication handler -- -function minetest.string_to_privs(str) +function minetest.string_to_privs(str, delim) assert(type(str) == "string") + delim = delim or ',' privs = {} - for _, priv in pairs(string.split(str, ',')) do + for _, priv in pairs(string.split(str, delim)) do privs[priv:trim()] = true end return privs end -function minetest.privs_to_string(privs) +function minetest.privs_to_string(privs, delim) assert(type(privs) == "table") + delim = delim or ',' list = {} for priv, bool in pairs(privs) do if bool then table.insert(list, priv) end end - return table.concat(list, ',') + return table.concat(list, delim) end assert(minetest.string_to_privs("a,b").b == true) @@ -1319,7 +1339,11 @@ minetest.builtin_auth_handler = { minetest.auth_table[name].privileges = privileges minetest.notify_authentication_modified(name) save_auth_file() - end + end, + reload = function() + read_auth_file() + return true + end, } function minetest.register_authentication_handler(handler) @@ -1338,11 +1362,22 @@ function minetest.get_auth_handler() end function minetest.set_player_password(name, password) - minetest.get_auth_handler().set_password(name, password) + if minetest.get_auth_handler().set_password then + minetest.get_auth_handler().set_password(name, password) + end end function minetest.set_player_privs(name, privs) - minetest.get_auth_handler().set_privileges(name, privs) + if minetest.get_auth_handler().set_privileges then + minetest.get_auth_handler().set_privileges(name, privs) + end +end + +function minetest.auth_reload() + if minetest.get_auth_handler().reload then + return minetest.get_auth_handler().reload() + end + return false end -- diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 3ba59565b..61cb73f30 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -532,6 +532,7 @@ minetest.privs_to_string(privs) -> "priv1,priv2,..." minetest.set_player_password(name, password_hash) minetest.set_player_privs(name, {priv1=true,...}) minetest.get_player_privs(name) -> {priv1=true,...} +minetest.auth_reload() ^ These call the authentication handler minetest.check_player_privs(name, {priv1=true,...}) -> bool, missing_privs ^ A quickhand for checking privileges