diff options
author | Dieter Hametner <dh (plus) vdr (at) gekrumbel (dot) de> | 2009-09-08 23:08:54 +0200 |
---|---|---|
committer | Dieter Hametner <dh (plus) vdr (at) gekrumbel (dot) de> | 2009-09-08 23:08:54 +0200 |
commit | fd1e4dad6f9ad3d95001b1785be3cfc56931fbe0 (patch) | |
tree | 481970923c38e41013a4f84d048acd0aba9fa053 /users.cpp | |
parent | 712a9120b4de6fd5fa349ed3e4c61b507553e638 (diff) | |
parent | 1a19a11081e56aff745ca0ba625187fabc54fb94 (diff) | |
download | vdr-plugin-live-fd1e4dad6f9ad3d95001b1785be3cfc56931fbe0.tar.gz vdr-plugin-live-fd1e4dad6f9ad3d95001b1785be3cfc56931fbe0.tar.bz2 |
Merge commit 'winni/master' into develcvs-commit-366
Diffstat (limited to 'users.cpp')
-rw-r--r-- | users.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/users.cpp b/users.cpp new file mode 100644 index 0000000..d68ec1c --- /dev/null +++ b/users.cpp @@ -0,0 +1,200 @@ +/* + * users.cpp: A plugin for the Video Disk Recorder + * + * See the README file for copyright information and how to reach the author. + * + * $Id: users.cpp,v 1.0 2009/08/27 13:00:00 winni Exp $ + */ + +#include "users.h" +#include <iostream> +#include <sstream> +#include "tools.h" +#include "setup.h" + +namespace vdrlive { + +using namespace std; + +std::string cUsers::logged_in_user; + +// -- cUser ----------------------------------------------------------------- +cUser::cUser(int ID, const std::string& Name, const std::string& Password) + : m_ID(ID), m_Name(Name) +{ + SetPassword(Password); +} + +void cUser::SetPassword(const std::string Password) +{ + ostringstream passwordStr; + passwordStr << Password.size() << "|" << MD5Hash(Password); + m_PasswordMD5 = passwordStr.str(); +} + +int cUser::GetPasswordLength() const +{ + // format is <length>:<md5-hash of password> + vector< string > parts = StringSplit( m_PasswordMD5, '|' ); + return (parts.size() > 0) ? lexical_cast< int >( parts[0] ) : 0; +} + +std::string const cUser::GetMD5HashPassword() const +{ + // format is <length>:<md5-hash of password> + vector< string > parts = StringSplit( m_PasswordMD5, '|' ); + return (parts.size() > 1) ? parts[1] : ""; +} + +bool cUser::Parse(const char *s) +{ + char *line; + char *pos; + char *pos_next; + int parameter = 1; + int valuelen; +#define MAXVALUELEN (10 * MaxFileName) + + char value[MAXVALUELEN]; + + pos = line = strdup(s); + pos_next = pos + strlen(pos); + if (*pos_next == '\n') *pos_next = 0; + while (*pos) { + while (*pos == ' ') pos++; + if (*pos) { + if (*pos != ':') { + pos_next = strchr(pos, ':'); + if (!pos_next) + pos_next = pos + strlen(pos); + valuelen = pos_next - pos + 1; + if (valuelen > MAXVALUELEN) + { + esyslog("entry '%s' is too long. Will be truncated!", pos); + valuelen = MAXVALUELEN; + } + strn0cpy(value, pos, valuelen); + pos = pos_next; + + switch (parameter) { + case 1: m_ID = lexical_cast< int >(value); + break; + case 2: m_Name = value; + break; + case 3: m_PasswordMD5 = value; + break; + case 4: + m_Userrights = lexical_cast< int >(value); + break; + default: + break; + } //switch + } + parameter++; + } + if (*pos) pos++; + } //while + + free(line); + return (parameter >= 4) ? true : false; +} + +const char *cUser::ToText(void) +{ + char* buffer = NULL; + asprintf(&buffer, "%d:%s:%s:%d", m_ID, m_Name.c_str(), m_PasswordMD5.c_str(), m_Userrights); + return buffer; +} + +bool cUser::Save(FILE *f) +{ + return fprintf(f, "%s\n", ToText()) > 0; +} + +bool cUser::HasRightTo(eUserRights right) +{ + return ((m_Userrights & (1 << (right-1))) != 0); +} + +bool cUser::CurrentUserHasRightTo(eUserRights right) +{ + if (!LiveSetup().UseAuth()) return true; + cUser* user = cUsers::GetByUserName(cUsers::logged_in_user); + return (cUsers::logged_in_user == LiveSetup().GetAdminLogin() || (user && (user->m_Userrights & (1 << (right-1))) != 0)); +} + +void cUser::SetRight(eUserRights right) +{ + isyslog("set right '%d' in '%d'", right, m_Userrights); + m_Userrights |= (1 << (right-1)); + isyslog("now rights are '%d'", m_Userrights); +} + +bool cUsers::Delete(const std::string& Name) +{ + cUser* user = Users.First(); + while (user) + { + if (user->Name() == Name) + { + Users.Del(user); + Users.Save(); + return true; + } + user = Users.Next(user); + } + return false; +} + +cUser* cUsers::GetByUserId(const std::string& Id) +{ + cUser* user = Users.First(); + while (user) + { + if (user->Id() == atoi(Id.c_str())) + return user; + user = Users.Next(user); + } + return NULL; +} + +cUser* cUsers::GetByUserName(const std::string& Name) +{ + cUser* user = Users.First(); + while (user) + { + if (user->Name() == Name) + return user; + user = Users.Next(user); + } + return NULL; +} + +int cUsers::GetNewId() +{ + int iMaxId = -1; + cUser* user = Users.First(); + while (user) + { + if (iMaxId < user->Id()) + iMaxId = user->Id(); + user = Users.Next(user); + } + return iMaxId + 1; +} + +bool cUsers::ValidUserLogin(const std::string& login, const std::string& password) +{ + cUser* user = GetByUserName(login); + if (user && MD5Hash(password) == user->GetMD5HashPassword()) + return true; + return false; +} + +bool cUsers::ValidLogin(const std::string& login, const std::string& password) +{ + return ((login == LiveSetup().GetAdminLogin() && MD5Hash(password) == LiveSetup().GetMD5HashAdminPassword()) || + ValidUserLogin(login, password)); +} + +} |