From: Maxim Mamontov Date: Mon, 21 Mar 2011 12:40:53 +0000 (+0200) Subject: user_property.h moved to general include dir X-Git-Tag: 2.407-rc3~136 X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/9596c437646f369c3924dc78b20872762f3a47b9?ds=inline user_property.h moved to general include dir --- diff --git a/include/user_property.h b/include/user_property.h new file mode 100644 index 00000000..b269389a --- /dev/null +++ b/include/user_property.h @@ -0,0 +1,420 @@ +/* +$Revision: 1.44 $ +$Date: 2010/09/13 05:54:43 $ +$Author: faust $ +*/ + +#ifndef USER_PROPERTY_H +#define USER_PROPERTY_H + +#include +#include +#include +#include +#include + +#include "store.h" +#include "admin.h" +#include "notifer.h" +#include "stg_logger.h" +#include "stg_locker.h" +#include "script_executer.h" + +extern const volatile time_t stgTime; + +//----------------------------------------------------------------------------- +template +class USER_PROPERTY { +public: + USER_PROPERTY(varT & val); + virtual ~USER_PROPERTY(); + + void Set(const varT & rvalue); + + USER_PROPERTY & operator= (const varT & rvalue); + USER_PROPERTY & operator-= (const varT & rvalue); + + const varT * operator&() const throw(); + const varT & ConstData() const throw(); + + operator const varT&() const throw() + { + return value; + } + + void AddBeforeNotifier(PROPERTY_NOTIFIER_BASE * n); + void DelBeforeNotifier(PROPERTY_NOTIFIER_BASE * n); + + void AddAfterNotifier(PROPERTY_NOTIFIER_BASE * n); + void DelAfterNotifier(PROPERTY_NOTIFIER_BASE * n); + + time_t ModificationTime() const throw(); + void ModifyTime() throw(); + +private: + varT & value; + time_t modificationTime; + std::set *> beforeNotifiers; + std::set *> afterNotifiers; + pthread_mutex_t mutex; +}; +//----------------------------------------------------------------------------- +template +class USER_PROPERTY_LOGGED: public USER_PROPERTY { +public: + USER_PROPERTY_LOGGED(varT & val, + const std::string n, + bool isPassword, + bool isStat, + STG_LOGGER & logger, + const std::string & sd); + virtual ~USER_PROPERTY_LOGGED(); + + USER_PROPERTY_LOGGED * GetPointer() throw(); + const varT & Get() const; + const std::string & GetName() const; + bool Set(const varT & val, + const ADMIN * admin, + const std::string & login, + const STORE * store, + const std::string & msg = ""); +private: + void WriteAccessDenied(const std::string & login, + const ADMIN * admin, + const std::string & parameter); + + void WriteSuccessChange(const std::string & login, + const ADMIN * admin, + const std::string & parameter, + const std::string & oldValue, + const std::string & newValue, + const std::string & msg, + const STORE * store); + + void OnChange(const std::string & login, + const std::string & paramName, + const std::string & oldValue, + const std::string & newValue, + const ADMIN * admin); + + STG_LOGGER & stgLogger; + bool isPassword; + bool isStat; + std::string name; + const std::string scriptsDir; +}; +//----------------------------------------------------------------------------- +class USER_PROPERTIES { +/* + В этом месте важен порядок следования приватной и открытой частей. + Это связано с тем, что часть которая находится в публичной секции + по сути является завуалированной ссылкой на закрытую часть. Т.о. нам нужно + чтобы конструкторы из закрытой части вызвались раньше открытой. Поэтомому в + начале идет закрытая секция + * */ + +private: + USER_STAT stat; + USER_CONF conf; + +public: + USER_PROPERTIES(const std::string & sd); + + USER_STAT & Stat() { return stat; } + USER_CONF & Conf() { return conf; } + const USER_STAT & GetStat() const { return stat; } + const USER_CONF & GetConf() const { return conf; } + void SetStat(const USER_STAT & s) { stat = s; } + void SetConf(const USER_CONF & c) { conf = c; } + + void SetProperties(const USER_PROPERTIES & p) { stat = p.stat; conf = p.conf; } + + USER_PROPERTY_LOGGED cash; + USER_PROPERTY_LOGGED up; + USER_PROPERTY_LOGGED down; + USER_PROPERTY_LOGGED lastCashAdd; + USER_PROPERTY_LOGGED passiveTime; + USER_PROPERTY_LOGGED lastCashAddTime; + USER_PROPERTY_LOGGED freeMb; + USER_PROPERTY_LOGGED lastActivityTime; + + USER_PROPERTY_LOGGED password; + USER_PROPERTY_LOGGED passive; + USER_PROPERTY_LOGGED disabled; + USER_PROPERTY_LOGGED disabledDetailStat; + USER_PROPERTY_LOGGED alwaysOnline; + USER_PROPERTY_LOGGED tariffName; + USER_PROPERTY_LOGGED nextTariff; + USER_PROPERTY_LOGGED address; + USER_PROPERTY_LOGGED note; + USER_PROPERTY_LOGGED group; + USER_PROPERTY_LOGGED email; + USER_PROPERTY_LOGGED phone; + USER_PROPERTY_LOGGED realName; + USER_PROPERTY_LOGGED credit; + USER_PROPERTY_LOGGED creditExpire; + USER_PROPERTY_LOGGED ips; + USER_PROPERTY_LOGGED userdata0; + USER_PROPERTY_LOGGED userdata1; + USER_PROPERTY_LOGGED userdata2; + USER_PROPERTY_LOGGED userdata3; + USER_PROPERTY_LOGGED userdata4; + USER_PROPERTY_LOGGED userdata5; + USER_PROPERTY_LOGGED userdata6; + USER_PROPERTY_LOGGED userdata7; + USER_PROPERTY_LOGGED userdata8; + USER_PROPERTY_LOGGED userdata9; +}; +//============================================================================= + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +template +USER_PROPERTY::USER_PROPERTY(varT & val) + : value(val) +{ +pthread_mutex_init(&mutex, NULL); +modificationTime = stgTime; +} +//----------------------------------------------------------------------------- +template +USER_PROPERTY::~USER_PROPERTY() +{ +} +//----------------------------------------------------------------------------- +template +void USER_PROPERTY::ModifyTime() throw() +{ +modificationTime = stgTime; +} +//----------------------------------------------------------------------------- +template +void USER_PROPERTY::Set(const varT & rvalue) +{ +STG_LOCKER locker(&mutex, __FILE__, __LINE__); + +typename std::set *>::iterator ni; + +varT oldVal = value; + +ni = beforeNotifiers.begin(); +while (ni != beforeNotifiers.end()) + (*ni++)->Notify(oldVal, rvalue); + +value = rvalue; +modificationTime = stgTime; + +ni = afterNotifiers.begin(); +while (ni != afterNotifiers.end()) + (*ni++)->Notify(oldVal, rvalue); +} +//----------------------------------------------------------------------------- +template +USER_PROPERTY & USER_PROPERTY::operator= (const varT & newValue) +{ +Set(newValue); +return *this; +} +//----------------------------------------------------------------------------- +template +USER_PROPERTY& USER_PROPERTY::operator-= (const varT & delta) +{ +varT newValue = ConstData() - delta; +Set(newValue); +return *this; +} +//----------------------------------------------------------------------------- +template +const varT * USER_PROPERTY::operator&() const throw() +{ +return &value; +} +//----------------------------------------------------------------------------- +template +const varT & USER_PROPERTY::ConstData() const throw() +{ +return value; +} +//----------------------------------------------------------------------------- +template +void USER_PROPERTY::AddBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) +{ +STG_LOCKER locker(&mutex, __FILE__, __LINE__); +beforeNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +template +void USER_PROPERTY::DelBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) +{ +STG_LOCKER locker(&mutex, __FILE__, __LINE__); +beforeNotifiers.erase(n); +} +//----------------------------------------------------------------------------- +template +void USER_PROPERTY::AddAfterNotifier(PROPERTY_NOTIFIER_BASE * n) +{ +STG_LOCKER locker(&mutex, __FILE__, __LINE__); +afterNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +template +void USER_PROPERTY::DelAfterNotifier(PROPERTY_NOTIFIER_BASE * n) +{ +STG_LOCKER locker(&mutex, __FILE__, __LINE__); +afterNotifiers.erase(n); +} +//----------------------------------------------------------------------------- +template +time_t USER_PROPERTY::ModificationTime() const throw() +{ +return modificationTime; +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +template +USER_PROPERTY_LOGGED::USER_PROPERTY_LOGGED(varT & val, + std::string n, + bool isPass, + bool isSt, + STG_LOGGER & logger, + const std::string & sd) + + : USER_PROPERTY(val), + stgLogger(logger), + isPassword(isPass), + isStat(isSt), + name(n), + scriptsDir(sd) +{ +} +//----------------------------------------------------------------------------- +template +USER_PROPERTY_LOGGED::~USER_PROPERTY_LOGGED() +{ +} +//----------------------------------------------------------------------------- +template +USER_PROPERTY_LOGGED * USER_PROPERTY_LOGGED::GetPointer() throw() +{ +return this; +} +//----------------------------------------------------------------------------- +template +const varT & USER_PROPERTY_LOGGED::Get() const +{ +return USER_PROPERTY::ConstData(); +}; +//------------------------------------------------------------------------- +template +const std::string & USER_PROPERTY_LOGGED::GetName() const +{ +return name; +}; +//------------------------------------------------------------------------- +template +bool USER_PROPERTY_LOGGED::Set(const varT & val, + const ADMIN * admin, + const std::string & login, + const STORE * store, + const std::string & msg) +{ +const PRIV * priv = admin->GetPriv(); +std::string adm_login = admin->GetLogin(); +std::string adm_ip = admin->GetIPStr(); + +if ((priv->userConf && !isStat) || + (priv->userStat && isStat) || + (priv->userPasswd && isPassword) || + (priv->userCash && name == "cash")) + { + stringstream oldVal; + stringstream newVal; + + oldVal.flags(oldVal.flags() | ios::fixed); + newVal.flags(newVal.flags() | ios::fixed); + + oldVal << USER_PROPERTY::ConstData(); + newVal << val; + + OnChange(login, name, oldVal.str(), newVal.str(), admin); + + if (isPassword) + { + WriteSuccessChange(login, admin, name, "******", "******", msg, store); + } + else + { + WriteSuccessChange(login, admin, name, oldVal.str(), newVal.str(), msg, store); + } + USER_PROPERTY::Set(val); + return true; + } +else + { + WriteAccessDenied(login, admin, name); + return false; + } +return true; +} +//------------------------------------------------------------------------- +template +void USER_PROPERTY_LOGGED::WriteAccessDenied(const std::string & login, + const ADMIN * admin, + const std::string & parameter) +{ +stgLogger("%s Change user \'%s.\' Parameter \'%s\'. Access denied.", + admin->GetLogStr().c_str(), login.c_str(), parameter.c_str()); +} +//------------------------------------------------------------------------- +template +void USER_PROPERTY_LOGGED::WriteSuccessChange(const std::string & login, + const ADMIN * admin, + const std::string & parameter, + const std::string & oldValue, + const std::string & newValue, + const std::string & msg, + const STORE * store) +{ +stgLogger("%s User \'%s\': \'%s\' parameter changed from \'%s\' to \'%s\'. %s", + admin->GetLogStr().c_str(), + login.c_str(), + parameter.c_str(), + oldValue.c_str(), + newValue.c_str(), + msg.c_str()); + +store->WriteUserChgLog(login, admin->GetLogin(), admin->GetIP(), parameter, oldValue, newValue, msg); +} +//------------------------------------------------------------------------- +template +void USER_PROPERTY_LOGGED::OnChange(const std::string & login, + const std::string & paramName, + const std::string & oldValue, + const std::string & newValue, + const ADMIN * admin) +{ +std::string filePath = scriptsDir + "/OnChange"; + +if (access(filePath.c_str(), X_OK) == 0) + { + std::string execString("\"" + filePath + "\" \"" + login + "\" \"" + paramName + "\" \"" + oldValue + "\" \"" + newValue + "\" \"" + admin->GetLogin() + "\" \"" + admin->GetIPStr() + "\""); + ScriptExec(execString); + } +else + { + stgLogger("Script OnChange cannot be executed. File %s not found.", filePath.c_str()); + } +} +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- +template +ostream & operator<< (ostream & stream, const USER_PROPERTY & value) +{ +return stream << value.ConstData(); +} +//----------------------------------------------------------------------------- + +#endif // USER_PROPERTY_H diff --git a/projects/stargazer/plugins/authorization/ao/ao.cpp b/projects/stargazer/plugins/authorization/ao/ao.cpp index b59bd58c..811807de 100644 --- a/projects/stargazer/plugins/authorization/ao/ao.cpp +++ b/projects/stargazer/plugins/authorization/ao/ao.cpp @@ -31,7 +31,7 @@ $Author: faust $ #include "ao.h" #include "user.h" #include "users.h" -#include "../../../user_property.h" +#include "user_property.h" #include "../../../eventloop.h" class AO_CREATOR diff --git a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp index b3d8823e..4e60829d 100644 --- a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp +++ b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp @@ -41,8 +41,8 @@ #include "common.h" #include "stg_locker.h" #include "tariff.h" +#include "user_property.h" #include "../../../settings.h" -#include "../../../user_property.h" extern volatile const time_t stgTime; diff --git a/projects/stargazer/plugins/configuration/rpcconfig/user_helper.cpp b/projects/stargazer/plugins/configuration/rpcconfig/user_helper.cpp index a557b677..30205c92 100644 --- a/projects/stargazer/plugins/configuration/rpcconfig/user_helper.cpp +++ b/projects/stargazer/plugins/configuration/rpcconfig/user_helper.cpp @@ -6,8 +6,7 @@ #include "user_ips.h" #include "utils.h" #include "common.h" - -#include "../../../user_property.h" +#include "user_property.h" //------------------------------------------------------------------------------ diff --git a/projects/stargazer/plugins/configuration/rpcconfig/users_methods.cpp b/projects/stargazer/plugins/configuration/rpcconfig/users_methods.cpp index d16d883f..296a7c7b 100644 --- a/projects/stargazer/plugins/configuration/rpcconfig/users_methods.cpp +++ b/projects/stargazer/plugins/configuration/rpcconfig/users_methods.cpp @@ -5,13 +5,13 @@ #include "users.h" #include "admins.h" #include "tariffs.h" -#include "../../../user_property.h" #include "rpcconfig.h" #include "user_helper.h" #include "user_ips.h" #include "utils.h" #include "common.h" +#include "user_property.h" //------------------------------------------------------------------------------ diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser.cpp b/projects/stargazer/plugins/configuration/sgconfig/parser.cpp index b90cb2b6..8a01f169 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/parser.cpp @@ -12,8 +12,8 @@ #include "parser.h" #include "version.h" #include "tariffs.h" +#include "user_property.h" #include "../../../settings.h" -#include "../../../user_property.h" #define UNAME_LEN (256) //----------------------------------------------------------------------------- diff --git a/projects/stargazer/plugins/other/ping/ping.cpp b/projects/stargazer/plugins/other/ping/ping.cpp index 3067e87e..169ac61d 100644 --- a/projects/stargazer/plugins/other/ping/ping.cpp +++ b/projects/stargazer/plugins/other/ping/ping.cpp @@ -7,8 +7,8 @@ #include "ping.h" #include "user.h" #include "stg_locker.h" +#include "user_property.h" #include "../../../settings.h" -#include "../../../user_property.h" class PING_CREATOR { diff --git a/projects/stargazer/plugins/other/radius/radius.cpp b/projects/stargazer/plugins/other/radius/radius.cpp index c3fb7183..a4eea3a8 100644 --- a/projects/stargazer/plugins/other/radius/radius.cpp +++ b/projects/stargazer/plugins/other/radius/radius.cpp @@ -34,7 +34,7 @@ #include "store.h" #include "common.h" #include "user_conf.h" -#include "../../../user_property.h" +#include "user_property.h" extern volatile const time_t stgTime; diff --git a/projects/stargazer/plugins/other/rscript/rscript.cpp b/projects/stargazer/plugins/other/rscript/rscript.cpp index 1cc7883b..a772e507 100644 --- a/projects/stargazer/plugins/other/rscript/rscript.cpp +++ b/projects/stargazer/plugins/other/rscript/rscript.cpp @@ -36,7 +36,7 @@ #include "ur_functor.h" #include "send_functor.h" #include "stg_locker.h" -#include "../../../user_property.h" +#include "user_property.h" extern volatile const time_t stgTime; diff --git a/projects/stargazer/user_property.h b/projects/stargazer/user_property.h deleted file mode 100644 index b269389a..00000000 --- a/projects/stargazer/user_property.h +++ /dev/null @@ -1,420 +0,0 @@ -/* -$Revision: 1.44 $ -$Date: 2010/09/13 05:54:43 $ -$Author: faust $ -*/ - -#ifndef USER_PROPERTY_H -#define USER_PROPERTY_H - -#include -#include -#include -#include -#include - -#include "store.h" -#include "admin.h" -#include "notifer.h" -#include "stg_logger.h" -#include "stg_locker.h" -#include "script_executer.h" - -extern const volatile time_t stgTime; - -//----------------------------------------------------------------------------- -template -class USER_PROPERTY { -public: - USER_PROPERTY(varT & val); - virtual ~USER_PROPERTY(); - - void Set(const varT & rvalue); - - USER_PROPERTY & operator= (const varT & rvalue); - USER_PROPERTY & operator-= (const varT & rvalue); - - const varT * operator&() const throw(); - const varT & ConstData() const throw(); - - operator const varT&() const throw() - { - return value; - } - - void AddBeforeNotifier(PROPERTY_NOTIFIER_BASE * n); - void DelBeforeNotifier(PROPERTY_NOTIFIER_BASE * n); - - void AddAfterNotifier(PROPERTY_NOTIFIER_BASE * n); - void DelAfterNotifier(PROPERTY_NOTIFIER_BASE * n); - - time_t ModificationTime() const throw(); - void ModifyTime() throw(); - -private: - varT & value; - time_t modificationTime; - std::set *> beforeNotifiers; - std::set *> afterNotifiers; - pthread_mutex_t mutex; -}; -//----------------------------------------------------------------------------- -template -class USER_PROPERTY_LOGGED: public USER_PROPERTY { -public: - USER_PROPERTY_LOGGED(varT & val, - const std::string n, - bool isPassword, - bool isStat, - STG_LOGGER & logger, - const std::string & sd); - virtual ~USER_PROPERTY_LOGGED(); - - USER_PROPERTY_LOGGED * GetPointer() throw(); - const varT & Get() const; - const std::string & GetName() const; - bool Set(const varT & val, - const ADMIN * admin, - const std::string & login, - const STORE * store, - const std::string & msg = ""); -private: - void WriteAccessDenied(const std::string & login, - const ADMIN * admin, - const std::string & parameter); - - void WriteSuccessChange(const std::string & login, - const ADMIN * admin, - const std::string & parameter, - const std::string & oldValue, - const std::string & newValue, - const std::string & msg, - const STORE * store); - - void OnChange(const std::string & login, - const std::string & paramName, - const std::string & oldValue, - const std::string & newValue, - const ADMIN * admin); - - STG_LOGGER & stgLogger; - bool isPassword; - bool isStat; - std::string name; - const std::string scriptsDir; -}; -//----------------------------------------------------------------------------- -class USER_PROPERTIES { -/* - В этом месте важен порядок следования приватной и открытой частей. - Это связано с тем, что часть которая находится в публичной секции - по сути является завуалированной ссылкой на закрытую часть. Т.о. нам нужно - чтобы конструкторы из закрытой части вызвались раньше открытой. Поэтомому в - начале идет закрытая секция - * */ - -private: - USER_STAT stat; - USER_CONF conf; - -public: - USER_PROPERTIES(const std::string & sd); - - USER_STAT & Stat() { return stat; } - USER_CONF & Conf() { return conf; } - const USER_STAT & GetStat() const { return stat; } - const USER_CONF & GetConf() const { return conf; } - void SetStat(const USER_STAT & s) { stat = s; } - void SetConf(const USER_CONF & c) { conf = c; } - - void SetProperties(const USER_PROPERTIES & p) { stat = p.stat; conf = p.conf; } - - USER_PROPERTY_LOGGED cash; - USER_PROPERTY_LOGGED up; - USER_PROPERTY_LOGGED down; - USER_PROPERTY_LOGGED lastCashAdd; - USER_PROPERTY_LOGGED passiveTime; - USER_PROPERTY_LOGGED lastCashAddTime; - USER_PROPERTY_LOGGED freeMb; - USER_PROPERTY_LOGGED lastActivityTime; - - USER_PROPERTY_LOGGED password; - USER_PROPERTY_LOGGED passive; - USER_PROPERTY_LOGGED disabled; - USER_PROPERTY_LOGGED disabledDetailStat; - USER_PROPERTY_LOGGED alwaysOnline; - USER_PROPERTY_LOGGED tariffName; - USER_PROPERTY_LOGGED nextTariff; - USER_PROPERTY_LOGGED address; - USER_PROPERTY_LOGGED note; - USER_PROPERTY_LOGGED group; - USER_PROPERTY_LOGGED email; - USER_PROPERTY_LOGGED phone; - USER_PROPERTY_LOGGED realName; - USER_PROPERTY_LOGGED credit; - USER_PROPERTY_LOGGED creditExpire; - USER_PROPERTY_LOGGED ips; - USER_PROPERTY_LOGGED userdata0; - USER_PROPERTY_LOGGED userdata1; - USER_PROPERTY_LOGGED userdata2; - USER_PROPERTY_LOGGED userdata3; - USER_PROPERTY_LOGGED userdata4; - USER_PROPERTY_LOGGED userdata5; - USER_PROPERTY_LOGGED userdata6; - USER_PROPERTY_LOGGED userdata7; - USER_PROPERTY_LOGGED userdata8; - USER_PROPERTY_LOGGED userdata9; -}; -//============================================================================= - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -template -USER_PROPERTY::USER_PROPERTY(varT & val) - : value(val) -{ -pthread_mutex_init(&mutex, NULL); -modificationTime = stgTime; -} -//----------------------------------------------------------------------------- -template -USER_PROPERTY::~USER_PROPERTY() -{ -} -//----------------------------------------------------------------------------- -template -void USER_PROPERTY::ModifyTime() throw() -{ -modificationTime = stgTime; -} -//----------------------------------------------------------------------------- -template -void USER_PROPERTY::Set(const varT & rvalue) -{ -STG_LOCKER locker(&mutex, __FILE__, __LINE__); - -typename std::set *>::iterator ni; - -varT oldVal = value; - -ni = beforeNotifiers.begin(); -while (ni != beforeNotifiers.end()) - (*ni++)->Notify(oldVal, rvalue); - -value = rvalue; -modificationTime = stgTime; - -ni = afterNotifiers.begin(); -while (ni != afterNotifiers.end()) - (*ni++)->Notify(oldVal, rvalue); -} -//----------------------------------------------------------------------------- -template -USER_PROPERTY & USER_PROPERTY::operator= (const varT & newValue) -{ -Set(newValue); -return *this; -} -//----------------------------------------------------------------------------- -template -USER_PROPERTY& USER_PROPERTY::operator-= (const varT & delta) -{ -varT newValue = ConstData() - delta; -Set(newValue); -return *this; -} -//----------------------------------------------------------------------------- -template -const varT * USER_PROPERTY::operator&() const throw() -{ -return &value; -} -//----------------------------------------------------------------------------- -template -const varT & USER_PROPERTY::ConstData() const throw() -{ -return value; -} -//----------------------------------------------------------------------------- -template -void USER_PROPERTY::AddBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) -{ -STG_LOCKER locker(&mutex, __FILE__, __LINE__); -beforeNotifiers.insert(n); -} -//----------------------------------------------------------------------------- -template -void USER_PROPERTY::DelBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) -{ -STG_LOCKER locker(&mutex, __FILE__, __LINE__); -beforeNotifiers.erase(n); -} -//----------------------------------------------------------------------------- -template -void USER_PROPERTY::AddAfterNotifier(PROPERTY_NOTIFIER_BASE * n) -{ -STG_LOCKER locker(&mutex, __FILE__, __LINE__); -afterNotifiers.insert(n); -} -//----------------------------------------------------------------------------- -template -void USER_PROPERTY::DelAfterNotifier(PROPERTY_NOTIFIER_BASE * n) -{ -STG_LOCKER locker(&mutex, __FILE__, __LINE__); -afterNotifiers.erase(n); -} -//----------------------------------------------------------------------------- -template -time_t USER_PROPERTY::ModificationTime() const throw() -{ -return modificationTime; -} -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -template -USER_PROPERTY_LOGGED::USER_PROPERTY_LOGGED(varT & val, - std::string n, - bool isPass, - bool isSt, - STG_LOGGER & logger, - const std::string & sd) - - : USER_PROPERTY(val), - stgLogger(logger), - isPassword(isPass), - isStat(isSt), - name(n), - scriptsDir(sd) -{ -} -//----------------------------------------------------------------------------- -template -USER_PROPERTY_LOGGED::~USER_PROPERTY_LOGGED() -{ -} -//----------------------------------------------------------------------------- -template -USER_PROPERTY_LOGGED * USER_PROPERTY_LOGGED::GetPointer() throw() -{ -return this; -} -//----------------------------------------------------------------------------- -template -const varT & USER_PROPERTY_LOGGED::Get() const -{ -return USER_PROPERTY::ConstData(); -}; -//------------------------------------------------------------------------- -template -const std::string & USER_PROPERTY_LOGGED::GetName() const -{ -return name; -}; -//------------------------------------------------------------------------- -template -bool USER_PROPERTY_LOGGED::Set(const varT & val, - const ADMIN * admin, - const std::string & login, - const STORE * store, - const std::string & msg) -{ -const PRIV * priv = admin->GetPriv(); -std::string adm_login = admin->GetLogin(); -std::string adm_ip = admin->GetIPStr(); - -if ((priv->userConf && !isStat) || - (priv->userStat && isStat) || - (priv->userPasswd && isPassword) || - (priv->userCash && name == "cash")) - { - stringstream oldVal; - stringstream newVal; - - oldVal.flags(oldVal.flags() | ios::fixed); - newVal.flags(newVal.flags() | ios::fixed); - - oldVal << USER_PROPERTY::ConstData(); - newVal << val; - - OnChange(login, name, oldVal.str(), newVal.str(), admin); - - if (isPassword) - { - WriteSuccessChange(login, admin, name, "******", "******", msg, store); - } - else - { - WriteSuccessChange(login, admin, name, oldVal.str(), newVal.str(), msg, store); - } - USER_PROPERTY::Set(val); - return true; - } -else - { - WriteAccessDenied(login, admin, name); - return false; - } -return true; -} -//------------------------------------------------------------------------- -template -void USER_PROPERTY_LOGGED::WriteAccessDenied(const std::string & login, - const ADMIN * admin, - const std::string & parameter) -{ -stgLogger("%s Change user \'%s.\' Parameter \'%s\'. Access denied.", - admin->GetLogStr().c_str(), login.c_str(), parameter.c_str()); -} -//------------------------------------------------------------------------- -template -void USER_PROPERTY_LOGGED::WriteSuccessChange(const std::string & login, - const ADMIN * admin, - const std::string & parameter, - const std::string & oldValue, - const std::string & newValue, - const std::string & msg, - const STORE * store) -{ -stgLogger("%s User \'%s\': \'%s\' parameter changed from \'%s\' to \'%s\'. %s", - admin->GetLogStr().c_str(), - login.c_str(), - parameter.c_str(), - oldValue.c_str(), - newValue.c_str(), - msg.c_str()); - -store->WriteUserChgLog(login, admin->GetLogin(), admin->GetIP(), parameter, oldValue, newValue, msg); -} -//------------------------------------------------------------------------- -template -void USER_PROPERTY_LOGGED::OnChange(const std::string & login, - const std::string & paramName, - const std::string & oldValue, - const std::string & newValue, - const ADMIN * admin) -{ -std::string filePath = scriptsDir + "/OnChange"; - -if (access(filePath.c_str(), X_OK) == 0) - { - std::string execString("\"" + filePath + "\" \"" + login + "\" \"" + paramName + "\" \"" + oldValue + "\" \"" + newValue + "\" \"" + admin->GetLogin() + "\" \"" + admin->GetIPStr() + "\""); - ScriptExec(execString); - } -else - { - stgLogger("Script OnChange cannot be executed. File %s not found.", filePath.c_str()); - } -} -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -//------------------------------------------------------------------------- -template -ostream & operator<< (ostream & stream, const USER_PROPERTY & value) -{ -return stream << value.ConstData(); -} -//----------------------------------------------------------------------------- - -#endif // USER_PROPERTY_H