diff options
author | Perttu Ahola <celeron55@gmail.com> | 2012-03-15 15:27:16 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-03-15 15:38:59 +0200 |
commit | 5957fed9a7df9297dd218b6400d612434e87ac5a (patch) | |
tree | a4af7d28234fa59b4b54a8658e6c75544bf3dd2c | |
parent | 6298878bfa996754fad0e530a209411f72cfdfac (diff) | |
download | minetest-5957fed9a7df9297dd218b6400d612434e87ac5a.tar.gz minetest-5957fed9a7df9297dd218b6400d612434e87ac5a.tar.bz2 minetest-5957fed9a7df9297dd218b6400d612434e87ac5a.zip |
Fix and improve Server's privilege get/setters
-rw-r--r-- | src/scriptapi.cpp | 5 | ||||
-rw-r--r-- | src/server.cpp | 45 | ||||
-rw-r--r-- | src/server.h | 27 |
3 files changed, 40 insertions, 37 deletions
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 99c3767ae..e8ebecb5a 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -3551,10 +3551,7 @@ static int l_get_player_privs(lua_State *L) // Do it lua_newtable(L); int table = lua_gettop(L); - u64 privs_i = server->getPlayerAuthPrivs(name); - // Special case for the "name" setting (local player / server owner) - if(name == g_settings->get("name")) - privs_i = PRIV_ALL; + u64 privs_i = server->getPlayerEffectivePrivs(name); std::set<std::string> privs_s = privsToSet(privs_i); for(std::set<std::string>::const_iterator i = privs_s.begin(); i != privs_s.end(); i++){ diff --git a/src/server.cpp b/src/server.cpp index a74a2ee75..2139df957 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4182,6 +4182,40 @@ std::wstring Server::getStatusString() return os.str(); } +u64 Server::getPlayerAuthPrivs(const std::string &name) +{ + try{ + return m_authmanager.getPrivs(name); + } + catch(AuthNotFoundException &e) + { + dstream<<"WARNING: Auth not found for "<<name<<std::endl; + return 0; + } +} + +void Server::setPlayerAuthPrivs(const std::string &name, u64 privs) +{ + try{ + return m_authmanager.setPrivs(name, privs); + } + catch(AuthNotFoundException &e) + { + dstream<<"WARNING: Auth not found for "<<name<<std::endl; + } +} + +u64 Server::getPlayerEffectivePrivs(const std::string &name) +{ + // Local player gets all privileges regardless of + // what's set on their account. + if(m_simple_singleplayer_mode) + return PRIV_ALL; + if(name == g_settings->get("name")) + return PRIV_ALL; + return getPlayerAuthPrivs(name); +} + void Server::setPlayerPassword(const std::string &name, const std::wstring &password) { // Add player to auth manager @@ -4570,16 +4604,7 @@ u64 Server::getPlayerPrivs(Player *player) if(player==NULL) return 0; std::string playername = player->getName(); - // Local player gets all privileges regardless of - // what's set on their account. - if(g_settings->get("name") == playername) - { - return PRIV_ALL; - } - else - { - return getPlayerAuthPrivs(playername); - } + return getPlayerEffectivePrivs(playername); } void dedicated_server_loop(Server &server, bool &kill) diff --git a/src/server.h b/src/server.h index 31e3ed176..f149ac687 100644 --- a/src/server.h +++ b/src/server.h @@ -465,32 +465,13 @@ public: m_shutdown_requested = true; } - // Envlock and conlock should be locked when calling this void SendMovePlayer(Player *player); - u64 getPlayerAuthPrivs(const std::string &name) - { - try{ - return m_authmanager.getPrivs(name); - } - catch(AuthNotFoundException &e) - { - dstream<<"WARNING: Auth not found for "<<name<<std::endl; - return 0; - } - } - - void setPlayerAuthPrivs(const std::string &name, u64 privs) - { - try{ - return m_authmanager.setPrivs(name, privs); - } - catch(AuthNotFoundException &e) - { - dstream<<"WARNING: Auth not found for "<<name<<std::endl; - } - } + // Thread-safe + u64 getPlayerAuthPrivs(const std::string &name); + void setPlayerAuthPrivs(const std::string &name, u64 privs); + u64 getPlayerEffectivePrivs(const std::string &name); // Changes a player's password, password must be given as plaintext // If the player doesn't exist, a new entry is added to the auth manager |