Restored the auto-admin powers of the local user (via name= in the config)
authorCiaran Gultnieks <ciaran@ciarang.com>
Mon, 16 May 2011 17:26:37 +0000 (18:26 +0100)
committerCiaran Gultnieks <ciaran@ciarang.com>
Mon, 16 May 2011 17:26:37 +0000 (18:26 +0100)
--HG--
extra : rebase_source : a35aa0d978990c28fa4fc158ce47d1f4aa967c04

src/server.cpp
src/servercommand.cpp
src/servercommand.h

index 6c57daa5c1b660cbfe595a4dc68f9918c1d596f9..d211186eb0cdcbdc2a55a9627b6e2156d8f7a9b4 100644 (file)
@@ -2870,12 +2870,18 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 
                        message = message.substr(commandprefix.size());
 
+                       // 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;
+
                        ServerCommandContext *ctx = new ServerCommandContext(
                                str_split(message, L' '),
                                this,
                                &m_env,
-                               player
-                               );
+                               player,
+                               privs);
 
                        line += processServerCommand(ctx);
                        send_to_sender = ctx->flags & 1;
index 215dc0d275f09ff07efb0071c5620c03812bd8da..5bb4f67f823d437dff5325e5e6aacd02f1a7e80e 100644 (file)
@@ -33,11 +33,13 @@ void cmd_privs(std::wostringstream &os,
 {
        if(ctx->parms.size() == 1)
        {
+               // Show our own real privs, without any adjustments
+               // made for admin status
                os<<L"-!- " + privsToString(ctx->player->privs);
                return;
        }
 
-       if((ctx->player->privs & PRIV_PRIVS) == 0)
+       if((ctx->privs & PRIV_PRIVS) == 0)
        {
                os<<L"-!- You don't have permission to do that";
                return;
@@ -62,7 +64,7 @@ void cmd_grantrevoke(std::wostringstream &os,
                return;
        }
 
-       if((ctx->player->privs & PRIV_PRIVS) == 0)
+       if((ctx->privs & PRIV_PRIVS) == 0)
        {
                os<<L"-!- You don't have permission to do that";
                return;
@@ -100,7 +102,7 @@ void cmd_time(std::wostringstream &os,
                return;
        }
 
-       if((ctx->player->privs & PRIV_SETTIME) ==0)
+       if((ctx->privs & PRIV_SETTIME) ==0)
        {
                os<<L"-!- You don't have permission to do that";
                return;
@@ -114,7 +116,7 @@ void cmd_time(std::wostringstream &os,
 void cmd_shutdown(std::wostringstream &os,
        ServerCommandContext *ctx)
 {
-       if((ctx->player->privs & PRIV_SERVER) ==0)
+       if((ctx->privs & PRIV_SERVER) ==0)
        {
                os<<L"-!- You don't have permission to do that";
                return;
@@ -131,7 +133,7 @@ void cmd_shutdown(std::wostringstream &os,
 void cmd_setting(std::wostringstream &os,
        ServerCommandContext *ctx)
 {
-       if((ctx->player->privs & PRIV_SERVER) ==0)
+       if((ctx->privs & PRIV_SERVER) ==0)
        {
                os<<L"-!- You don't have permission to do that";
                return;
@@ -145,7 +147,7 @@ void cmd_setting(std::wostringstream &os,
 void cmd_teleport(std::wostringstream &os,
        ServerCommandContext *ctx)
 {
-       if((ctx->player->privs & PRIV_TELEPORT) ==0)
+       if((ctx->privs & PRIV_TELEPORT) ==0)
        {
                os<<L"-!- You don't have permission to do that";
                return;
@@ -178,7 +180,7 @@ std::wstring processServerCommand(ServerCommandContext *ctx)
        std::wostringstream os(std::ios_base::binary);
        ctx->flags = 1; // Default, unless we change it.
 
-       u64 privs = ctx->player->privs;
+       u64 privs = ctx->privs;
 
        if(ctx->parms.size() == 0 || ctx->parms[0] == L"help")
        {
index bc7823c66ed0dc1dfa7241c02f509312f8bec9f8..058fbe65ba246c43aea3ee89a2fd467e9e4bce63 100644 (file)
@@ -34,14 +34,18 @@ struct ServerCommandContext
        Server* server;
        ServerEnvironment *env;
        Player* player;
+       // Effective privs for the player, which may be different to their
+       // stored ones - e.g. if they are named in the config as an admin.
+       u64 privs;
        u32 flags;
 
        ServerCommandContext(
                std::vector<std::wstring> parms,
                Server* server,
                ServerEnvironment *env,
-               Player* player)
-               : parms(parms), server(server), env(env), player(player)
+               Player* player,
+               u64 privs)
+               : parms(parms), server(server), env(env), player(player), privs(privs)
        {
        }