diff options
Diffstat (limited to 'src/Common/AuthManager.cpp')
-rw-r--r-- | src/Common/AuthManager.cpp | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/src/Common/AuthManager.cpp b/src/Common/AuthManager.cpp index d21909d..c4cace7 100644 --- a/src/Common/AuthManager.cpp +++ b/src/Common/AuthManager.cpp @@ -25,31 +25,54 @@ namespace Mad { namespace Common { -const std::vector<std::string> AuthManager::DenyBackend::methods; +void AuthManager::setProvider(boost::shared_ptr<AuthProvider> newProvider) { + boost::lock_guard<boost::shared_mutex> lock(mutex); + + provider = newProvider; +} + +void AuthManager::unsetProvider(boost::shared_ptr<AuthProvider> oldProvider) { + boost::lock_guard<boost::shared_mutex> lock(mutex); + + if(oldProvider == provider) + provider.reset(); +} -void AuthManager::registerBackend(boost::shared_ptr<AuthBackend> newBackend) { +void AuthManager::registerBackend(boost::shared_ptr<AuthBackend> backend) { boost::lock_guard<boost::shared_mutex> lock(mutex); - backend = newBackend; + methods.insert(backend->getMethodName()); + backends.insert(std::make_pair(backend->getMethodName(), backend)); } -void AuthManager::unregisterBackend(boost::shared_ptr<AuthBackend> oldBackend) { +void AuthManager::unregisterBackend(boost::shared_ptr<AuthBackend> backend) { boost::lock_guard<boost::shared_mutex> lock(mutex); - if(oldBackend == backend) - backend = denyBackend; + std::map<std::string, boost::shared_ptr<AuthBackend> >::iterator backendIt = backends.find(backend->getMethodName()); + if(backendIt == backends.end() || backendIt->second != backend) + return; + + methods.erase(backend->getMethodName()); + backends.erase(backendIt); } -std::vector<std::string> AuthManager::getMethods() { +std::set<std::string> AuthManager::getMethods() { boost::shared_lock<boost::shared_mutex> lock(mutex); - return backend->getMethods(); + return methods; } std::vector<std::string> AuthManager::getSubMethods(const std::string &method) throw(Core::Exception) { boost::shared_lock<boost::shared_mutex> lock(mutex); - return backend->getSubMethods(method); + std::map<std::string, boost::shared_ptr<AuthBackend> >::iterator backend = backends.find(method); + if(backend == backends.end()) + throw Core::Exception(Core::Exception::NOT_IMPLEMENTED); + + if(!provider) + throw Core::Exception(Core::Exception::NOT_AVAILABLE); + + return backend->second->getSubMethods(provider); } boost::shared_ptr<AuthContext> AuthManager::authenticate(const std::string &method, const std::string &subMethod, const std::string &user, @@ -58,7 +81,14 @@ boost::shared_ptr<AuthContext> AuthManager::authenticate(const std::string &meth response.clear(); - return backend->authenticate(method, subMethod, user, data, response, context); + std::map<std::string, boost::shared_ptr<AuthBackend> >::iterator backend = backends.find(method); + if(backend == backends.end()) + throw Core::Exception(Core::Exception::NOT_IMPLEMENTED); + + if(!provider) + throw Core::Exception(Core::Exception::NOT_AVAILABLE); + + return backend->second->authenticate(provider, subMethod, user, data, response, context); } } |