From 74cb3cfa1b634319381ec37ed06b9c7ca75ee7e0 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Wed, 9 Nov 2011 20:16:01 +0400 Subject: [PATCH] white list with rights, should work now --- src/auth.cpp | 4 ++++ src/auth.h | 2 ++ src/server.h | 19 +++++++++++++++++++ src/servercommand.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/src/auth.cpp b/src/auth.cpp index dc74041..847cb67 100644 --- a/src/auth.cpp +++ b/src/auth.cpp @@ -42,6 +42,8 @@ std::string privsToString(u64 privs) os<<"shout,"; if(privs & PRIV_BAN) os<<"ban,"; + if (privs & PRIV_WHITELIST) + os << "whitelist,"; if(os.tellp()) { // Drop the trailing comma. (Why on earth can't @@ -74,6 +76,8 @@ u64 stringToPrivs(std::string str) privs |= PRIV_SHOUT; else if(s == "ban") privs |= PRIV_BAN; + else if (s == "whitelist") + privs |= PRIV_WHITELIST; else return PRIV_INVALID; } diff --git a/src/auth.h b/src/auth.h index 5ea697a..9d5e4c7 100644 --- a/src/auth.h +++ b/src/auth.h @@ -40,6 +40,8 @@ const u64 PRIV_SHOUT = 32; // Can broadcast chat messages to all // players const u64 PRIV_BAN = 64; // Can ban players +const u64 PRIV_WHITELIST = 128; // can add players to whitelist (actually, it is registering, but auto-registration was disabled for this server) + // Default privileges - these can be overriden for new players using the // config option "default_privs" - however, this value still applies for // players that existed before the privileges system was added. diff --git a/src/server.h b/src/server.h index b238bec..7fc544c 100644 --- a/src/server.h +++ b/src/server.h @@ -463,6 +463,25 @@ public: return; } + void addUser(const std::string &playername, const std::string &checkpwd) + { + m_authmanager.add(playername); + m_authmanager.setPassword(playername, translatePassword(playername, narrow_to_wide(checkpwd))); + //m_authmanager.setPrivs(playername, + // stringToPrivs(g_settings->get("default_privs"))); + m_authmanager.save(); + + } + + void changePassword(const std::string &playername, const std::string &checkpwd) + { + m_authmanager.setPassword(playername, translatePassword(playername, narrow_to_wide(checkpwd))); + //m_authmanager.setPrivs(playername, + // stringToPrivs(g_settings->get("default_privs"))); + m_authmanager.save(); + + } + std::string getBanDescription(const std::string &ip_or_name) { return m_banmanager.getBanDescription(ip_or_name); diff --git a/src/servercommand.cpp b/src/servercommand.cpp index 1565989..c12cae4 100644 --- a/src/servercommand.cpp +++ b/src/servercommand.cpp @@ -305,6 +305,45 @@ void cmd_clearobjects(std::wostringstream &os, ctx->flags |= SEND_TO_OTHERS; } +std::string generate_pwd() { + std::string result = ""; + for (int i = 0; i < 5; ++i) { + result += ('a' + myrand() % 26); + } + return result; +} + +void cmd_whitelist(std::wostringstream &os, ServerCommandContext *ctx) +{ + if((ctx->privs & PRIV_WHITELIST) == 0) + { + os<parms.size() < 2) + { + os<parms[1]).c_str(); + Player *player = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str()); + + if(player == NULL) + { + std::string password = generate_pwd(); + os<server->addUser(playername, password); + return; + } else { + std::string password = generate_pwd(); + os<server->changePassword(playername, password); + return; + } +} std::wstring processServerCommand(ServerCommandContext *ctx) { @@ -328,6 +367,8 @@ std::wstring processServerCommand(ServerCommandContext *ctx) os<parms[0] == L"status") cmd_status(os, ctx); @@ -349,6 +390,8 @@ std::wstring processServerCommand(ServerCommandContext *ctx) cmd_me(os, ctx); else if(ctx->parms[0] == L"clearobjects") cmd_clearobjects(os, ctx); + else if (ctx->parms[0] == L"white") + cmd_whitelist(os, ctx); else os<parms[0];