diff options
Diffstat (limited to 'src/Common')
-rw-r--r-- | src/Common/Backends/NetworkUserBackend.cpp | 33 | ||||
-rw-r--r-- | src/Common/Backends/NetworkUserBackend.h | 17 | ||||
-rw-r--r-- | src/Common/UserBackend.h | 8 | ||||
-rw-r--r-- | src/Common/UserCache.h | 8 | ||||
-rw-r--r-- | src/Common/UserManager.cpp | 34 | ||||
-rw-r--r-- | src/Common/UserManager.h | 3 |
6 files changed, 103 insertions, 0 deletions
diff --git a/src/Common/Backends/NetworkUserBackend.cpp b/src/Common/Backends/NetworkUserBackend.cpp index 1e06a78..6296581 100644 --- a/src/Common/Backends/NetworkUserBackend.cpp +++ b/src/Common/Backends/NetworkUserBackend.cpp @@ -83,6 +83,15 @@ void NetworkUserBackend::UserUpdateRequest::sendRequest() { sendPacket(packet); } +void NetworkUserBackend::UserGroupRequest::sendRequest() { + XmlPacket packet; + packet.setType(type); + packet.set("uid", uid); + packet.set("gid", gid); + + sendPacket(packet); +} + boost::shared_ptr<const std::map<unsigned long, UserInfo> > NetworkUserBackend::getUserList(boost::posix_time::ptime *timestamp) throw(Core::Exception) { application->getThreadManager()->detach(); @@ -406,6 +415,30 @@ void NetworkUserBackend::deleteUser(unsigned long uid) throw(Core::Exception) { throw result.second; } +void NetworkUserBackend::addUserToGroup(unsigned long uid, unsigned long gid) throw(Core::Exception) { + application->getThreadManager()->detach(); + + boost::shared_ptr<UserGroupRequest> request(new UserGroupRequest(application, "AddUserToGroup", uid, gid)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair<boost::shared_ptr<const XmlPacket>, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; +} + +void NetworkUserBackend::deleteUserFromGroup(unsigned long uid, unsigned long gid) throw(Core::Exception) { + application->getThreadManager()->detach(); + + boost::shared_ptr<UserGroupRequest> request(new UserGroupRequest(application, "DeleteUserFromGroup", uid, gid)); + application->getRequestManager()->sendRequest(connection, request); + request->wait(); + + std::pair<boost::shared_ptr<const XmlPacket>, Core::Exception> result = request->getResult(); + if(!result.first || result.second) + throw result.second; +} + } } } diff --git a/src/Common/Backends/NetworkUserBackend.h b/src/Common/Backends/NetworkUserBackend.h index b932e87..0567514 100644 --- a/src/Common/Backends/NetworkUserBackend.h +++ b/src/Common/Backends/NetworkUserBackend.h @@ -96,6 +96,20 @@ class NetworkUserBackend : public UserBackend { : Request(application), uid(uid0), userInfo(userInfo0) {} }; + class UserGroupRequest : public Request { + private: + std::string type; + unsigned long uid; + unsigned long gid; + + protected: + virtual void sendRequest(); + + public: + UserGroupRequest(Application *application, const std::string &type0, unsigned long uid0, unsigned long gid0) + : Request(application), type(type0), uid(uid0), gid(gid0) {} + }; + Application *application; Connection *connection; @@ -118,6 +132,9 @@ class NetworkUserBackend : public UserBackend { virtual void updateUser(unsigned long uid, const Common::UserInfo &userInfo) throw(Core::Exception); virtual void deleteUser(unsigned long uid) throw(Core::Exception); + virtual void addUserToGroup(unsigned long uid, unsigned long gid) throw(Core::Exception); + virtual void deleteUserFromGroup(unsigned long uid, unsigned long gid) throw(Core::Exception); + public: NetworkUserBackend(Application *application0, Connection *connection0) : application(application0), connection(connection0) {} }; diff --git a/src/Common/UserBackend.h b/src/Common/UserBackend.h index 2e42e12..9eb59d3 100644 --- a/src/Common/UserBackend.h +++ b/src/Common/UserBackend.h @@ -113,6 +113,14 @@ class UserBackend { throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); } + virtual void addUserToGroup(unsigned long uid _UNUSED_PARAMETER_, unsigned long gid _UNUSED_PARAMETER_) throw(Core::Exception) { + throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); + } + + virtual void deleteUserFromGroup(unsigned long uid _UNUSED_PARAMETER_, unsigned long gid _UNUSED_PARAMETER_) throw(Core::Exception) { + throw(Core::Exception(Core::Exception::NOT_IMPLEMENTED)); + } + public: virtual ~UserBackend() {} diff --git a/src/Common/UserCache.h b/src/Common/UserCache.h index e778e24..1425908 100644 --- a/src/Common/UserCache.h +++ b/src/Common/UserCache.h @@ -98,6 +98,14 @@ class UserCache : public UserBackend, private boost::noncopyable { backend->deleteGroup(gid); } + virtual void addUserToGroup(unsigned long uid, unsigned long gid) throw(Core::Exception) { + backend->addUserToGroup(uid, gid); + } + + virtual void deleteUserFromGroup(unsigned long uid, unsigned long gid) throw(Core::Exception) { + backend->deleteUserFromGroup(uid, gid); + } + UserCache(Application *application0, boost::shared_ptr<UserBackend> backend0) : application(application0), backend(backend0), userTime(boost::posix_time::not_a_date_time), groupTime(boost::posix_time::not_a_date_time), userGroupTime(boost::posix_time::not_a_date_time) {} diff --git a/src/Common/UserManager.cpp b/src/Common/UserManager.cpp index 14451aa..928289b 100644 --- a/src/Common/UserManager.cpp +++ b/src/Common/UserManager.cpp @@ -326,5 +326,39 @@ void UserManager::deleteGroup(unsigned long gid) throw(Core::Exception) { throw Core::Exception(Core::Exception::NOT_IMPLEMENTED); } +void UserManager::addUserToGroup(unsigned long uid, unsigned long gid) throw(Core::Exception) { + boost::lock_guard<boost::shared_mutex> lock(mutex); + + for(BackendMap::iterator backend = backends.begin(); backend != backends.end(); ++backend) { + try { + backend->second->addUserToGroup(uid, gid); + return; + } + catch(Core::Exception e) { + if(e.getErrorCode() != Core::Exception::NOT_IMPLEMENTED) + throw e; + } + } + + throw Core::Exception(Core::Exception::NOT_IMPLEMENTED); +} + +void UserManager::deleteUserFromGroup(unsigned long uid, unsigned long gid) throw(Core::Exception) { + boost::lock_guard<boost::shared_mutex> lock(mutex); + + for(BackendMap::iterator backend = backends.begin(); backend != backends.end(); ++backend) { + try { + backend->second->deleteUserFromGroup(uid, gid); + return; + } + catch(Core::Exception e) { + if(e.getErrorCode() != Core::Exception::NOT_IMPLEMENTED) + throw e; + } + } + + throw Core::Exception(Core::Exception::NOT_IMPLEMENTED); +} + } } diff --git a/src/Common/UserManager.h b/src/Common/UserManager.h index 466b9a9..d2529e7 100644 --- a/src/Common/UserManager.h +++ b/src/Common/UserManager.h @@ -90,6 +90,9 @@ class UserManager : private boost::noncopyable { void addGroup(const GroupInfo &groupInfo) throw(Core::Exception); void updateGroup(unsigned long gid, const GroupInfo &groupInfo) throw(Core::Exception); void deleteGroup(unsigned long gid) throw(Core::Exception); + + void addUserToGroup(unsigned long uid, unsigned long gid) throw(Core::Exception); + void deleteUserFromGroup(unsigned long uid, unsigned long gid) throw(Core::Exception); }; } |