hopefully fixed the privilege problems
--HG-- extra : rebase_source : 9826d20176134a53ff232816a10407465d8c0f50
This commit is contained in:
parent
e8b8ed0280
commit
e81919c818
|
@ -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);
|
||||||
|
|
24
src/server.h
24
src/server.h
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue