From 63611932ebae93620386b26cfa82f7c4552b22ff Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 29 May 2011 21:11:16 +0300 Subject: player passwords and privileges in world/auth.txt --HG-- extra : rebase_source : 7260636295d9068fbeeddf4143c89f2b8a91446c --- src/player.cpp | 64 +++++----------------------------------------------------- 1 file changed, 5 insertions(+), 59 deletions(-) (limited to 'src/player.cpp') diff --git a/src/player.cpp b/src/player.cpp index 147b6c97a..efb2f3447 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -23,58 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "utility.h" -// Convert a privileges value into a human-readable string, -// with each component separated by a comma. -std::wstring privsToString(u64 privs) -{ - std::wostringstream os(std::ios_base::binary); - if(privs & PRIV_BUILD) - os< pr; - pr=str_split(str, ','); - for(std::vector::iterator i = pr.begin(); - i != pr.end(); ++i) - { - if(*i == L"build") - privs |= PRIV_BUILD; - else if(*i == L"teleport") - privs |= PRIV_TELEPORT; - else if(*i == L"settime") - privs |= PRIV_SETTIME; - else if(*i == L"privs") - privs |= PRIV_PRIVS; - else if(*i == L"shout") - privs |= PRIV_SHOUT; - else - return PRIV_INVALID; - } - return privs; -} - Player::Player(): touching_ground(false), @@ -83,7 +31,6 @@ Player::Player(): swimming_up(false), craftresult_is_preview(true), hp(20), - privs(PRIV_DEFAULT), peer_id(PEER_ID_INEXISTENT), m_pitch(0), m_yaw(0), @@ -91,7 +38,6 @@ Player::Player(): m_position(0,0,0) { updateName(""); - updatePassword(""); resetInventory(); } @@ -150,7 +96,7 @@ void Player::serialize(std::ostream &os) Settings args; args.setS32("version", 1); args.set("name", m_name); - args.set("password", m_password); + //args.set("password", m_password); args.setFloat("pitch", m_pitch); args.setFloat("yaw", m_yaw); args.setV3F("position", m_position); @@ -185,10 +131,10 @@ void Player::deSerialize(std::istream &is) //args.getS32("version"); std::string name = args.get("name"); updateName(name.c_str()); - std::string password = ""; + /*std::string password = ""; if(args.exists("password")) password = args.get("password"); - updatePassword(password.c_str()); + updatePassword(password.c_str());*/ m_pitch = args.getFloat("pitch"); m_yaw = args.getFloat("yaw"); m_position = args.getV3F("position"); @@ -202,7 +148,7 @@ void Player::deSerialize(std::istream &is) }catch(SettingNotFoundException &e){ hp = 20; } - try{ + /*try{ std::string sprivs = args.get("privs"); if(sprivs == "all") { @@ -215,7 +161,7 @@ void Player::deSerialize(std::istream &is) } }catch(SettingNotFoundException &e){ privs = PRIV_DEFAULT; - } + }*/ inventory.deSerialize(is); } -- cgit v1.2.3 From e81919c818c6040de7401a037e3fdfac88b28eea Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 29 May 2011 22:34:04 +0300 Subject: hopefully fixed the privilege problems --HG-- extra : rebase_source : 9826d20176134a53ff232816a10407465d8c0f50 --- doc/changelog.txt | 2 +- src/player.cpp | 1 - src/player.h | 3 --- src/server.cpp | 48 ++++++++++++++++++++++++++++++++++++------------ src/server.h | 24 ++++++++++++++++++++++++ src/servercommand.cpp | 16 +++++++++++----- 6 files changed, 72 insertions(+), 22 deletions(-) (limited to 'src/player.cpp') diff --git a/doc/changelog.txt b/doc/changelog.txt index 7089146a0..e02019783 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -3,7 +3,7 @@ Minetest-c55 changelog This should contain all the major changes. For minor stuff, refer to the commit log of the repository. -X: +2011-05-29: - Optimized smooth lighting - A number of small fixes - Added clouds and simple skyboxes diff --git a/src/player.cpp b/src/player.cpp index efb2f3447..198eca957 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -102,7 +102,6 @@ void Player::serialize(std::ostream &os) args.setV3F("position", m_position); args.setBool("craftresult_is_preview", craftresult_is_preview); args.setS32("hp", hp); - args.setU64("privs", privs); args.writeLines(os); diff --git a/src/player.h b/src/player.h index 157a25b5b..a7a2433ce 100644 --- a/src/player.h +++ b/src/player.h @@ -126,9 +126,6 @@ public: u16 hp; - // Player's privileges - a bitmaps of PRIV_xxxx. - u64 privs; - u16 peer_id; protected: diff --git a/src/server.cpp b/src/server.cpp index 4569d028e..56874c46c 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2083,7 +2083,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) if(datasize < 13) return; - if((player->privs & PRIV_BUILD) == 0) + if((getPlayerPrivs(player) & PRIV_BUILD) == 0) return; /* @@ -2167,7 +2167,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) if(datasize < 7) return; - if((player->privs & PRIV_BUILD) == 0) + if((getPlayerPrivs(player) & PRIV_BUILD) == 0) return; /* @@ -2368,8 +2368,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) } // Make sure the player is allowed to do it - if((player->privs & PRIV_BUILD) == 0) + if((getPlayerPrivs(player) & PRIV_BUILD) == 0) + { + dstream<<"Player "<getName()<<" cannot remove node" + <<" because privileges are "<getName()<<" cannot add node" + <<" because privileges are "<privs & PRIV_BUILD) ==0) + || no_enough_privs) { // Client probably has wrong data. // Set block not sent, so that client will get @@ -2715,7 +2727,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) #endif else if(command == TOSERVER_SIGNTEXT) { - if((player->privs & PRIV_BUILD) == 0) + if((getPlayerPrivs(player) & PRIV_BUILD) == 0) return; /* u16 command @@ -2774,7 +2786,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) } else if(command == TOSERVER_SIGNNODETEXT) { - if((player->privs & PRIV_BUILD) == 0) + if((getPlayerPrivs(player) & PRIV_BUILD) == 0) return; /* u16 command @@ -2952,9 +2964,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) // Local player gets all privileges regardless of // what's set on their account. - u64 privs = player->privs; - if(g_settings.get("name") == player->getName()) - privs = PRIV_ALL; + u64 privs = getPlayerPrivs(player); // Parse commands std::wstring commandprefix = L"/#"; @@ -4288,9 +4298,6 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id m_authmanager.setPrivs(name, stringToPrivs(g_settings.get("default_privs"))); - if(g_settings.exists("default_privs")) - player->privs = g_settings.getU64("default_privs"); - /* Set player position */ @@ -4503,6 +4510,23 @@ void Server::handlePeerChanges() } } +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); + } +} + void dedicated_server_loop(Server &server, bool &kill) { DSTACK(__FUNCTION_NAME); diff --git a/src/server.h b/src/server.h index a6da801be..7b73e476c 100644 --- a/src/server.h +++ b/src/server.h @@ -424,7 +424,29 @@ public: // 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 "<player->privs)); + os<server->getPlayerAuthPrivs(ctx->player->getName()))); return; } @@ -52,7 +53,7 @@ void cmd_privs(std::wostringstream &os, return; } - os<privs)); + os<server->getPlayerAuthPrivs(tp->getName()))); } void cmd_grantrevoke(std::wostringstream &os, @@ -83,14 +84,19 @@ void cmd_grantrevoke(std::wostringstream &os, os<parms[1]); + u64 privs = ctx->server->getPlayerAuthPrivs(playername); if(ctx->parms[0] == L"grant") - tp->privs |= newprivs; + privs |= newprivs; else - tp->privs &= ~newprivs; + privs &= ~newprivs; + + ctx->server->setPlayerAuthPrivs(playername, privs); os<privs)); + os<