10 #ifndef __PION_USER_HEADER__
11 #define __PION_USER_HEADER__
17 #include <boost/shared_ptr.hpp>
18 #include <boost/noncopyable.hpp>
19 #include <boost/thread/mutex.hpp>
20 #include <boost/numeric/conversion/cast.hpp>
21 #include <pion/config.hpp>
22 #include <pion/error.hpp>
25 #if defined(__APPLE__)
27 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
29 #include <openssl/sha.h>
40 private boost::noncopyable
45 user(std::string
const &username) :
50 user(std::string
const &username, std::string
const &password) :
72 unsigned char sha1_hash[SHA_DIGEST_LENGTH];
73 SHA1(reinterpret_cast<const unsigned char *>(password.data()), password.size(), sha1_hash);
74 return (memcmp(sha1_hash, m_password_hash, SHA_DIGEST_LENGTH) == 0);
84 SHA1((
const unsigned char *)password.data(), password.size(), m_password_hash);
89 for (
unsigned int n = 0; n < SHA_DIGEST_LENGTH; ++n) {
90 sprintf(buf,
"%.2x", static_cast<unsigned int>(m_password_hash[n]));
99 virtual void set_password_hash(
const std::string& password_hash) {
102 if (password_hash.size() != SHA_DIGEST_LENGTH*2)
109 unsigned int hash_pos = 0;
110 std::string::iterator str_it =
m_password.begin();
116 m_password_hash[hash_pos++] = boost::numeric_cast<
unsigned char>(strtoul(buf, 0, 16));
131 unsigned char m_password_hash[SHA_DIGEST_LENGTH];
137 typedef boost::shared_ptr<user> user_ptr;
144 private boost::noncopyable
156 boost::mutex::scoped_lock lock(
m_mutex);
169 const std::string &password)
171 boost::mutex::scoped_lock lock(
m_mutex);
172 user_map_t::iterator i =
m_users.find(username);
175 user_ptr user_ptr(
new user(username, password));
176 m_users.insert(std::make_pair(username, user_ptr));
189 const std::string &password)
191 boost::mutex::scoped_lock lock(
m_mutex);
192 user_map_t::iterator i =
m_users.find(username);
195 i->second->set_password(password);
208 virtual bool add_user_hash(
const std::string &username,
209 const std::string &password_hash)
211 boost::mutex::scoped_lock lock(
m_mutex);
212 user_map_t::iterator i =
m_users.find(username);
215 user_ptr user_ptr(
new user(username));
216 user_ptr->set_password_hash(password_hash);
217 m_users.insert(std::make_pair(username, user_ptr));
229 virtual bool update_user_hash(
const std::string &username,
230 const std::string &password_hash)
232 boost::mutex::scoped_lock lock(
m_mutex);
233 user_map_t::iterator i =
m_users.find(username);
236 i->second->set_password_hash(password_hash);
247 boost::mutex::scoped_lock lock(
m_mutex);
248 user_map_t::iterator i =
m_users.find(username);
258 virtual user_ptr
get_user(
const std::string &username) {
259 boost::mutex::scoped_lock lock(
m_mutex);
260 user_map_t::const_iterator i =
m_users.find(username);
270 virtual user_ptr
get_user(
const std::string& username,
const std::string& password) {
271 boost::mutex::scoped_lock lock(
m_mutex);
272 user_map_t::const_iterator i =
m_users.find(username);
273 if (i==
m_users.end() || !i->second->match_password(password))
294 typedef boost::shared_ptr<user_manager> user_manager_ptr;
std::string m_password
password string (actual contents depends on implementation)
virtual bool update_user(const std::string &username, const std::string &password)
virtual bool remove_user(const std::string &username)
virtual bool match_password(const std::string &password) const
std::string const & get_username() const
returns user name as a string
virtual ~user()
virtual destructor
bool empty(void) const
returns true if no users are defined
boost::mutex m_mutex
mutex used to protect access to the user list
user_manager(void)
construct a new user_manager object
virtual bool add_user(const std::string &username, const std::string &password)
user(std::string const &username, std::string const &password)
construct a new user object
exception thrown if a bad password hash is provided
std::string const & get_password() const
returns password for the user (encrypted if SSL is enabled)
virtual user_ptr get_user(const std::string &username, const std::string &password)
std::map< std::string, user_ptr > user_map_t
data type for a map of usernames to user objects
virtual void set_password(const std::string &password)
sets password credentials for given user
user(std::string const &username)
construct a new user object
const std::string m_username
username string
virtual user_ptr get_user(const std::string &username)
virtual ~user_manager()
virtual destructor
user_map_t m_users
user records container