summaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-03-31 16:23:26 +0300
committerPerttu Ahola <celeron55@gmail.com>2012-03-31 16:25:02 +0300
commit52122c342d335a2561ace87c9d8deaa16a136604 (patch)
tree33ed625674d82c505b347adf26307748c85c8cfc /builtin
parent96ee73f79018c8aae22a392af6f66f9a05cb0174 (diff)
downloadminetest-52122c342d335a2561ace87c9d8deaa16a136604.tar.gz
minetest-52122c342d335a2561ace87c9d8deaa16a136604.tar.bz2
minetest-52122c342d335a2561ace87c9d8deaa16a136604.zip
Add 'fly' and 'fast' privileges and the underlying privileges-to-client system
Diffstat (limited to 'builtin')
-rw-r--r--builtin/builtin.lua77
1 files changed, 60 insertions, 17 deletions
diff --git a/builtin/builtin.lua b/builtin/builtin.lua
index d6782a49a..35501787c 100644
--- a/builtin/builtin.lua
+++ b/builtin/builtin.lua
@@ -870,8 +870,24 @@ end
--
minetest.registered_privileges = {}
-function minetest.register_privilege(name, description)
- minetest.registered_privileges[name] = description
+
+function minetest.register_privilege(name, param)
+ local function fill_defaults(def)
+ if def.give_to_singleplayer == nil then
+ def.give_to_singleplayer = true
+ end
+ if def.description == nil then
+ def.description = "(no description)"
+ end
+ end
+ local def = {}
+ if type(param) == "table" then
+ def = param
+ else
+ def = {description = param}
+ end
+ fill_defaults(def)
+ minetest.registered_privileges[name] = def
end
minetest.register_privilege("interact", "Can interact with things and modify the world")
@@ -884,6 +900,14 @@ minetest.register_privilege("shout", "Can speak in chat")
minetest.register_privilege("ban", "Can ban and unban players")
minetest.register_privilege("give", "Can use /give and /giveme")
minetest.register_privilege("password", "Can use /setpassword and /clearpassword")
+minetest.register_privilege("fly", {
+ description = "Can fly using the free_move mode",
+ give_to_singleplayer = false,
+})
+minetest.register_privilege("fast", {
+ description = "Can walk fast using the fast_move mode",
+ give_to_singleplayer = false,
+})
--
-- Chat commands
@@ -929,8 +953,8 @@ minetest.register_chatcommand("help", {
end
elseif param == "privs" then
minetest.chat_send_player(name, "Available privileges:")
- for priv, desc in pairs(minetest.registered_privileges) do
- minetest.chat_send_player(name, priv..": "..desc)
+ for priv, def in pairs(minetest.registered_privileges) do
+ minetest.chat_send_player(name, priv..": "..def.description)
end
else
local cmd = param
@@ -1004,7 +1028,7 @@ minetest.register_chatcommand("revoke", {
local revokeprivs = minetest.string_to_privs(revokeprivstr)
local privs = minetest.get_player_privs(revokename)
for priv, _ in pairs(revokeprivs) do
- table.remove(privs, priv)
+ privs[priv] = nil
end
minetest.set_player_privs(revokename, privs)
end,
@@ -1200,6 +1224,7 @@ local function read_auth_file()
end
io.close(file)
minetest.auth_table = newtable
+ minetest.notify_authentication_modified()
end
local function save_auth_file()
@@ -1228,24 +1253,41 @@ read_auth_file()
minetest.builtin_auth_handler = {
get_auth = function(name)
assert(type(name) == "string")
+ -- Figure out what password to use for a new player (singleplayer
+ -- always has an empty password, otherwise use default, which is
+ -- usually empty too)
+ local new_password_hash = ""
+ if not minetest.is_singleplayer() then
+ new_password_hash = minetest.get_password_hash(name, minetest.setting_get("default_password"))
+ end
+ -- Add player to authentication table if not there already
if not minetest.auth_table[name] then
minetest.builtin_auth_handler.create_auth(name, minetest.get_password_hash(name, minetest.setting_get("default_password")))
end
+ -- Figure out what privileges the player should have.
+ -- Take a copy of the privilege table
+ local privileges = {}
+ for priv, _ in pairs(minetest.auth_table[name].privileges) do
+ privileges[priv] = true
+ end
+ -- If singleplayer, give all privileges except those marked as give_to_singleplayer = false
if minetest.is_singleplayer() then
- return {
- password = "",
- privileges = minetest.registered_privileges
- }
- else
- if minetest.auth_table[name] and name == minetest.setting_get("name") then
- return {
- password = minetest.auth_table[name].password,
- privileges = minetest.registered_privileges
- }
- else
- return minetest.auth_table[name]
+ for priv, def in pairs(minetest.registered_privileges) do
+ if def.give_to_singleplayer then
+ privileges[priv] = true
+ end
+ end
+ -- For the admin, give everything
+ elseif name == minetest.setting_get("name") then
+ for priv, def in pairs(minetest.registered_privileges) do
+ privileges[priv] = true
end
end
+ -- All done
+ return {
+ password = minetest.auth_table[name].password,
+ privileges = privileges,
+ }
end,
create_auth = function(name, password)
assert(type(name) == "string")
@@ -1275,6 +1317,7 @@ minetest.builtin_auth_handler = {
minetest.builtin_auth_handler.create_auth(name, minetest.get_password_hash(name, minetest.setting_get("default_password")))
end
minetest.auth_table[name].privileges = privileges
+ minetest.notify_authentication_modified(name)
save_auth_file()
end
}