From c57df2bd7ba96719438bbc34e1362f0f91622921 Mon Sep 17 00:00:00 2001 From: Philipp Sehmisch Date: Sun, 17 Jan 2010 19:13:23 +0100 Subject: Removed last traces of hardcoded access levels form game-server, begun with using the permission manager in the account-server. --- src/account-server/accounthandler.cpp | 5 +- src/account-server/storage.cpp | 3 + src/chat-server/chathandler.cpp | 3 +- src/common/permissionmanager.cpp | 34 +++++++++--- src/common/permissionmanager.hpp | 6 ++ src/defines.h | 18 ------ src/game-server/commandhandler.cpp | 102 +++++++--------------------------- 7 files changed, 59 insertions(+), 112 deletions(-) diff --git a/src/account-server/accounthandler.cpp b/src/account-server/accounthandler.cpp index 83a4a8a0..dbd74b07 100644 --- a/src/account-server/accounthandler.cpp +++ b/src/account-server/accounthandler.cpp @@ -29,6 +29,7 @@ #include "account-server/serverhandler.hpp" #include "chat-server/chathandler.hpp" #include "common/configuration.hpp" +#include "common/permissionmanager.hpp" #include "common/transaction.hpp" #include "net/connectionhandler.hpp" #include "net/messagein.hpp" @@ -234,7 +235,7 @@ void AccountHandler::handleLoginMessage(AccountClient &client, MessageIn &msg) return; } - if (acc->getLevel() == AL_BANNED) + if (PermissionManager::checkPermission(acc->getLevel(), "!play") != PermissionManager::PMR_ALLOWED) { reply.writeByte(LOGIN_BANNED); client.send(reply); @@ -389,7 +390,7 @@ void AccountHandler::handleRegisterMessage(AccountClient &client, MessageIn &msg // we ask for it again when we need it and verify it // through comparing it with the hash acc->setEmail(sha256(email)); - acc->setLevel(AL_PLAYER); + acc->setLevel(0x01); // set the date and time of the account registration, and the last login time_t regdate; diff --git a/src/account-server/storage.cpp b/src/account-server/storage.cpp index c547977f..7bc020c8 100644 --- a/src/account-server/storage.cpp +++ b/src/account-server/storage.cpp @@ -36,6 +36,9 @@ #include "utils/xml.hpp" #include "utils/sha256.h" +#define AL_BANNED 0x00 // temporary workaround until permission manager support is added +#define AL_PLAYER 0x01 // temporary workaround until permission manager support is added + // TODO: make data/items.xml a constant or read it from config file static const char *DEFAULT_ITEM_FILE = "data/items.xml"; diff --git a/src/chat-server/chathandler.cpp b/src/chat-server/chathandler.cpp index 0069eb91..27a9a006 100644 --- a/src/chat-server/chathandler.cpp +++ b/src/chat-server/chathandler.cpp @@ -31,6 +31,7 @@ #include "chat-server/chatclient.hpp" #include "chat-server/chathandler.hpp" #include "common/transaction.hpp" +#include "common/permissionmanager.hpp" #include "net/connectionhandler.hpp" #include "net/messagein.hpp" #include "net/messageout.hpp" @@ -320,7 +321,7 @@ ChatHandler::handleAnnounceMessage(ChatClient &client, MessageIn &msg) return; } - if (client.accountLevel == AL_ADMIN || client.accountLevel == AL_GM) + if (PermissionManager::checkPermission(client.accountLevel, "@broadcast") == PermissionManager::PMR_ALLOWED) { // TODO: b_lindeijer: Shouldn't announcements also have a sender? LOG_INFO("ANNOUNCE: " << text); diff --git a/src/common/permissionmanager.cpp b/src/common/permissionmanager.cpp index d7c1a7a2..d268a9df 100644 --- a/src/common/permissionmanager.cpp +++ b/src/common/permissionmanager.cpp @@ -123,18 +123,15 @@ void PermissionManager::reload() } } } - - LOG_INFO("Permission List:"); - for (std::map::iterator i = permissions.begin(); - i != permissions.end(); - i++) - { - LOG_INFO(i->first<<" "<<(int)i->second); - } } PermissionManager::Result PermissionManager::checkPermission(const Character* character, std::string permission) +{ + return checkPermission(character->getAccountLevel(), permission); +} + +PermissionManager::Result PermissionManager::checkPermission(unsigned char level, std::string permission) { std::map::iterator iP = permissions.find(permission); @@ -143,7 +140,7 @@ PermissionManager::Result PermissionManager::checkPermission(const Character* ch LOG_WARN("PermissionManager: Check for unknown permission \""<getAccountLevel() & iP->second) + if (level & iP->second) { return PMR_ALLOWED; } else { @@ -180,3 +177,22 @@ std::list PermissionManager::getPermissionList(const Character* cha return result; } + +std::list PermissionManager::getClassList(const Character* character) +{ + std::list result; + std::map::iterator i; + + unsigned char mask = character->getAccountLevel(); + + for (i = aliases.begin(); i != aliases.end(); i++) + { + if (i->second & mask) + { + result.push_back(i->first); + } + } + + return result; +} + diff --git a/src/common/permissionmanager.hpp b/src/common/permissionmanager.hpp index 51ffb5bb..90a147a8 100644 --- a/src/common/permissionmanager.hpp +++ b/src/common/permissionmanager.hpp @@ -49,6 +49,7 @@ namespace PermissionManager * Returns if the characters account has the given permission */ Result checkPermission(const Character* character, std::string permission); + Result checkPermission(unsigned char level, std::string permission); /** * Gets the permission class bitmask of a class alias @@ -60,6 +61,11 @@ namespace PermissionManager */ std::list getPermissionList(const Character* character); + /** + * Gets a list of all permissions classes the character is having + */ + std::list getClassList(const Character* character); + } #endif diff --git a/src/defines.h b/src/defines.h index 6496ee26..ad75a121 100644 --- a/src/defines.h +++ b/src/defines.h @@ -21,24 +21,6 @@ #ifndef DEFINES_H #define DEFINES_H -/** - * Enumeration type for account levels. - * A normal player would have permissions of 1 - * A tester would have permissions of 3 (AL_PLAYER | AL_TESTER) - * A dev would have permissions of 7 (AL_PLAYER | AL_TESTER | AL_DEV) - * A gm would have permissions of 11 (AL_PLAYER | AL_TESTER | AL_GM) - * A admin would have permissions of 255 (*) - */ -enum -{ - AL_BANNED = 0, /**< This user is currently banned. */ - AL_PLAYER = 1, /**< User has regular rights. */ - AL_TESTER = 2, /**< User can perform testing tasks. */ - AL_DEV = 4, /**< User is a developer and can perform dev tasks */ - AL_GM = 8, /**< User is a moderator and can perform mod tasks */ - AL_ADMIN = 128 /**< User can perform administrator tasks. */ -}; - /** * Guild member permissions * Members with NONE cannot invite users or set permissions diff --git a/src/game-server/commandhandler.cpp b/src/game-server/commandhandler.cpp index 169e3221..5e582498 100644 --- a/src/game-server/commandhandler.cpp +++ b/src/game-server/commandhandler.cpp @@ -59,7 +59,6 @@ static void handleMoney(Character*, std::string&); static void handleSpawn(Character*, std::string&); static void handleAttribute(Character*, std::string&); static void handleReload(Character*, std::string&); -static void handleSetGroup(Character*, std::string&); static void handleGivePermission(Character*, std::string&); static void handleTakePermission(Character*, std::string&); static void handleAnnounce(Character*, std::string&); @@ -95,8 +94,6 @@ static CmdRef const cmdRef[] = "Changes the character attributes of a character", &handleAttribute}, {"reload", "", "Makes the server reload all configuration files", &handleReload}, - {"setgroup", " ", - "Changes the permission mask of the account the character belongs to", &handleSetGroup}, {"givepermission", " ", "Gives a permission class to the account a character belongs to", &handleGivePermission}, {"takepermission", " ", @@ -651,76 +648,6 @@ static void handleBan(Character *player, std::string &args) accountHandler->sendTransaction(player->getDatabaseID(), TRANS_CMD_BAN, msg); } -static void handleSetGroup(Character *player, std::string &args) -{ - Character *other; - int level = 0; - - // get the arguments - std::string character = getArgument(args); - std::string levelstr = getArgument(args); - - // check all arguments are there - if (character == "" || levelstr == "") - { - say("Invalid number of arguments given.", player); - say("Usage: @setgroup ", player); - return; - } - - // check if its to effect the player - if (character == "#") - { - other = player; - } - else - { - // check for valid player - other = getPlayer(character); - if (!other) - { - say("Invalid character", player); - return; - } - } - - // check which level they should be - // refer to defines.h for level info - if (levelstr == "AL_PLAYER") - { - level = AL_PLAYER; - } - else if (levelstr == "AL_TESTER") - { - level = AL_PLAYER | AL_TESTER; - } - else if (levelstr == "AL_GM") - { - level = AL_PLAYER | AL_TESTER | AL_GM; - } - else if (levelstr == "AL_DEV") - { - level = AL_PLAYER | AL_TESTER | AL_DEV; - } - else if (levelstr == "AL_ADMIN") - { - level = 255; - } - - if (level == 0) - { - say("Invalid group", player); - return; - } - - // change the player's account level - accountHandler->changeAccountLevel(other, level); - - // log transaction - std::string msg = "User changed account level of " + other->getName() + " to " + levelstr; - accountHandler->sendTransaction(player->getDatabaseID(), TRANS_CMD_SETGROUP, msg); -} - static void handleGivePermission(Character *player, std::string &args) { Character *other; @@ -756,6 +683,12 @@ static void handleGivePermission(Character *player, std::string &args) unsigned char permission = PermissionManager::getMaskFromAlias(strPermission); + if (permission == 0x00) + { + say ("Unknown permission class: "+strPermission, player); + return; + } + if (permission & other->getAccountLevel()) { say(player->getName()+" already has the permission "+strPermission, player); @@ -809,7 +742,7 @@ static void handleTakePermission(Character *player, std::string &args) if (permission == 0x00) { - say("Unknown permission class", player); + say("Unknown permission class: "+strPermission, player); return; } @@ -935,17 +868,22 @@ static void handleWhere(Character *player, std::string &args) static void handleRights(Character *player, std::string &args) { + std::listclasses; + classes = PermissionManager::getClassList(player); + std::stringstream str; str << "Your rights level is: " - << player->getAccountLevel() - << " (AL_PLAYER"; - if (player->getAccountLevel() & AL_TESTER) - str << ", AL_TESTER"; - if (player->getAccountLevel() & AL_GM) - str << ", AL_GM"; - if (player->getAccountLevel() & AL_ADMIN) - str << ", AL_ADMIN"; + << (unsigned int)player->getAccountLevel() + << " ( "; + + for (std::list::iterator i = classes.begin(); + i != classes.end(); + i++) + { + str << (*i) << " "; + } str << ")"; + say(str.str(), player); } -- cgit v1.2.3-70-g09d2