aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-03-15 15:27:16 +0200
committerPerttu Ahola <celeron55@gmail.com>2012-03-15 15:38:59 +0200
commit5957fed9a7df9297dd218b6400d612434e87ac5a (patch)
treea4af7d28234fa59b4b54a8658e6c75544bf3dd2c
parent6298878bfa996754fad0e530a209411f72cfdfac (diff)
downloadminetest-5957fed9a7df9297dd218b6400d612434e87ac5a.tar.gz
minetest-5957fed9a7df9297dd218b6400d612434e87ac5a.tar.bz2
minetest-5957fed9a7df9297dd218b6400d612434e87ac5a.zip
Fix and improve Server's privilege get/setters
-rw-r--r--src/scriptapi.cpp5
-rw-r--r--src/server.cpp45
-rw-r--r--src/server.h27
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