diff options
Diffstat (limited to 'src/Common')
-rw-r--r-- | src/Common/UserManager.cpp | 76 | ||||
-rw-r--r-- | src/Common/UserManager.h | 11 |
2 files changed, 85 insertions, 2 deletions
diff --git a/src/Common/UserManager.cpp b/src/Common/UserManager.cpp index 7f50f28..bb4d205 100644 --- a/src/Common/UserManager.cpp +++ b/src/Common/UserManager.cpp @@ -22,9 +22,79 @@ #include "UserCache.h" #include "UserConfigBackend.h" +#include <Core/ConfigEntry.h> +#include <Core/ConfigManager.h> + namespace Mad { namespace Common { +UserManager::UserManager(Application *application0) : application(application0), minUid(1000), maxUid(29999), minGid(1000), maxGid(29999) { + application->getConfigManager()->registerConfigurable(this); +} + +UserManager::~UserManager() { + application->getConfigManager()->unregisterConfigurable(this); +} + +bool UserManager::handleConfigEntry(const Core::ConfigEntry &entry, bool /*handled*/) { + if(entry[0].getKey().matches("UserManager")) { + if(entry[1].getKey().matches("MinUid")) { + if(entry[2].empty()) { + char *endptr; + unsigned long val = std::strtoul(entry[1][0].c_str(), &endptr, 10); + if(entry[1][0].empty() || *endptr) { + application->logf(Core::LoggerBase::WARNING, "UserBackendHome: Invalid configuration: MinUid '%s'", entry[1][0].c_str()); + } + else { + minUid = val; + } + } + } + else if(entry[1].getKey().matches("MaxUid")) { + if(entry[2].empty()) { + char *endptr; + unsigned long val = std::strtoul(entry[1][0].c_str(), &endptr, 10); + if(entry[1][0].empty() || *endptr) { + application->logf(Core::LoggerBase::WARNING, "UserBackendHome: Invalid configuration: MaxUid '%s'", entry[1][0].c_str()); + } + else { + maxUid = val; + } + } + } + else if(entry[1].getKey().matches("MinGid")) { + if(entry[2].empty()) { + char *endptr; + unsigned long val = std::strtoul(entry[1][0].c_str(), &endptr, 10); + if(entry[1][0].empty() || *endptr) { + application->logf(Core::LoggerBase::WARNING, "UserBackendHome: Invalid configuration: MinGid '%s'", entry[1][0].c_str()); + } + else { + minGid = val; + } + } + } + else if(entry[1].getKey().matches("MaxGid")) { + if(entry[2].empty()) { + char *endptr; + unsigned long val = std::strtoul(entry[1][0].c_str(), &endptr, 10); + if(entry[1][0].empty() || *endptr) { + application->logf(Core::LoggerBase::WARNING, "UserBackendHome: Invalid configuration: MaxGid '%s'", entry[1][0].c_str()); + } + else { + maxGid = val; + } + } + } + else if(!entry[1].empty()) + return false; + + return true; + } + + return false; +} + void UserManager::registerBackend(boost::shared_ptr<UserDBBackend> backend) { boost::lock_guard<boost::shared_mutex> lock(mutex); @@ -143,6 +213,9 @@ void UserManager::checkUserInfo(const UserInfo &userInfo) throw(Core::Exception) if(!dbBackend) throw Core::Exception(Core::Exception::NOT_AVAILABLE); + if(userInfo.getUid() < minUid || userInfo.getUid() > maxUid) + throw Core::Exception(Core::Exception::INVALID_INPUT); + dbBackend->checkUserInfo(userInfo); for(std::set<boost::shared_ptr<UserConfigBackend> >::iterator configBackend = configBackends.begin(); configBackend != configBackends.end(); ++configBackend) { @@ -223,6 +296,9 @@ void UserManager::checkGroupInfo(const GroupInfo &groupInfo) throw(Core::Excepti if(!dbBackend) throw Core::Exception(Core::Exception::NOT_AVAILABLE); + if(groupInfo.getGid() < minGid || groupInfo.getGid() > maxGid) + throw Core::Exception(Core::Exception::INVALID_INPUT); + dbBackend->checkGroupInfo(groupInfo); for(std::set<boost::shared_ptr<UserConfigBackend> >::iterator configBackend = configBackends.begin(); configBackend != configBackends.end(); ++configBackend) { diff --git a/src/Common/UserManager.h b/src/Common/UserManager.h index 5eece35..c70894a 100644 --- a/src/Common/UserManager.h +++ b/src/Common/UserManager.h @@ -23,6 +23,7 @@ #include "UserInfo.h" #include "GroupInfo.h" +#include <Core/Configurable.h> #include <Core/Exception.h> #include <map> @@ -39,7 +40,7 @@ class UserConfigBackend; class UserDBBackend; class UserCache; -class UserManager : private boost::noncopyable { +class UserManager : public Core::Configurable, private boost::noncopyable { private: friend class Application; @@ -54,9 +55,15 @@ class UserManager : private boost::noncopyable { boost::shared_ptr<UserDBBackend> dbBackend; + unsigned long minUid, maxUid, minGid, maxGid; + boost::shared_mutex mutex; - UserManager(Application *application0) : application(application0) {} + UserManager(Application *application0); + ~UserManager(); + + protected: + virtual bool handleConfigEntry(const Core::ConfigEntry &entry, bool /*handled*/); public: void registerBackend(boost::shared_ptr<UserDBBackend> backend); |