From dff7c00a0c2c3fcb64efd611d70398d711ad861b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 24 Jun 2009 00:04:28 +0200 Subject: NetworkUserBackend implementiert --- src/Client/CommandParser.cpp | 3 +- src/Client/UserCommands.cpp | 194 ++++++++++---------- src/Client/UserCommands.h | 4 +- src/Common/Backends/CMakeLists.txt | 6 + src/Common/Backends/NetworkUserBackend.cpp | 203 +++++++++++++++++++++ src/Common/Backends/NetworkUserBackend.h | 91 +++++++++ src/Common/CMakeLists.txt | 3 +- src/Common/Requests/CMakeLists.txt | 5 - src/Common/Requests/GroupListRequest.h | 38 ---- src/Common/Requests/GroupUserListRequest.cpp | 36 ---- src/Common/Requests/GroupUserListRequest.h | 44 ----- src/Common/Requests/UserGroupListRequest.cpp | 36 ---- src/Common/Requests/UserGroupListRequest.h | 44 ----- src/Common/Requests/UserInfoRequest.cpp | 36 ---- src/Common/Requests/UserInfoRequest.h | 44 ----- src/Common/Requests/UserListRequest.h | 38 ---- src/Common/UserBackend.h | 16 +- src/Common/UserManager.cpp | 20 +- src/Common/UserManager.h | 18 +- .../RequestHandlers/UserRequestHandlerGroup.cpp | 42 ++++- .../RequestHandlers/UserRequestHandlerGroup.h | 2 + src/madc.cpp | 7 + src/modules/UserBackendMysql/UserBackendMysql.cpp | 36 ++-- src/modules/UserBackendMysql/UserBackendMysql.h | 18 +- 24 files changed, 498 insertions(+), 486 deletions(-) create mode 100644 src/Common/Backends/CMakeLists.txt create mode 100644 src/Common/Backends/NetworkUserBackend.cpp create mode 100644 src/Common/Backends/NetworkUserBackend.h delete mode 100644 src/Common/Requests/GroupListRequest.h delete mode 100644 src/Common/Requests/GroupUserListRequest.cpp delete mode 100644 src/Common/Requests/GroupUserListRequest.h delete mode 100644 src/Common/Requests/UserGroupListRequest.cpp delete mode 100644 src/Common/Requests/UserGroupListRequest.h delete mode 100644 src/Common/Requests/UserInfoRequest.cpp delete mode 100644 src/Common/Requests/UserInfoRequest.h delete mode 100644 src/Common/Requests/UserListRequest.h diff --git a/src/Client/CommandParser.cpp b/src/Client/CommandParser.cpp index f231082..842be7f 100644 --- a/src/Client/CommandParser.cpp +++ b/src/Client/CommandParser.cpp @@ -43,10 +43,11 @@ const CommandParser::Command CommandParser::commands[] = { {{"reboot", 0}, "reboot *|host...", "Reboot host", "Reboot hosts. * will reboot all hosts.", &SystemCommands::rebootCommand}, {{"shutdown", "halt", 0}, "shutdown *|host...", "Shut hosts down", "Shut hosts down. * will shut down all hosts.", &SystemCommands::shutdownCommand}, {{"status", "st", 0}, "status [host]", "Display status information", "Display host status information. If no host is given, display server status information.", &SystemCommands::statusCommand}, - {{"user_info", "user", 0}, "user_info uid", "Search for a user id", "Search for a user id.", &UserCommands::userInfoCommand}, {{"list_users", "users", 0}, "list_users", "Show the user account database", "Show the user account database.", &UserCommands::listUsersCommand}, + {{"user_info", "user", 0}, "user_info uid|name", "Search for a user id", "Search for a user.", &UserCommands::userInfoCommand}, {{"list_user_groups", "user_groups", 0}, "list_user_groups uid", "List user's groups", "List the groups that the user is member of.", &UserCommands::listUserGroupsCommand}, {{"list_groups", "groups", 0}, "list_groups", "Show the user group database", "Show the user group database.", &UserCommands::listGroupsCommand}, + {{"group_info", "group", 0}, "group_info gid|name", "Search for a group id", "Search for a group.", &UserCommands::groupInfoCommand}, {{"list_group_users", "group_users", 0}, "list_group_users gid", "List group's users", "List the users that are members of the group.", &UserCommands::listGroupUsersCommand}, {{"exit", "quit", 0}, "exit", "Close the connection and quit the client", "Close the connection and quit the client.", &CommandParser::exitCommand}, {{0}, 0, 0, 0, 0} diff --git a/src/Client/UserCommands.cpp b/src/Client/UserCommands.cpp index de5b7ea..fec2a33 100644 --- a/src/Client/UserCommands.cpp +++ b/src/Client/UserCommands.cpp @@ -23,11 +23,7 @@ #include -#include -#include -#include -#include -#include +#include #include @@ -35,6 +31,29 @@ namespace Mad { namespace Client { +void UserCommands::listUsersCommand(CommandParser *commandParser, const std::vector &args _UNUSED_PARAMETER_) { + try { + boost::shared_ptr > users = commandParser->application->getUserManager()->getUserList(); + + if(users->empty()) { + std::cout << "User list is empty." << std::endl; + } + else { + std::cout << "Found " << users->size() << " user" << (users->size()==1 ? "" : "s") << ":" << std::endl; + + for(std::map::const_iterator user = users->begin(); user != users->end(); ++user) { + std::cout << " " << user->second.getUid() << ", " << user->second.getGid() << ", " + << user->second.getUsername() << ", " << user->second.getFullName() << std::endl; + } + } + + std::cout << std::endl; + } + catch(Core::Exception e) { + std::cerr << "An error occurred during your request: " << e.strerror() << "." << std::endl; + } +} + void UserCommands::userInfoCommand(CommandParser *commandParser, const std::vector &args) { if(args.size() == 1) { std::cerr << args[0] << ": No user id given." << std::endl; @@ -47,58 +66,23 @@ void UserCommands::userInfoCommand(CommandParser *commandParser, const std::vect return; } - char *endptr; - unsigned long uid = std::strtoul(args[1].c_str(), &endptr, 10); - if(args[1].empty() || *endptr != '\0') { - std::cerr << args[0] << ": Unable to parse user id." << std::endl; - commandParser->printUsage("user_info"); - return; - } - - boost::shared_ptr request(new Common::Requests::UserInfoRequest(commandParser->application, uid)); - commandParser->application->getRequestManager()->sendRequest(commandParser->connection, request); - request->wait(); - - std::pair, Core::Exception> result = request->getResult(); - - if(!result.first || result.second) { - std::cerr << "An error occurred during your request: " << result.second.strerror() << "." << std::endl; - } - else { - const Common::XmlPacket &packet = *result.first; - - std::cout << " " << packet.get("uid") << ", " << packet.get("gid") << ", " - << packet.get("username") << ", " << packet.get("fullName") << std::endl << std::endl; - } -} - -void UserCommands::listUsersCommand(CommandParser *commandParser, const std::vector &args _UNUSED_PARAMETER_) { - boost::shared_ptr request(new Common::Requests::UserListRequest(commandParser->application)); - - commandParser->application->getRequestManager()->sendRequest(commandParser->connection, request); - request->wait(); - - std::pair, Core::Exception> result = request->getResult(); - - if(!result.first || result.second) { - std::cerr << "An error occurred during your request: " << result.second.strerror() << "." << std::endl; - } - else { - const Common::XmlPacket::List *users = result.first->getList("users"); - - if(!users || users->isEmpty()) { - std::cout << "User list is empty." << std::endl; - } - else { - std::cout << "Found " << users->getSize() << " user" << (users->getSize()==1 ? "" : "s") << ":" << std::endl; + try { + char *endptr; + unsigned long uid = std::strtoul(args[1].c_str(), &endptr, 10); + boost::shared_ptr userInfo; - for(Common::XmlPacket::List::const_iterator user = users->begin(); user != users->end(); ++user) - std::cout << " " << user->get("uid") << ", " << user->get("gid") - << ", " << user->get("username") << ", " << user->get("fullName") << std::endl; + if(args[1].empty() || *endptr != '\0') { + userInfo = commandParser->application->getUserManager()->getUserInfoByName(args[1]); } + else + userInfo = commandParser->application->getUserManager()->getUserInfo(uid); - std::cout << std::endl; + std::cout << " " << userInfo->getUid() << ", " << userInfo->getGid() << ", " + << userInfo->getUsername() << ", " << userInfo->getFullName() << std::endl << std::endl; + } + catch(Core::Exception e) { + std::cerr << "An error occurred during your request: " << e.strerror() << "." << std::endl; } } @@ -122,59 +106,77 @@ void UserCommands::listUserGroupsCommand(CommandParser *commandParser, const std return; } - boost::shared_ptr request(new Common::Requests::UserGroupListRequest(commandParser->application, uid)); - commandParser->application->getRequestManager()->sendRequest(commandParser->connection, request); - request->wait(); + try { + boost::shared_ptr > groups = commandParser->application->getUserManager()->getUserGroupList(uid); - std::pair, Core::Exception> result = request->getResult(); - - if(!result.first || result.second) { - std::cerr << "An error occurred during your request: " << result.second.strerror() << "." << std::endl; - } - else { - const Common::XmlPacket::List *groups = result.first->getList("groups"); - - if(!groups || groups->isEmpty()) { + if(groups->empty()) { std::cout << "The user isn't member of any group." << std::endl; } else { - std::cout << "User is member of " << groups->getSize() << " group" << (groups->getSize()==1 ? "" : "s") << ":" << std::endl; + std::cout << "User is member of " << groups->size() << " group" << (groups->size()==1 ? "" : "s") << ":" << std::endl; - for(Common::XmlPacket::List::const_iterator group = groups->begin(); group != groups->end(); ++group) - std::cout << " " << group->get("gid") << std::endl; + for(std::set::const_iterator group = groups->begin(); group != groups->end(); ++group) + std::cout << " " << *group << std::endl; } std::cout << std::endl; } + catch(Core::Exception e) { + std::cerr << "An error occurred during your request: " << e.strerror() << "." << std::endl; + } } void UserCommands::listGroupsCommand(CommandParser *commandParser, const std::vector &args _UNUSED_PARAMETER_) { - boost::shared_ptr request(new Common::Requests::GroupListRequest(commandParser->application)); + try { + boost::shared_ptr > groups = commandParser->application->getUserManager()->getGroupList(); - commandParser->application->getRequestManager()->sendRequest(commandParser->connection, request); - request->wait(); + if(groups->empty()) { + std::cout << "Group list is empty." << std::endl; + } + else { + std::cout << "Found " << groups->size() << " group" << (groups->size()==1 ? "" : "s") << ":" << std::endl; - std::pair, Core::Exception> result = request->getResult(); + for(std::map::const_iterator group = groups->begin(); group != groups->end(); ++group) { + std::cout << " " << group->second.getGid() << ", " << group->second.getName() << std::endl; + } + } - if(!result.first || result.second) { - std::cerr << "An error occurred during your request: " << result.second.strerror() << "." << std::endl; + std::cout << std::endl; + } + catch(Core::Exception e) { + std::cerr << "An error occurred during your request: " << e.strerror() << "." << std::endl; } - else { - const Common::XmlPacket::List *groups = result.first->getList("groups"); +} - if(!groups || groups->isEmpty()) { - std::cout << "Group list is empty." << std::endl; - } - else { - std::cout << "Found " << groups->getSize() << " group" << (groups->getSize()==1 ? "" : "s") << ":" << std::endl; +void UserCommands::groupInfoCommand(CommandParser *commandParser, const std::vector &args) { + if(args.size() == 1) { + std::cerr << args[0] << ": No group id given." << std::endl; + commandParser->printUsage("group_info"); + return; + } + if(args.size() > 2) { + std::cerr << args[0] << ": Too many arguments." << std::endl; + commandParser->printUsage("group_info"); + return; + } + + try { + char *endptr; + unsigned long gid = std::strtoul(args[1].c_str(), &endptr, 10); + boost::shared_ptr groupInfo; - for(Common::XmlPacket::List::const_iterator group = groups->begin(); group != groups->end(); ++group) - std::cout << " " << group->get("gid") << ", " << group->get("name") << std::endl; + if(args[1].empty() || *endptr != '\0') { + groupInfo = commandParser->application->getUserManager()->getGroupInfoByName(args[1]); } + else + groupInfo = commandParser->application->getUserManager()->getGroupInfo(gid); - std::cout << std::endl; + std::cout << " " << groupInfo->getGid() << ", " << groupInfo->getName() << std::endl << std::endl; + } + catch(Core::Exception e) { + std::cerr << "An error occurred during your request: " << e.strerror() << "." << std::endl; } } @@ -198,31 +200,25 @@ void UserCommands::listGroupUsersCommand(CommandParser *commandParser, const std return; } - boost::shared_ptr request(new Common::Requests::GroupUserListRequest(commandParser->application, gid)); - commandParser->application->getRequestManager()->sendRequest(commandParser->connection, request); - request->wait(); + try { + boost::shared_ptr > users = commandParser->application->getUserManager()->getGroupUserList(gid); - std::pair, Core::Exception> result = request->getResult(); - - if(!result.first || result.second) { - std::cerr << "An error occurred during your request: " << result.second.strerror() << "." << std::endl; - } - else { - const Common::XmlPacket::List *users = result.first->getList("users"); - - if(!users || users->isEmpty()) { + if(users->empty()) { std::cout << "The group doesn't have any members." << std::endl; } else { - std::cout << "The group has " << users->getSize() << " member" << (users->getSize()==1 ? "" : "s") << ":" << std::endl; + std::cout << "The group has " << users->size() << " member" << (users->size()==1 ? "" : "s") << ":" << std::endl; - for(Common::XmlPacket::List::const_iterator user = users->begin(); user != users->end(); ++user) - std::cout << " " << user->get("uid") << std::endl; + for(std::set::const_iterator user = users->begin(); user != users->end(); ++user) + std::cout << " " << *user << std::endl; } std::cout << std::endl; } + catch(Core::Exception e) { + std::cerr << "An error occurred during your request: " << e.strerror() << "." << std::endl; + } } } diff --git a/src/Client/UserCommands.h b/src/Client/UserCommands.h index f3dd31c..0f56a40 100644 --- a/src/Client/UserCommands.h +++ b/src/Client/UserCommands.h @@ -33,10 +33,12 @@ class UserCommands { UserCommands(); public: - static void userInfoCommand(CommandParser *commandParser, const std::vector &args); static void listUsersCommand(CommandParser *commandParser, const std::vector &args); + static void userInfoCommand(CommandParser *commandParser, const std::vector &args); static void listUserGroupsCommand(CommandParser *commandParser, const std::vector &args); + static void listGroupsCommand(CommandParser *commandParser, const std::vector &args); + static void groupInfoCommand(CommandParser *commandParser, const std::vector &args); static void listGroupUsersCommand(CommandParser *commandParser, const std::vector &args); }; diff --git a/src/Common/Backends/CMakeLists.txt b/src/Common/Backends/CMakeLists.txt new file mode 100644 index 0000000..4d9d30e --- /dev/null +++ b/src/Common/Backends/CMakeLists.txt @@ -0,0 +1,6 @@ +include_directories(${INCLUDES}) + +add_library(Backends STATIC + NetworkUserBackend.cpp NetworkUserBackend.h +) +target_link_libraries(Backends Common) diff --git a/src/Common/Backends/NetworkUserBackend.cpp b/src/Common/Backends/NetworkUserBackend.cpp new file mode 100644 index 0000000..81fc94a --- /dev/null +++ b/src/Common/Backends/NetworkUserBackend.cpp @@ -0,0 +1,203 @@ +/* + * NetworkUserBackend.cpp + * + * Copyright (C) 2009 Matthias Schiffer + * + * 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 . + */ + +#include "NetworkUserBackend.h" +#include "../RequestManager.h" + +namespace Mad { +namespace Common { +namespace Backends { + +void NetworkUserBackend::IdUserRequest::sendRequest() { + Common::XmlPacket packet; + packet.setType(type); + packet.set(idType, id); + + sendPacket(packet); +} + +void NetworkUserBackend::NameUserRequest::sendRequest() { + Common::XmlPacket packet; + packet.setType(type); + packet.set("name", name); + + sendPacket(packet); +} + +boost::shared_ptr > NetworkUserBackend::getUserList() throw(Core::Exception) { + boost::shared_ptr request(new SimpleUserRequest(application, "ListUsers")); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr > userList(new std::map); + + const XmlPacket::List *users = result.first->getList("users"); + if(users) { + for(XmlPacket::List::const_iterator user = users->begin(); user != users->end(); ++user) { + UserInfo userInfo(user->get("uid"), user->get("username")); + userInfo.setGid(user->get("gid")); + userInfo.setFullName(user->get("fullName")); + + userList->insert(std::make_pair(userInfo.getUid(), userInfo)); + } + } + + return userList; +} + +boost::shared_ptr NetworkUserBackend::getUserInfo(unsigned long uid) throw(Core::Exception) { + boost::shared_ptr request(new IdUserRequest(application, "GetUserInfo", "uid", uid)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr userInfo(new UserInfo(result.first->get("uid"), result.first->get("username"))); + userInfo->setGid(result.first->get("gid")); + userInfo->setFullName(result.first->get("fullName")); + + return userInfo; +} + +boost::shared_ptr NetworkUserBackend::getUserInfoByName(const std::string &name) throw(Core::Exception) { + boost::shared_ptr request(new NameUserRequest(application, "GetUserInfo", name)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr userInfo(new UserInfo(result.first->get("uid"), result.first->get("username"))); + userInfo->setGid(result.first->get("gid")); + userInfo->setFullName(result.first->get("fullName")); + + return userInfo; +} + +boost::shared_ptr > NetworkUserBackend::getUserGroupList(unsigned long uid) throw(Core::Exception) { + boost::shared_ptr request(new IdUserRequest(application, "ListUserGroups", "uid", uid)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr > groupList(new std::set); + + const XmlPacket::List *groups = result.first->getList("groups"); + if(groups) { + for(XmlPacket::List::const_iterator group = groups->begin(); group != groups->end(); ++group) + groupList->insert(group->get("gid")); + } + + return groupList; +} + +boost::shared_ptr > NetworkUserBackend::getGroupList() throw(Core::Exception) { + boost::shared_ptr request(new SimpleUserRequest(application, "ListGroups")); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr > groupList(new std::map); + + const XmlPacket::List *groups = result.first->getList("groups"); + if(groups) { + for(XmlPacket::List::const_iterator group = groups->begin(); group != groups->end(); ++group) { + GroupInfo groupInfo(group->get("gid"), group->get("name")); + groupList->insert(std::make_pair(groupInfo.getGid(), groupInfo)); + } + } + + return groupList; +} + +boost::shared_ptr NetworkUserBackend::getGroupInfo(unsigned long gid) throw(Core::Exception) { + boost::shared_ptr request(new IdUserRequest(application, "GetGroupInfo", "gid", gid)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr groupInfo(new GroupInfo(result.first->get("gid"), result.first->get("name"))); + + return groupInfo; +} + +boost::shared_ptr NetworkUserBackend::getGroupInfoByName(const std::string &name) throw(Core::Exception) { + boost::shared_ptr request(new NameUserRequest(application, "GetGroupInfo", name)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr groupInfo(new GroupInfo(result.first->get("gid"), result.first->get("name"))); + + return groupInfo; +} + +boost::shared_ptr > NetworkUserBackend::getGroupUserList(unsigned long gid) throw(Core::Exception) { + boost::shared_ptr request(new IdUserRequest(application, "ListGroupUsers", "gid", gid)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; + + boost::shared_ptr > userList(new std::set); + + const XmlPacket::List *users = result.first->getList("users"); + if(users) { + for(XmlPacket::List::const_iterator user = users->begin(); user != users->end(); ++user) { + userList->insert(user->get("uid")); + } + } + + return userList; +} + + +/*void NetworkUserBackend::setPassword(unsigned long uid, const std::string &password) throw(Core::Exception) { + +}*/ + + +/*void NetworkUserBackend::addUser(const UserInfo &userInfo) throw(Core::Exception) { + +}*/ + +} +} +} diff --git a/src/Common/Backends/NetworkUserBackend.h b/src/Common/Backends/NetworkUserBackend.h new file mode 100644 index 0000000..c569ab6 --- /dev/null +++ b/src/Common/Backends/NetworkUserBackend.h @@ -0,0 +1,91 @@ +/* + * NetworkUserBackend.h + * + * Copyright (C) 2009 Matthias Schiffer + * + * 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 . + */ + +#ifndef MAD_COMMON_BACKENDS_NETWORKUSERBACKEND_H_ +#define MAD_COMMON_BACKENDS_NETWORKUSERBACKEND_H_ + +#include "../UserBackend.h" +#include "../Requests/SimpleRequest.h" + +namespace Mad { +namespace Common { +namespace Backends { + +class NetworkUserBackend : public UserBackend { + private: + class SimpleUserRequest : public Requests::SimpleRequest { + public: + SimpleUserRequest(Application *application, const std::string &type) : SimpleRequest(application, type) {} + }; + + class IdUserRequest : public Request { + private: + std::string type; + std::string idType; + unsigned long id; + + + protected: + virtual void sendRequest(); + + public: + IdUserRequest(Application *application, const std::string &type0, const std::string &idType0, unsigned long id0) + : Request(application), type(type0), idType(idType0), id(id0) {} + }; + + class NameUserRequest : public Request { + private: + std::string type; + std::string name; + + + protected: + virtual void sendRequest(); + + public: + NameUserRequest(Application *application, const std::string &type0, const std::string &name0) + : Request(application), type(type0), name(name0) {} + }; + + Application *application; + Connection *connection; + + protected: + virtual boost::shared_ptr > getUserList() throw(Core::Exception); + virtual boost::shared_ptr getUserInfo(unsigned long uid) throw(Core::Exception); + virtual boost::shared_ptr getUserInfoByName(const std::string &name) throw(Core::Exception); + virtual boost::shared_ptr > getUserGroupList(unsigned long uid) throw(Core::Exception); + + virtual boost::shared_ptr > getGroupList() throw(Core::Exception); + virtual boost::shared_ptr getGroupInfo(unsigned long gid) throw(Core::Exception); + virtual boost::shared_ptr getGroupInfoByName(const std::string &name) throw(Core::Exception); + virtual boost::shared_ptr > getGroupUserList(unsigned long gid) throw(Core::Exception); + + //virtual void setPassword(unsigned long uid, const std::string &password) throw(Core::Exception); + //virtual void addUser(const UserInfo &userInfo) throw(Core::Exception); + + public: + NetworkUserBackend(Application *application0, Connection *connection0) : application(application0), connection(connection0) {} +}; + +} +} +} + +#endif /* MAD_COMMON_BACKENDS_NETWORKUSERBACKEND_H_ */ diff --git a/src/Common/CMakeLists.txt b/src/Common/CMakeLists.txt index 3ec77c4..7201ed5 100644 --- a/src/Common/CMakeLists.txt +++ b/src/Common/CMakeLists.txt @@ -1,3 +1,4 @@ +add_subdirectory(Backends) add_subdirectory(RequestHandlers) add_subdirectory(Requests) @@ -25,4 +26,4 @@ add_library(Common UserManager.cpp UserManager.h XmlPacket.cpp XmlPacket.h ) -target_link_libraries(Common RequestHandlers Requests Net ${LIBXML2_LIBRARIES} ${LTDL_LIBRARIES}) +target_link_libraries(Common Backends RequestHandlers Requests Net ${LIBXML2_LIBRARIES} ${LTDL_LIBRARIES}) diff --git a/src/Common/Requests/CMakeLists.txt b/src/Common/Requests/CMakeLists.txt index b6ff90c..d80b0fa 100644 --- a/src/Common/Requests/CMakeLists.txt +++ b/src/Common/Requests/CMakeLists.txt @@ -3,13 +3,8 @@ include_directories(${INCLUDES}) add_library(Requests STATIC DisconnectRequest.cpp DisconnectRequest.h FSInfoRequest.h - GroupListRequest.h - GroupUserListRequest.cpp GroupUserListRequest.h IdentifyRequest.cpp IdentifyRequest.h SimpleRequest.cpp SimpleRequest.h StatusRequest.h - UserGroupListRequest.cpp UserGroupListRequest.h - UserInfoRequest.cpp UserInfoRequest.h - UserListRequest.h ) target_link_libraries(Requests ${KRB5_LIBRARIES}) diff --git a/src/Common/Requests/GroupListRequest.h b/src/Common/Requests/GroupListRequest.h deleted file mode 100644 index f8760ca..0000000 --- a/src/Common/Requests/GroupListRequest.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * GroupListRequest.h - * - * Copyright (C) 2009 Matthias Schiffer - * - * 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 . - */ - -#ifndef MAD_COMMON_REQUESTS_GROUPLISTREQUEST_H_ -#define MAD_COMMON_REQUESTS_GROUPLISTREQUEST_H_ - -#include "SimpleRequest.h" - -namespace Mad { -namespace Common { -namespace Requests { - -class GroupListRequest : public SimpleRequest { - public: - GroupListRequest(Application *application) : SimpleRequest(application, "ListGroups") {} -}; - -} -} -} - -#endif /* MAD_COMMON_REQUESTS_GROUPLISTREQUEST_H_ */ diff --git a/src/Common/Requests/GroupUserListRequest.cpp b/src/Common/Requests/GroupUserListRequest.cpp deleted file mode 100644 index 87ab1b5..0000000 --- a/src/Common/Requests/GroupUserListRequest.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * GroupUserListRequest.cpp - * - * Copyright (C) 2008 Matthias Schiffer - * - * 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 . - */ - -#include "GroupUserListRequest.h" - -namespace Mad { -namespace Common { -namespace Requests { - -void GroupUserListRequest::sendRequest() { - Common::XmlPacket packet; - packet.setType("ListGroupUsers"); - packet.set("gid", gid); - - sendPacket(packet); -} - -} -} -} diff --git a/src/Common/Requests/GroupUserListRequest.h b/src/Common/Requests/GroupUserListRequest.h deleted file mode 100644 index f95cd3b..0000000 --- a/src/Common/Requests/GroupUserListRequest.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * GroupUserListRequest.h - * - * Copyright (C) 2009 Matthias Schiffer - * - * 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 . - */ - -#ifndef MAD_COMMON_REQUESTS_GROUPUSERLISTREQUEST_H_ -#define MAD_COMMON_REQUESTS_GROUPUSERLISTREQUEST_H_ - -#include "../Request.h" - -namespace Mad { -namespace Common { -namespace Requests { - -class GroupUserListRequest : public Request { - private: - unsigned long gid; - - protected: - virtual void sendRequest(); - - public: - GroupUserListRequest(Application *application, unsigned long gid0) : Request(application), gid(gid0) {} -}; - -} -} -} - -#endif /* MAD_COMMON_REQUESTS_GROUPUSERLISTREQUEST_H_ */ diff --git a/src/Common/Requests/UserGroupListRequest.cpp b/src/Common/Requests/UserGroupListRequest.cpp deleted file mode 100644 index 0c1a72f..0000000 --- a/src/Common/Requests/UserGroupListRequest.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * UserGroupListRequest.cpp - * - * Copyright (C) 2008 Matthias Schiffer - * - * 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 . - */ - -#include "UserGroupListRequest.h" - -namespace Mad { -namespace Common { -namespace Requests { - -void UserGroupListRequest::sendRequest() { - Common::XmlPacket packet; - packet.setType("ListUserGroups"); - packet.set("uid", uid); - - sendPacket(packet); -} - -} -} -} diff --git a/src/Common/Requests/UserGroupListRequest.h b/src/Common/Requests/UserGroupListRequest.h deleted file mode 100644 index 4cd27b6..0000000 --- a/src/Common/Requests/UserGroupListRequest.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * UserGroupListRequest.h - * - * Copyright (C) 2009 Matthias Schiffer - * - * 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 . - */ - -#ifndef MAD_COMMON_REQUESTS_USERGROUPLISTREQUEST_H_ -#define MAD_COMMON_REQUESTS_USERGROUPLISTREQUEST_H_ - -#include "../Request.h" - -namespace Mad { -namespace Common { -namespace Requests { - -class UserGroupListRequest : public Request { - private: - unsigned long uid; - - protected: - virtual void sendRequest(); - - public: - UserGroupListRequest(Application *application, unsigned long uid0) : Request(application), uid(uid0) {} -}; - -} -} -} - -#endif /* MAD_COMMON_REQUESTS_USERGROUPLISTREQUEST_H_ */ diff --git a/src/Common/Requests/UserInfoRequest.cpp b/src/Common/Requests/UserInfoRequest.cpp deleted file mode 100644 index b4b6940..0000000 --- a/src/Common/Requests/UserInfoRequest.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * UserInfoRequest.cpp - * - * Copyright (C) 2008 Matthias Schiffer - * - * 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 . - */ - -#include "UserInfoRequest.h" - -namespace Mad { -namespace Common { -namespace Requests { - -void UserInfoRequest::sendRequest() { - Common::XmlPacket packet; - packet.setType("GetUserInfo"); - packet.set("uid", uid); - - sendPacket(packet); -} - -} -} -} diff --git a/src/Common/Requests/UserInfoRequest.h b/src/Common/Requests/UserInfoRequest.h deleted file mode 100644 index 7b4b2fc..0000000 --- a/src/Common/Requests/UserInfoRequest.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * UserInfoRequest.h - * - * Copyright (C) 2008 Matthias Schiffer - * - * 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 . - */ - -#ifndef MAD_COMMON_REQUESTS_USERINFOREQUEST_H_ -#define MAD_COMMON_REQUESTS_USERINFOREQUEST_H_ - -#include "../Request.h" - -namespace Mad { -namespace Common { -namespace Requests { - -class UserInfoRequest : public Request { - private: - unsigned long uid; - - protected: - virtual void sendRequest(); - - public: - UserInfoRequest(Application *application, unsigned long uid0) : Request(application), uid(uid0) {} -}; - -} -} -} - -#endif /* MAD_COMMON_REQUESTS_USERINFOREQUEST_H_ */ diff --git a/src/Common/Requests/UserListRequest.h b/src/Common/Requests/UserListRequest.h deleted file mode 100644 index 9196166..0000000 --- a/src/Common/Requests/UserListRequest.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * UserListRequest.h - * - * Copyright (C) 2009 Matthias Schiffer - * - * 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 . - */ - -#ifndef MAD_COMMON_REQUESTS_USERLISTREQUEST_H_ -#define MAD_COMMON_REQUESTS_USERLISTREQUEST_H_ - -#include "SimpleRequest.h" - -namespace Mad { -namespace Common { -namespace Requests { - -class UserListRequest : public SimpleRequest { - public: - UserListRequest(Application *application) : SimpleRequest(application, "ListUsers") {} -}; - -} -} -} - -#endif /* MAD_COMMON_REQUESTS_USERLISTREQUEST_H_ */ diff --git a/src/Common/UserBackend.h b/src/Common/UserBackend.h index 16db16c..8375551 100644 --- a/src/Common/UserBackend.h +++ b/src/Common/UserBackend.h @@ -45,36 +45,36 @@ class UserBackend { UserBackend() {} - virtual boost::shared_ptr > getUserList() throw(Core::Exception) { + virtual boost::shared_ptr > getUserList() throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } - virtual boost::shared_ptr getUserInfo(unsigned long uid _UNUSED_PARAMETER_) throw(Core::Exception) { + virtual boost::shared_ptr getUserInfo(unsigned long uid _UNUSED_PARAMETER_) throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } - virtual boost::shared_ptr getUserInfoByName(const std::string &name _UNUSED_PARAMETER_) throw(Core::Exception) { + virtual boost::shared_ptr getUserInfoByName(const std::string &name _UNUSED_PARAMETER_) throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } - virtual boost::shared_ptr > getUserGroupList(unsigned long uid _UNUSED_PARAMETER_) throw(Core::Exception) { + virtual boost::shared_ptr > getUserGroupList(unsigned long uid _UNUSED_PARAMETER_) throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } - virtual boost::shared_ptr > getGroupList() throw(Core::Exception) { + virtual boost::shared_ptr > getGroupList() throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } - virtual std::string getGroupName(unsigned long gid _UNUSED_PARAMETER_) throw(Core::Exception) { + virtual boost::shared_ptr getGroupInfo(unsigned long gid _UNUSED_PARAMETER_) throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } - virtual unsigned long getGroupId(const std::string &name _UNUSED_PARAMETER_) throw(Core::Exception) { + virtual boost::shared_ptr getGroupInfoByName(const std::string &name _UNUSED_PARAMETER_) throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } - virtual boost::shared_ptr > getGroupUserList(unsigned long gid _UNUSED_PARAMETER_) throw(Core::Exception) { + virtual boost::shared_ptr > getGroupUserList(unsigned long gid _UNUSED_PARAMETER_) throw(Core::Exception) { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } diff --git a/src/Common/UserManager.cpp b/src/Common/UserManager.cpp index 6f5f548..66cbbf4 100644 --- a/src/Common/UserManager.cpp +++ b/src/Common/UserManager.cpp @@ -31,7 +31,7 @@ bool UserManager::Compare::operator() (boost::shared_ptr b1, boost: } -boost::shared_ptr > UserManager::getUserList() throw(Core::Exception) { +boost::shared_ptr > UserManager::getUserList() throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { @@ -47,7 +47,7 @@ boost::shared_ptr > UserManager::getUserList() throw e; } -boost::shared_ptr UserManager::getUserInfo(unsigned long uid) throw(Core::Exception) { +boost::shared_ptr UserManager::getUserInfo(unsigned long uid) throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { @@ -63,7 +63,7 @@ boost::shared_ptr UserManager::getUserInfo(unsigned long uid) throw(Co throw e; } -boost::shared_ptr UserManager::getUserInfoByName(const std::string &name) throw(Core::Exception) { +boost::shared_ptr UserManager::getUserInfoByName(const std::string &name) throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { @@ -79,7 +79,7 @@ boost::shared_ptr UserManager::getUserInfoByName(const std::string &na throw e; } -boost::shared_ptr > UserManager::getUserGroupList(unsigned long uid) throw(Core::Exception) { +boost::shared_ptr > UserManager::getUserGroupList(unsigned long uid) throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { @@ -95,7 +95,7 @@ boost::shared_ptr > UserManager::getUserGroupList(unsign throw e; } -boost::shared_ptr > UserManager::getGroupList() throw(Core::Exception) { +boost::shared_ptr > UserManager::getGroupList() throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { @@ -111,12 +111,12 @@ boost::shared_ptr > UserManager::getGroupList throw e; } -std::string UserManager::getGroupName(unsigned long gid) throw(Core::Exception) { +boost::shared_ptr UserManager::getGroupInfo(unsigned long gid) throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { try { - return (*backend)->getGroupName(gid); + return (*backend)->getGroupInfo(gid); } catch(Core::Exception e2) { if(e.getErrorCode() == Core::Exception::NOT_IMPLEMENTED && e2.getErrorCode() != Core::Exception::NOT_IMPLEMENTED) @@ -127,12 +127,12 @@ std::string UserManager::getGroupName(unsigned long gid) throw(Core::Exception) throw e; } -unsigned long UserManager::getGroupId(const std::string &name) throw(Core::Exception) { +boost::shared_ptr UserManager::getGroupInfoByName(const std::string &name) throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { try { - return (*backend)->getGroupId(name); + return (*backend)->getGroupInfoByName(name); } catch(Core::Exception e2) { if(e.getErrorCode() == Core::Exception::NOT_IMPLEMENTED && e2.getErrorCode() != Core::Exception::NOT_IMPLEMENTED) @@ -143,7 +143,7 @@ unsigned long UserManager::getGroupId(const std::string &name) throw(Core::Excep throw e; } -boost::shared_ptr > UserManager::getGroupUserList(unsigned long gid) throw(Core::Exception) { +boost::shared_ptr > UserManager::getGroupUserList(unsigned long gid) throw(Core::Exception) { Core::Exception e(Core::Exception::NOT_IMPLEMENTED); for(std::set >::iterator backend = backends.begin(); backend != backends.end(); ++backend) { diff --git a/src/Common/UserManager.h b/src/Common/UserManager.h index bdf39c1..215fde8 100644 --- a/src/Common/UserManager.h +++ b/src/Common/UserManager.h @@ -58,15 +58,15 @@ class UserManager : boost::noncopyable { backends.erase(backend); } - boost::shared_ptr > getUserList() throw(Core::Exception); - boost::shared_ptr getUserInfo(unsigned long uid) throw(Core::Exception); - boost::shared_ptr getUserInfoByName(const std::string &name) throw(Core::Exception); - boost::shared_ptr > getUserGroupList(unsigned long uid) throw(Core::Exception); - - boost::shared_ptr > getGroupList() throw(Core::Exception); - std::string getGroupName(unsigned long gid) throw(Core::Exception); - unsigned long getGroupId(const std::string &name) throw(Core::Exception); - boost::shared_ptr > getGroupUserList(unsigned long gid) throw(Core::Exception); + boost::shared_ptr > getUserList() throw(Core::Exception); + boost::shared_ptr getUserInfo(unsigned long uid) throw(Core::Exception); + boost::shared_ptr getUserInfoByName(const std::string &name) throw(Core::Exception); + boost::shared_ptr > getUserGroupList(unsigned long uid) throw(Core::Exception); + + boost::shared_ptr > getGroupList() throw(Core::Exception); + boost::shared_ptr getGroupInfo(unsigned long gid) throw(Core::Exception); + boost::shared_ptr getGroupInfoByName(const std::string &name) throw(Core::Exception); + boost::shared_ptr > getGroupUserList(unsigned long gid) throw(Core::Exception); void setPassword(unsigned long uid, const std::string &password) throw(Core::Exception); diff --git a/src/Server/RequestHandlers/UserRequestHandlerGroup.cpp b/src/Server/RequestHandlers/UserRequestHandlerGroup.cpp index 6378e08..31d2c16 100644 --- a/src/Server/RequestHandlers/UserRequestHandlerGroup.cpp +++ b/src/Server/RequestHandlers/UserRequestHandlerGroup.cpp @@ -27,12 +27,12 @@ namespace RequestHandlers { void UserRequestHandlerGroup::handleUserListRequest(boost::shared_ptr packet _UNUSED_PARAMETER_, Common::XmlPacket *ret, Common::Connection *connection _UNUSED_PARAMETER_) { - boost::shared_ptr > info = application->getUserManager()->getUserList(); + boost::shared_ptr > info = application->getUserManager()->getUserList(); ret->setType("OK"); Common::XmlPacket::List *list = ret->createList("users"); - for(std::map::iterator user = info->begin(); user != info->end(); ++user) { + for(std::map::const_iterator user = info->begin(); user != info->end(); ++user) { Common::XmlPacket::List::iterator entry = list->addEntry(); entry->set("uid", user->second.getUid()); @@ -44,7 +44,13 @@ void UserRequestHandlerGroup::handleUserListRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection _UNUSED_PARAMETER_) { - boost::shared_ptr info = application->getUserManager()->getUserInfo(packet->get("uid")); + boost::shared_ptr info; + + unsigned long uid = packet->get("uid"); + if(uid) + info = application->getUserManager()->getUserInfo(uid); + else + info = application->getUserManager()->getUserInfoByName(packet->get("name")); ret->setType("OK"); @@ -56,12 +62,12 @@ void UserRequestHandlerGroup::handleUserInfoRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection _UNUSED_PARAMETER_) { - boost::shared_ptr > groups = application->getUserManager()->getUserGroupList(packet->get("uid")); + boost::shared_ptr > groups = application->getUserManager()->getUserGroupList(packet->get("uid")); ret->setType("OK"); Common::XmlPacket::List *list = ret->createList("groups"); - for(std::set::iterator group = groups->begin(); group != groups->end(); ++group) { + for(std::set::const_iterator group = groups->begin(); group != groups->end(); ++group) { Common::XmlPacket::List::iterator entry = list->addEntry(); entry->set("gid", *group); @@ -70,12 +76,12 @@ void UserRequestHandlerGroup::handleUserGroupListRequest(boost::shared_ptr packet _UNUSED_PARAMETER_, Common::XmlPacket *ret, Common::Connection *connection _UNUSED_PARAMETER_) { - boost::shared_ptr > info = application->getUserManager()->getGroupList(); + boost::shared_ptr > info = application->getUserManager()->getGroupList(); ret->setType("OK"); Common::XmlPacket::List *list = ret->createList("groups"); - for(std::map::iterator group = info->begin(); group != info->end(); ++group) { + for(std::map::const_iterator group = info->begin(); group != info->end(); ++group) { Common::XmlPacket::List::iterator entry = list->addEntry(); entry->set("gid", group->second.getGid()); @@ -83,14 +89,30 @@ void UserRequestHandlerGroup::handleGroupListRequest(boost::shared_ptr packet, Common::XmlPacket *ret, + Common::Connection *connection _UNUSED_PARAMETER_) { + boost::shared_ptr info; + + unsigned long gid = packet->get("gid"); + if(gid) + info = application->getUserManager()->getGroupInfo(gid); + else + info = application->getUserManager()->getGroupInfoByName(packet->get("name")); + + ret->setType("OK"); + + ret->set("gid", info->getGid()); + ret->set("name", info->getName()); +} + void UserRequestHandlerGroup::handleGroupUserListRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection _UNUSED_PARAMETER_) { - boost::shared_ptr > users = application->getUserManager()->getGroupUserList(packet->get("gid")); + boost::shared_ptr > users = application->getUserManager()->getGroupUserList(packet->get("gid")); ret->setType("OK"); Common::XmlPacket::List *list = ret->createList("users"); - for(std::set::iterator user = users->begin(); user != users->end(); ++user) { + for(std::set::const_iterator user = users->begin(); user != users->end(); ++user) { Common::XmlPacket::List::iterator entry = list->addEntry(); entry->set("uid", *user); @@ -101,7 +123,9 @@ UserRequestHandlerGroup::UserRequestHandlerGroup(Application *application0) : ap registerHandler("ListUsers", boost::bind(&UserRequestHandlerGroup::handleUserListRequest, this, _1, _2, _3)); registerHandler("GetUserInfo", boost::bind(&UserRequestHandlerGroup::handleUserInfoRequest, this, _1, _2, _3)); registerHandler("ListUserGroups", boost::bind(&UserRequestHandlerGroup::handleUserGroupListRequest, this, _1, _2, _3)); + registerHandler("ListGroups", boost::bind(&UserRequestHandlerGroup::handleGroupListRequest, this, _1, _2, _3)); + registerHandler("GetGroupInfo", boost::bind(&UserRequestHandlerGroup::handleGroupInfoRequest, this, _1, _2, _3)); registerHandler("ListGroupUsers", boost::bind(&UserRequestHandlerGroup::handleGroupUserListRequest, this, _1, _2, _3)); } diff --git a/src/Server/RequestHandlers/UserRequestHandlerGroup.h b/src/Server/RequestHandlers/UserRequestHandlerGroup.h index 2a17a9a..744f895 100644 --- a/src/Server/RequestHandlers/UserRequestHandlerGroup.h +++ b/src/Server/RequestHandlers/UserRequestHandlerGroup.h @@ -36,7 +36,9 @@ class UserRequestHandlerGroup : public Common::RequestHandlers::SimpleRequestHan void handleUserListRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection); void handleUserInfoRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection); void handleUserGroupListRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection); + void handleGroupListRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection); + void handleGroupInfoRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection); void handleGroupUserListRequest(boost::shared_ptr packet, Common::XmlPacket *ret, Common::Connection *connection); public: diff --git a/src/madc.cpp b/src/madc.cpp index 55c2be7..a0cfb61 100644 --- a/src/madc.cpp +++ b/src/madc.cpp @@ -20,6 +20,8 @@ #include "Core/ConfigManager.h" #include "Common/ClientConnection.h" +#include "Common/UserManager.h" +#include "Common/Backends/NetworkUserBackend.h" #include "Common/RequestManager.h" #include "Common/Requests/IdentifyRequest.h" @@ -77,6 +79,9 @@ int main(int argc, char *argv[]) { std::cerr << " done." << std::endl << std::endl; + boost::shared_ptr networkUserBackend(new Common::Backends::NetworkUserBackend(&application, connection)); + application.getUserManager()->registerBackend(networkUserBackend); + Client::CommandParser commandParser(&application, connection); while(connection->isConnected() && !commandParser.willDisconnect()) { @@ -94,6 +99,8 @@ int main(int argc, char *argv[]) { connection->waitWhileConnected(); + application.getUserManager()->unregisterBackend(networkUserBackend); + application.getRequestManager()->unregisterConnection(connection); } catch(Core::Exception &e) { diff --git a/src/modules/UserBackendMysql/UserBackendMysql.cpp b/src/modules/UserBackendMysql/UserBackendMysql.cpp index 904c9a6..e6e6dda 100644 --- a/src/modules/UserBackendMysql/UserBackendMysql.cpp +++ b/src/modules/UserBackendMysql/UserBackendMysql.cpp @@ -129,14 +129,14 @@ void UserBackendMysql::configFinished() { } -boost::shared_ptr > UserBackendMysql::getUserList() throw(Core::Exception) { +boost::shared_ptr > UserBackendMysql::getUserList() throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) throw Core::Exception(Core::Exception::NOT_AVAILABLE); mysql_real_query(mysql, queryListUsers.c_str(), queryListUsers.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 4) throw Core::Exception(Core::Exception::NOT_AVAILABLE); @@ -155,7 +155,7 @@ boost::shared_ptr > UserBackendMysql:: return users; } -boost::shared_ptr UserBackendMysql::getUserInfo(unsigned long uid) throw(Core::Exception) { +boost::shared_ptr UserBackendMysql::getUserInfo(unsigned long uid) throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) @@ -171,7 +171,7 @@ boost::shared_ptr UserBackendMysql::getUserInfo(unsigned long query = boost::regex_replace(query, boost::regex("\\{UID\\}"), tmp.str(), boost::match_default); mysql_real_query(mysql, query.c_str(), query.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 4) throw Core::Exception(Core::Exception::NOT_AVAILABLE); @@ -192,7 +192,7 @@ boost::shared_ptr UserBackendMysql::getUserInfo(unsigned long throw Core::Exception(Core::Exception::NOT_AVAILABLE); } -boost::shared_ptr UserBackendMysql::getUserInfoByName(const std::string &name) throw(Core::Exception) { +boost::shared_ptr UserBackendMysql::getUserInfoByName(const std::string &name) throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) @@ -205,7 +205,7 @@ boost::shared_ptr UserBackendMysql::getUserInfoByName(const st std::string query = boost::regex_replace(queryUserByName, boost::regex("\\{USER\\}"), "\""+std::string(escapedName.get())+"\"", boost::match_default); mysql_real_query(mysql, query.c_str(), query.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 4) throw Core::Exception(Core::Exception::NOT_AVAILABLE); @@ -226,7 +226,7 @@ boost::shared_ptr UserBackendMysql::getUserInfoByName(const st throw Core::Exception(Core::Exception::NOT_AVAILABLE); } -boost::shared_ptr > UserBackendMysql::getUserGroupList(unsigned long uid) throw(Core::Exception) { +boost::shared_ptr > UserBackendMysql::getUserGroupList(unsigned long uid) throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) @@ -240,7 +240,7 @@ boost::shared_ptr > UserBackendMysql::getUserGroupList(u std::string query = boost::regex_replace(queryListUserGroups, boost::regex("\\{UID\\}"), tmp.str(), boost::match_default); mysql_real_query(mysql, query.c_str(), query.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 1) throw Core::Exception(Core::Exception::NOT_AVAILABLE); @@ -254,14 +254,14 @@ boost::shared_ptr > UserBackendMysql::getUserGroupList(u } -boost::shared_ptr > UserBackendMysql::getGroupList() throw(Core::Exception) { +boost::shared_ptr > UserBackendMysql::getGroupList() throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) throw Core::Exception(Core::Exception::NOT_AVAILABLE); mysql_real_query(mysql, queryListGroups.c_str(), queryListGroups.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 2) throw Core::Exception(Core::Exception::NOT_AVAILABLE); @@ -277,7 +277,7 @@ boost::shared_ptr > UserBackendMysql: return groups; } -std::string UserBackendMysql::getGroupName(unsigned long gid) throw(Core::Exception) { +boost::shared_ptr UserBackendMysql::getGroupInfo(unsigned long gid) throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) @@ -293,7 +293,7 @@ std::string UserBackendMysql::getGroupName(unsigned long gid) throw(Core::Except query = boost::regex_replace(query, boost::regex("\\{GID\\}"), tmp.str(), boost::match_default); mysql_real_query(mysql, query.c_str(), query.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 2) throw Core::Exception(Core::Exception::NOT_AVAILABLE); @@ -301,12 +301,12 @@ std::string UserBackendMysql::getGroupName(unsigned long gid) throw(Core::Except MYSQL_ROW row = mysql_fetch_row(result); if(row) - return row[1]; + return boost::shared_ptr(new Common::GroupInfo(strtoul(row[0], 0, 10), row[1])); throw Core::Exception(Core::Exception::NOT_AVAILABLE); } -unsigned long UserBackendMysql::getGroupId(const std::string &name) throw(Core::Exception) { +boost::shared_ptr UserBackendMysql::getGroupInfoByName(const std::string &name) throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) @@ -319,7 +319,7 @@ unsigned long UserBackendMysql::getGroupId(const std::string &name) throw(Core:: std::string query = boost::regex_replace(queryGroupByName, boost::regex("\\{GROUP\\}"), "\""+std::string(escapedName.get())+"\"", boost::match_default); mysql_real_query(mysql, query.c_str(), query.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 2) throw Core::Exception(Core::Exception::NOT_AVAILABLE); @@ -327,12 +327,12 @@ unsigned long UserBackendMysql::getGroupId(const std::string &name) throw(Core:: MYSQL_ROW row = mysql_fetch_row(result); if(row) - return strtoul(row[0], 0, 10); + return boost::shared_ptr(new Common::GroupInfo(strtoul(row[0], 0, 10), row[1])); throw Core::Exception(Core::Exception::NOT_AVAILABLE); } -boost::shared_ptr > UserBackendMysql::getGroupUserList(unsigned long gid) throw(Core::Exception) { +boost::shared_ptr > UserBackendMysql::getGroupUserList(unsigned long gid) throw(Core::Exception) { application->getThreadManager()->detach(); if(!mysql || mysql_ping(mysql)) @@ -346,7 +346,7 @@ boost::shared_ptr > UserBackendMysql::getGroupUserList(u std::string query = boost::regex_replace(queryListGroupUsers, boost::regex("\\{GID\\}"), tmp.str(), boost::match_default); mysql_real_query(mysql, query.c_str(), query.length()); - MYSQL_RES *result = mysql_use_result(mysql); + MYSQL_RES *result = mysql_store_result(mysql); if(!result || mysql_num_fields(result) < 1) throw Core::Exception(Core::Exception::NOT_AVAILABLE); diff --git a/src/modules/UserBackendMysql/UserBackendMysql.h b/src/modules/UserBackendMysql/UserBackendMysql.h index 77f0700..7832e95 100644 --- a/src/modules/UserBackendMysql/UserBackendMysql.h +++ b/src/modules/UserBackendMysql/UserBackendMysql.h @@ -50,15 +50,15 @@ class UserBackendMysql : public Common::UserBackend, private Core::Configurable virtual bool handleConfigEntry(const Core::ConfigEntry &entry, bool); virtual void configFinished(); - virtual boost::shared_ptr > getUserList() throw(Core::Exception); - virtual boost::shared_ptr getUserInfo(unsigned long uid) throw(Core::Exception); - virtual boost::shared_ptr getUserInfoByName(const std::string &name) throw(Core::Exception); - virtual boost::shared_ptr > getUserGroupList(unsigned long uid) throw(Core::Exception); - - virtual boost::shared_ptr > getGroupList() throw(Core::Exception); - virtual std::string getGroupName(unsigned long gid) throw(Core::Exception); - virtual unsigned long getGroupId(const std::string &name) throw(Core::Exception); - virtual boost::shared_ptr > getGroupUserList(unsigned long gid) throw(Core::Exception); + virtual boost::shared_ptr > getUserList() throw(Core::Exception); + virtual boost::shared_ptr getUserInfo(unsigned long uid) throw(Core::Exception); + virtual boost::shared_ptr getUserInfoByName(const std::string &name) throw(Core::Exception); + virtual boost::shared_ptr > getUserGroupList(unsigned long uid) throw(Core::Exception); + + virtual boost::shared_ptr > getGroupList() throw(Core::Exception); + virtual boost::shared_ptr getGroupInfo(unsigned long gid) throw(Core::Exception); + virtual boost::shared_ptr getGroupInfoByName(const std::string &name) throw(Core::Exception); + virtual boost::shared_ptr > getGroupUserList(unsigned long gid) throw(Core::Exception); public: UserBackendMysql(Common::Application *application0) : application(application0), port(0), mysql(0) { -- cgit v1.2.3