white list with rights, should work now

master
Ilya Zhuravlev 2011-11-09 20:16:01 +04:00
parent a8fdc044c6
commit 74cb3cfa1b
4 changed files with 68 additions and 0 deletions

View File

@ -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;
}

View File

@ -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.

View File

@ -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);

View File

@ -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<<L"-!- You don't have permission to do that";
return;
}
if(ctx->parms.size() < 2)
{
os<<L"-!- Please, specify a nickname! ";
return;
}
std::string playername = wide_to_narrow(ctx->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<<L"-!- Adding new player, name: " << narrow_to_wide(playername) << L" password: " << narrow_to_wide(password);
ctx->server->addUser(playername, password);
return;
} else {
std::string password = generate_pwd();
os<<L"-!- Changing password for: " << narrow_to_wide(playername) << L" new password is: " << narrow_to_wide(password);
ctx->server->changePassword(playername, password);
return;
}
}
std::wstring processServerCommand(ServerCommandContext *ctx)
{
@ -328,6 +367,8 @@ std::wstring processServerCommand(ServerCommandContext *ctx)
os<<L" grant revoke";
if(privs & PRIV_BAN)
os<<L" ban unban";
if (privs & PRIV_WHITELIST)
os << L" white";
}
else if(ctx->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<<L"-!- Invalid command: " + ctx->parms[0];