10 #ifndef __PION_PIONUSER_HEADER__
11 #define __PION_PIONUSER_HEADER__
16 #include <boost/shared_ptr.hpp>
17 #include <boost/noncopyable.hpp>
18 #include <boost/thread/mutex.hpp>
19 #include <boost/numeric/conversion/cast.hpp>
20 #include <pion/PionConfig.hpp>
21 #include <pion/PionException.hpp>
24 #include <openssl/sha.h>
35 private boost::noncopyable
42 virtual const char* what()
const throw() {
43 return "Invalid password hash provided";
54 PionUser(std::string
const &username, std::string
const &password) :
76 unsigned char sha1_hash[SHA_DIGEST_LENGTH];
77 SHA1(reinterpret_cast<const unsigned char *>(password.data()), password.size(), sha1_hash);
78 return (memcmp(sha1_hash, m_password_hash, SHA_DIGEST_LENGTH) == 0);
88 SHA1((
const unsigned char *)password.data(), password.size(), m_password_hash);
93 for (
unsigned int n = 0; n < SHA_DIGEST_LENGTH; ++n) {
94 sprintf(buf,
"%.2x", static_cast<unsigned int>(m_password_hash[n]));
103 virtual void setPasswordHash(
const std::string& password_hash) {
106 if (password_hash.size() != SHA_DIGEST_LENGTH*2)
107 throw BadPasswordHash();
113 unsigned int hash_pos = 0;
114 std::string::iterator str_it =
m_password.begin();
120 m_password_hash[hash_pos++] = boost::numeric_cast<
unsigned char>(strtoul(buf, 0, 16));
135 unsigned char m_password_hash[SHA_DIGEST_LENGTH];
141 typedef boost::shared_ptr<PionUser> PionUserPtr;
148 private boost::noncopyable
160 boost::mutex::scoped_lock lock(
m_mutex);
172 virtual bool addUser(
const std::string &username,
173 const std::string &password)
175 boost::mutex::scoped_lock lock(
m_mutex);
176 UserMap::iterator i =
m_users.find(username);
179 PionUserPtr user(
new PionUser(username, password));
180 m_users.insert(std::make_pair(username, user));
193 const std::string &password)
195 boost::mutex::scoped_lock lock(
m_mutex);
196 UserMap::iterator i =
m_users.find(username);
199 i->second->setPassword(password);
212 virtual bool addUserHash(
const std::string &username,
213 const std::string &password_hash)
215 boost::mutex::scoped_lock lock(
m_mutex);
216 UserMap::iterator i =
m_users.find(username);
219 PionUserPtr user(
new PionUser(username));
220 user->setPasswordHash(password_hash);
221 m_users.insert(std::make_pair(username, user));
233 virtual bool updateUserHash(
const std::string &username,
234 const std::string &password_hash)
236 boost::mutex::scoped_lock lock(
m_mutex);
237 UserMap::iterator i =
m_users.find(username);
240 i->second->setPasswordHash(password_hash);
251 boost::mutex::scoped_lock lock(
m_mutex);
252 UserMap::iterator i =
m_users.find(username);
262 virtual PionUserPtr
getUser(
const std::string &username) {
263 boost::mutex::scoped_lock lock(
m_mutex);
264 UserMap::const_iterator i =
m_users.find(username);
266 return PionUserPtr();
274 virtual PionUserPtr
getUser(
const std::string& username,
const std::string& password) {
275 boost::mutex::scoped_lock lock(
m_mutex);
276 UserMap::const_iterator i =
m_users.find(username);
277 if (i==
m_users.end() || !i->second->matchPassword(password))
278 return PionUserPtr();
287 typedef std::map<std::string, PionUserPtr>
UserMap;
298 typedef boost::shared_ptr<PionUserManager> PionUserManagerPtr;
virtual bool addUser(const std::string &username, const std::string &password)
std::string const & getUsername() const
returns user name as a string
virtual bool removeUser(const std::string &username)
virtual bool updateUser(const std::string &username, const std::string &password)
bool empty(void) const
returns true if no users are defined
std::string m_password
password string (actual contents depends on implementation)
UserMap m_users
user records container
PionUser(std::string const &username)
construct a new PionUser object
boost::mutex m_mutex
mutex used to protect access to the user list
virtual void setPassword(const std::string &password)
sets password credentials for given user
std::string const & getPassword() const
returns password for the user (encrypted if SSL is enabled)
virtual PionUserPtr getUser(const std::string &username)
virtual bool matchPassword(const std::string &password) const
virtual ~PionUserManager()
virtual destructor
std::map< std::string, PionUserPtr > UserMap
data type for a map of usernames to user objects
virtual PionUserPtr getUser(const std::string &username, const std::string &password)
PionUser(std::string const &username, std::string const &password)
construct a new PionUser object
PionUserManager(void)
construct a new PionUserManager object
the following enables use of the lock-free cache
exception thrown if a bad password hash is given to setPasswordHash()
virtual ~PionUser()
virtual destructor
const std::string m_username
username string