summaryrefslogtreecommitdiffstats
path: root/src/Common/AuthManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/AuthManager.cpp')
-rw-r--r--src/Common/AuthManager.cpp50
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);
}
}