hopefully fixed the privilege problems

--HG--
extra : rebase_source : 9826d20176134a53ff232816a10407465d8c0f50
This commit is contained in:
Perttu Ahola 2011-05-29 22:34:04 +03:00
parent e8b8ed0280
commit e81919c818
6 changed files with 72 additions and 22 deletions

@ -3,7 +3,7 @@ Minetest-c55 changelog
This should contain all the major changes. This should contain all the major changes.
For minor stuff, refer to the commit log of the repository. For minor stuff, refer to the commit log of the repository.
X: 2011-05-29:
- Optimized smooth lighting - Optimized smooth lighting
- A number of small fixes - A number of small fixes
- Added clouds and simple skyboxes - Added clouds and simple skyboxes

@ -102,7 +102,6 @@ void Player::serialize(std::ostream &os)
args.setV3F("position", m_position); args.setV3F("position", m_position);
args.setBool("craftresult_is_preview", craftresult_is_preview); args.setBool("craftresult_is_preview", craftresult_is_preview);
args.setS32("hp", hp); args.setS32("hp", hp);
args.setU64("privs", privs);
args.writeLines(os); args.writeLines(os);

@ -126,9 +126,6 @@ public:
u16 hp; u16 hp;
// Player's privileges - a bitmaps of PRIV_xxxx.
u64 privs;
u16 peer_id; u16 peer_id;
protected: protected:

@ -2083,7 +2083,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
if(datasize < 13) if(datasize < 13)
return; return;
if((player->privs & PRIV_BUILD) == 0) if((getPlayerPrivs(player) & PRIV_BUILD) == 0)
return; return;
/* /*
@ -2167,7 +2167,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
if(datasize < 7) if(datasize < 7)
return; return;
if((player->privs & PRIV_BUILD) == 0) if((getPlayerPrivs(player) & PRIV_BUILD) == 0)
return; return;
/* /*
@ -2368,8 +2368,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
} }
// Make sure the player is allowed to do it // Make sure the player is allowed to do it
if((player->privs & PRIV_BUILD) == 0) if((getPlayerPrivs(player) & PRIV_BUILD) == 0)
{
dstream<<"Player "<<player->getName()<<" cannot remove node"
<<" because privileges are "<<getPlayerPrivs(player)
<<std::endl;
cannot_remove_node = true; cannot_remove_node = true;
}
/* /*
If node can't be removed, set block to be re-sent to If node can't be removed, set block to be re-sent to
@ -2517,8 +2522,15 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
try{ try{
// Don't add a node if this is not a free space // Don't add a node if this is not a free space
MapNode n2 = m_env.getMap().getNode(p_over); MapNode n2 = m_env.getMap().getNode(p_over);
bool no_enough_privs =
((getPlayerPrivs(player) & PRIV_BUILD)==0);
if(no_enough_privs)
dstream<<"Player "<<player->getName()<<" cannot add node"
<<" because privileges are "<<getPlayerPrivs(player)
<<std::endl;
if(content_buildable_to(n2.d) == false if(content_buildable_to(n2.d) == false
|| (player->privs & PRIV_BUILD) ==0) || no_enough_privs)
{ {
// Client probably has wrong data. // Client probably has wrong data.
// Set block not sent, so that client will get // Set block not sent, so that client will get
@ -2715,7 +2727,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
#endif #endif
else if(command == TOSERVER_SIGNTEXT) else if(command == TOSERVER_SIGNTEXT)
{ {
if((player->privs & PRIV_BUILD) == 0) if((getPlayerPrivs(player) & PRIV_BUILD) == 0)
return; return;
/* /*
u16 command u16 command
@ -2774,7 +2786,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
} }
else if(command == TOSERVER_SIGNNODETEXT) else if(command == TOSERVER_SIGNNODETEXT)
{ {
if((player->privs & PRIV_BUILD) == 0) if((getPlayerPrivs(player) & PRIV_BUILD) == 0)
return; return;
/* /*
u16 command u16 command
@ -2952,9 +2964,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
// Local player gets all privileges regardless of // Local player gets all privileges regardless of
// what's set on their account. // what's set on their account.
u64 privs = player->privs; u64 privs = getPlayerPrivs(player);
if(g_settings.get("name") == player->getName())
privs = PRIV_ALL;
// Parse commands // Parse commands
std::wstring commandprefix = L"/#"; std::wstring commandprefix = L"/#";
@ -4288,9 +4298,6 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id
m_authmanager.setPrivs(name, m_authmanager.setPrivs(name,
stringToPrivs(g_settings.get("default_privs"))); stringToPrivs(g_settings.get("default_privs")));
if(g_settings.exists("default_privs"))
player->privs = g_settings.getU64("default_privs");
/* /*
Set player position 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) void dedicated_server_loop(Server &server, bool &kill)
{ {
DSTACK(__FUNCTION_NAME); DSTACK(__FUNCTION_NAME);

@ -424,7 +424,29 @@ public:
// Envlock and conlock should be locked when calling this // Envlock and conlock should be locked when calling this
void SendMovePlayer(Player *player); 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;
}
}
private: private:
@ -493,6 +515,8 @@ private:
void handlePeerChange(PeerChange &c); void handlePeerChange(PeerChange &c);
void handlePeerChanges(); void handlePeerChanges();
u64 getPlayerPrivs(Player *player);
/* /*
Variables Variables
*/ */

@ -35,7 +35,8 @@ void cmd_privs(std::wostringstream &os,
{ {
// Show our own real privs, without any adjustments // Show our own real privs, without any adjustments
// made for admin status // made for admin status
os<<L"-!- " + narrow_to_wide(privsToString(ctx->player->privs)); os<<L"-!- " + narrow_to_wide(privsToString(
ctx->server->getPlayerAuthPrivs(ctx->player->getName())));
return; return;
} }
@ -52,7 +53,7 @@ void cmd_privs(std::wostringstream &os,
return; return;
} }
os<<L"-!- " + narrow_to_wide(privsToString(tp->privs)); os<<L"-!- " + narrow_to_wide(privsToString(ctx->server->getPlayerAuthPrivs(tp->getName())));
} }
void cmd_grantrevoke(std::wostringstream &os, void cmd_grantrevoke(std::wostringstream &os,
@ -83,14 +84,19 @@ void cmd_grantrevoke(std::wostringstream &os,
os<<L"-!- No such player"; os<<L"-!- No such player";
return; return;
} }
std::string playername = wide_to_narrow(ctx->parms[1]);
u64 privs = ctx->server->getPlayerAuthPrivs(playername);
if(ctx->parms[0] == L"grant") if(ctx->parms[0] == L"grant")
tp->privs |= newprivs; privs |= newprivs;
else else
tp->privs &= ~newprivs; privs &= ~newprivs;
ctx->server->setPlayerAuthPrivs(playername, privs);
os<<L"-!- Privileges change to "; os<<L"-!- Privileges change to ";
os<<narrow_to_wide(privsToString(tp->privs)); os<<narrow_to_wide(privsToString(privs));
} }
void cmd_time(std::wostringstream &os, void cmd_time(std::wostringstream &os,