summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Sehmisch <mana@crushnet.org>2010-01-17 19:13:23 +0100
committerPhilipp Sehmisch <mana@crushnet.org>2010-01-17 20:09:39 +0100
commitc57df2bd7ba96719438bbc34e1362f0f91622921 (patch)
tree368a66a5a9b51df649724341113b896728f4f891
parenta9a87aeafc34141fc64fb97cda7eea36e1ff6ccf (diff)
downloadmanaserv-c57df2bd7ba96719438bbc34e1362f0f91622921.tar.gz
manaserv-c57df2bd7ba96719438bbc34e1362f0f91622921.tar.xz
manaserv-c57df2bd7ba96719438bbc34e1362f0f91622921.zip
Removed last traces of hardcoded access levels form game-server, begun with using the permission manager in the account-server.
-rw-r--r--src/account-server/accounthandler.cpp5
-rw-r--r--src/account-server/storage.cpp3
-rw-r--r--src/chat-server/chathandler.cpp3
-rw-r--r--src/common/permissionmanager.cpp34
-rw-r--r--src/common/permissionmanager.hpp6
-rw-r--r--src/defines.h18
-rw-r--r--src/game-server/commandhandler.cpp102
7 files changed, 59 insertions, 112 deletions
diff --git a/src/account-server/accounthandler.cpp b/src/account-server/accounthandler.cpp
index 83a4a8a..dbd74b0 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 c547977..7bc020c 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 0069eb9..27a9a00 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 d7c1a7a..d268a9d 100644
--- a/src/common/permissionmanager.cpp
+++ b/src/common/permissionmanager.cpp
@@ -123,19 +123,16 @@ void PermissionManager::reload()
}
}
}
-
- LOG_INFO("Permission List:");
- for (std::map<std::string, unsigned char>::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<std::string, unsigned char>::iterator iP = permissions.find(permission);
if (iP == permissions.end())
@@ -143,7 +140,7 @@ PermissionManager::Result PermissionManager::checkPermission(const Character* ch
LOG_WARN("PermissionManager: Check for unknown permission \""<<permission<<"\" requested.");
return PMR_UNKNOWN;
}
- if (character->getAccountLevel() & iP->second)
+ if (level & iP->second)
{
return PMR_ALLOWED;
} else {
@@ -180,3 +177,22 @@ std::list<std::string> PermissionManager::getPermissionList(const Character* cha
return result;
}
+
+std::list<std::string> PermissionManager::getClassList(const Character* character)
+{
+ std::list<std::string> result;
+ std::map<std::string, unsigned char>::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 51ffb5b..90a147a 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<std::string> getPermissionList(const Character* character);
+ /**
+ * Gets a list of all permissions classes the character is having
+ */
+ std::list<std::string> getClassList(const Character* character);
+
}
#endif
diff --git a/src/defines.h b/src/defines.h
index 6496ee2..ad75a12 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -22,24 +22,6 @@
#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
* Members with TOPIC_CHANGE can change the guild channel topic
diff --git a/src/game-server/commandhandler.cpp b/src/game-server/commandhandler.cpp
index 169e322..5e58249 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", "<character> <AL level>",
- "Changes the permission mask of the account the character belongs to", &handleSetGroup},
{"givepermission", "<character> <permission class>",
"Gives a permission class to the account a character belongs to", &handleGivePermission},
{"takepermission", "<character> <permission class>",
@@ -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 <character> <level>", 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::list<std::string>classes;
+ 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<std::string>::iterator i = classes.begin();
+ i != classes.end();
+ i++)
+ {
+ str << (*i) << " ";
+ }
str << ")";
+
say(str.str(), player);
}