MXS-1354: Add permissions to admin users

The admin users now have a concept of write and read permissions. This
allows restricted read-only access to be granted to users.
This commit is contained in:
Markus Mäkelä
2017-08-14 14:08:31 +03:00
parent c323f0a551
commit 06afbd14eb
2 changed files with 101 additions and 6 deletions

View File

@ -88,6 +88,36 @@ bool users_auth(USERS* users, const char* user, const char* password);
*/ */
bool users_find(USERS* users, const char* user); bool users_find(USERS* users, const char* user);
/**
* Check if user is an administrator
*
* @param users The users table
* @param user User to check
*
* @return True if user is an administrator
*/
bool users_is_admin(USERS* users, const char* user);
/**
* Promote a user to an administrator
*
* @param users The users table
* @param user User to promote
*
* @return True if user was found and promoted
*/
bool users_promote(USERS* users, const char* user);
/**
* Demote an administrative user to a normal user
*
* @param users The users table
* @param user User to demote
*
* @return True if user was found and demoted
*/
bool users_demote(USERS* users, const char* user);
/** /**
* @brief Default user loading function * @brief Default user loading function
* *

View File

@ -22,13 +22,33 @@
namespace namespace
{ {
enum permission_type
{
PERM_READ,
PERM_WRITE
};
struct UserInfo
{
UserInfo(std::string pw = "", permission_type perm = PERM_WRITE): // TODO: Change default to PERM_READ
password(pw),
permissions(perm)
{
}
std::string password;
permission_type permissions;
};
class Users class Users
{ {
Users(const Users&); Users(const Users&);
Users& operator=(const Users&); Users& operator=(const Users&);
public: public:
typedef std::tr1::unordered_map<std::string, std::string> UserMap; typedef std::tr1::unordered_map<std::string, UserInfo> UserMap;
Users() Users()
{ {
@ -40,7 +60,7 @@ public:
bool add(std::string user, std::string password) bool add(std::string user, std::string password)
{ {
return m_data.insert(std::make_pair(user, password)).second; return m_data.insert(std::make_pair(user, UserInfo(password))).second;
} }
bool remove(std::string user) bool remove(std::string user)
@ -56,7 +76,7 @@ public:
return rval; return rval;
} }
bool get(std::string user, std::string* output = NULL) const bool get(std::string user, UserInfo* output = NULL) const
{ {
UserMap::const_iterator it = m_data.find(user); UserMap::const_iterator it = m_data.find(user);
bool rval = false; bool rval = false;
@ -74,6 +94,33 @@ public:
return rval; return rval;
} }
bool check_permissions(std::string user, permission_type perm) const
{
UserMap::const_iterator it = m_data.find(user);
bool rval = false;
if (it != m_data.end() && it->second.permissions == perm)
{
rval = true;
}
return rval;
}
bool set_permissions(std::string user, permission_type perm)
{
UserMap::iterator it = m_data.find(user);
bool rval = false;
if (it != m_data.end())
{
rval = true;
it->second.permissions = perm;
}
return rval;
}
json_t* diagnostic_json() const json_t* diagnostic_json() const
{ {
json_t* rval = json_array(); json_t* rval = json_array();
@ -147,16 +194,34 @@ bool users_auth(USERS* users, const char* user, const char* password)
{ {
Users* u = reinterpret_cast<Users*>(users); Users* u = reinterpret_cast<Users*>(users);
bool rval = false; bool rval = false;
std::string str; UserInfo info;
if (u->get(user, &str)) if (u->get(user, &info))
{ {
rval = strcmp(password, str.c_str()) == 0; rval = strcmp(password, info.password.c_str()) == 0;
} }
return rval; return rval;
} }
bool users_is_admin(USERS* users, const char* user)
{
Users* u = reinterpret_cast<Users*>(users);
return u->check_permissions(user, PERM_WRITE);
}
bool users_promote(USERS* users, const char* user)
{
Users* u = reinterpret_cast<Users*>(users);
return u->set_permissions(user, PERM_WRITE);
}
bool users_demote(USERS* users, const char* user)
{
Users* u = reinterpret_cast<Users*>(users);
return u->set_permissions(user, PERM_READ);
}
void users_diagnostic(DCB* dcb, USERS* users) void users_diagnostic(DCB* dcb, USERS* users)
{ {
Users* u = reinterpret_cast<Users*>(users); Users* u = reinterpret_cast<Users*>(users);