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) :
48 , m_password_hash_type(EMPTY)
53 user(std::string
const &username, std::string
const &password) :
56 , m_password_hash_type(EMPTY)
78 if (m_password_hash_type == SHA_256) {
79 unsigned char sha256_hash[SHA256_DIGEST_LENGTH];
80 SHA256(reinterpret_cast<const unsigned char *>(password.data()), password.size(), sha256_hash);
81 return (memcmp(sha256_hash, m_password_hash, SHA256_DIGEST_LENGTH) == 0);
82 }
else if (m_password_hash_type == SHA_1) {
83 unsigned char sha1_hash[SHA_DIGEST_LENGTH];
84 SHA1(reinterpret_cast<const unsigned char *>(password.data()), password.size(), sha1_hash);
85 return (memcmp(sha1_hash, m_password_hash, SHA_DIGEST_LENGTH) == 0);
97 SHA256((
const unsigned char *)password.data(), password.size(), m_password_hash);
98 m_password_hash_type = SHA_256;
103 for (
unsigned int n = 0; n < SHA256_DIGEST_LENGTH; ++n) {
104 sprintf(buf,
"%.2x", static_cast<unsigned int>(m_password_hash[n]));
113 virtual void set_password_hash(
const std::string& password_hash) {
116 if (password_hash.size() == SHA256_DIGEST_LENGTH * 2) {
117 m_password_hash_type = SHA_256;
118 }
else if (password_hash.size() == SHA_DIGEST_LENGTH * 2) {
119 m_password_hash_type = SHA_1;
121 BOOST_THROW_EXCEPTION( error::bad_password_hash() );
128 unsigned int hash_pos = 0;
129 std::string::iterator str_it =
m_password.begin();
135 m_password_hash[hash_pos++] = boost::numeric_cast<
unsigned char>(strtoul(buf, 0, 16));
150 enum password_hash_type_t {EMPTY, SHA_1, SHA_256};
153 password_hash_type_t m_password_hash_type;
156 unsigned char m_password_hash[SHA256_DIGEST_LENGTH];
161 typedef boost::shared_ptr<user> user_ptr;
168 private boost::noncopyable
180 boost::mutex::scoped_lock lock(
m_mutex);
193 const std::string &password)
195 boost::mutex::scoped_lock lock(
m_mutex);
196 user_map_t::iterator i =
m_users.find(username);
199 user_ptr user_ptr(
new user(username, password));
200 m_users.insert(std::make_pair(username, user_ptr));
213 const std::string &password)
215 boost::mutex::scoped_lock lock(
m_mutex);
216 user_map_t::iterator i =
m_users.find(username);
219 i->second->set_password(password);
232 virtual bool add_user_hash(
const std::string &username,
233 const std::string &password_hash)
235 boost::mutex::scoped_lock lock(
m_mutex);
236 user_map_t::iterator i =
m_users.find(username);
239 user_ptr user_ptr(
new user(username));
240 user_ptr->set_password_hash(password_hash);
241 m_users.insert(std::make_pair(username, user_ptr));
253 virtual bool update_user_hash(
const std::string &username,
254 const std::string &password_hash)
256 boost::mutex::scoped_lock lock(
m_mutex);
257 user_map_t::iterator i =
m_users.find(username);
260 i->second->set_password_hash(password_hash);
271 boost::mutex::scoped_lock lock(
m_mutex);
272 user_map_t::iterator i =
m_users.find(username);
282 virtual user_ptr
get_user(
const std::string &username) {
283 boost::mutex::scoped_lock lock(
m_mutex);
284 user_map_t::const_iterator i =
m_users.find(username);
294 virtual user_ptr
get_user(
const std::string& username,
const std::string& password) {
295 boost::mutex::scoped_lock lock(
m_mutex);
296 user_map_t::const_iterator i =
m_users.find(username);
297 if (i==
m_users.end() || !i->second->match_password(password))
318 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
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