diff options
Diffstat (limited to 'src/Server/RequestHandlers/UserRequestHandlerGroup.cpp')
-rw-r--r-- | src/Server/RequestHandlers/UserRequestHandlerGroup.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/Server/RequestHandlers/UserRequestHandlerGroup.cpp b/src/Server/RequestHandlers/UserRequestHandlerGroup.cpp new file mode 100644 index 0000000..1b6dd3d --- /dev/null +++ b/src/Server/RequestHandlers/UserRequestHandlerGroup.cpp @@ -0,0 +1,156 @@ +/* + * UserRequestHandlerGroup.cpp + * + * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "UserRequestHandlerGroup.h" + +#include <Common/Logger.h> +#include "../UserManager.h" + +namespace Mad { +namespace Server { +namespace RequestHandlers { + +void UserRequestHandlerGroup::RequestHandler::handlePacket(boost::shared_ptr<const Common::XmlPacket> packet) { + if(packet->getType() != type) { + Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); + + Common::XmlPacket ret; + ret.setType("Error"); + ret.add("ErrorCode", Net::Exception::UNEXPECTED_PACKET); + + sendPacket(ret); + + signalFinished(); + return; + } + + // TODO Require authentication + + Common::XmlPacket ret; + + try { + handler(packet, &ret); + } + catch(Net::Exception e) { + ret.setType("Error"); + ret.add("ErrorCode", e.getErrorCode()); + ret.add("SubCode", e.getSubCode()); + ret.add("SubSubCode", e.getSubSubCode()); + ret.add("Where", e.getWhere()); + } + + sendPacket(ret); + signalFinished(); +} + +void UserRequestHandlerGroup::handleUserListRequest(boost::shared_ptr<const Common::XmlPacket> packet _UNUSED_PARAMETER_, Common::XmlPacket *ret) { + boost::shared_ptr<std::map<unsigned long, Common::UserInfo> > info = UserManager::get()->getUserList(); + + ret->setType("OK"); + ret->addList("users"); + + for(std::map<unsigned long, Common::UserInfo>::iterator user = info->begin(); user != info->end(); ++user) { + (*ret)["users"].addEntry(); + Common::XmlPacket::Entry &entry = (*ret)["users"].back(); + + entry.add("uid", user->second.getUid()); + entry.add("gid", user->second.getGid()); + entry.add("username", user->second.getUsername()); + entry.add("fullName", user->second.getFullName()); + } +} + +void UserRequestHandlerGroup::handleUserInfoRequest(boost::shared_ptr<const Common::XmlPacket> packet, Common::XmlPacket *ret) { + boost::shared_ptr<Common::UserInfo> info = UserManager::get()->getUserInfo((*packet)["uid"]); + + ret->setType("OK"); + + ret->add("uid", info->getUid()); + ret->add("gid", info->getGid()); + ret->add("username", info->getUsername()); + ret->add("fullName", info->getFullName()); +} + +void UserRequestHandlerGroup::handleUserGroupListRequest(boost::shared_ptr<const Common::XmlPacket> packet, Common::XmlPacket *ret) { + boost::shared_ptr<std::set<unsigned long> > groups = UserManager::get()->getUserGroupList((unsigned long)(*packet)["uid"]); + + ret->setType("OK"); + ret->addList("groups"); + + for(std::set<unsigned long>::iterator group = groups->begin(); group != groups->end(); ++group) { + (*ret)["groups"].addEntry(); + Common::XmlPacket::Entry &entry = (*ret)["groups"].back(); + + entry.add("gid", *group); + } +} + +void UserRequestHandlerGroup::handleGroupListRequest(boost::shared_ptr<const Common::XmlPacket> packet _UNUSED_PARAMETER_, Common::XmlPacket *ret) { + boost::shared_ptr<std::map<unsigned long, Common::GroupInfo> > info = UserManager::get()->getGroupList(); + + ret->setType("OK"); + ret->addList("groups"); + + for(std::map<unsigned long, Common::GroupInfo>::iterator group = info->begin(); group != info->end(); ++group) { + (*ret)["groups"].addEntry(); + Common::XmlPacket::Entry &entry = (*ret)["groups"].back(); + + entry.add("gid", group->second.getGid()); + entry.add("name", group->second.getName()); + } +} + +void UserRequestHandlerGroup::handleGroupUserListRequest(boost::shared_ptr<const Common::XmlPacket> packet, Common::XmlPacket *ret) { + boost::shared_ptr<std::set<unsigned long> > users = UserManager::get()->getGroupUserList((unsigned long)(*packet)["gid"]); + + ret->setType("OK"); + ret->addList("users"); + + for(std::set<unsigned long>::iterator user = users->begin(); user != users->end(); ++user) { + (*ret)["users"].addEntry(); + Common::XmlPacket::Entry &entry = (*ret)["users"].back(); + + entry.add("uid", *user); + } +} + +UserRequestHandlerGroup::UserRequestHandlerGroup() { + registerHandler("ListUsers", &UserRequestHandlerGroup::handleUserListRequest); + registerHandler("GetUserInfo", &UserRequestHandlerGroup::handleUserInfoRequest); + registerHandler("ListUserGroups", &UserRequestHandlerGroup::handleUserGroupListRequest); + registerHandler("ListGroups", &UserRequestHandlerGroup::handleGroupListRequest); + registerHandler("ListGroupUsers", &UserRequestHandlerGroup::handleGroupUserListRequest); +} + +const std::set<std::string>& UserRequestHandlerGroup::getPacketTypes() { + return types; +} + +boost::shared_ptr<Common::RequestHandler> UserRequestHandlerGroup::createRequestHandler(const std::string &type) { + std::map<std::string, boost::function2<void, boost::shared_ptr<const Common::XmlPacket>, Common::XmlPacket*> >::iterator handler = handlers.find(type); + + if(handler == handlers.end()) + return boost::shared_ptr<Common::RequestHandler>(); + else + return boost::shared_ptr<RequestHandler>(new RequestHandler(type, handler->second)); +} + +} +} +} |