X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/bdd372a64811c52e2924c6d391ce6801aabc8ada..afcbfd1a09e22ff4839ba5db42047c96f355506c:/include/stg/user_property.h diff --git a/include/stg/user_property.h b/include/stg/user_property.h index ade21f4e..4a26b211 100644 --- a/include/stg/user_property.h +++ b/include/stg/user_property.h @@ -12,24 +12,34 @@ $Author: faust $ #include #include #include +#include #include #include +#include "stg/logger.h" +#include "stg/locker.h" +#include "stg/settings.h" +#include "stg/scriptexecuter.h" +#include "stg/common.h" + #include "store.h" #include "admin.h" #include "notifer.h" -#include "logger.h" -#include "locker.h" -#include "scriptexecuter.h" #include "noncopyable.h" -extern const volatile time_t stgTime; - +extern volatile time_t stgTime; +//----------------------------------------------------------------------------- +class USER_PROPERTY_BASE { +public: + virtual std::string ToString() const = 0; +}; +//----------------------------------------------------------------------------- +typedef std::map REGISTRY; //----------------------------------------------------------------------------- template -class USER_PROPERTY { +class USER_PROPERTY : public USER_PROPERTY_BASE { public: - USER_PROPERTY(varT & val); + explicit USER_PROPERTY(varT & val); virtual ~USER_PROPERTY(); void Set(const varT & rvalue); @@ -42,14 +52,15 @@ public: operator const varT&() const throw() { return value; } void AddBeforeNotifier(PROPERTY_NOTIFIER_BASE * n); - void DelBeforeNotifier(PROPERTY_NOTIFIER_BASE * n); + void DelBeforeNotifier(const PROPERTY_NOTIFIER_BASE * n); void AddAfterNotifier(PROPERTY_NOTIFIER_BASE * n); - void DelAfterNotifier(PROPERTY_NOTIFIER_BASE * n); + void DelAfterNotifier(const PROPERTY_NOTIFIER_BASE * n); time_t ModificationTime() const throw() { return modificationTime; } void ModifyTime() throw(); + std::string ToString() const; private: varT & value; time_t modificationTime; @@ -66,10 +77,12 @@ public: bool isPassword, bool isStat, STG_LOGGER & logger, - const std::string & sd); + const SETTINGS & s, + REGISTRY & properties); virtual ~USER_PROPERTY_LOGGED() {} USER_PROPERTY_LOGGED * GetPointer() throw() { return this; } + const USER_PROPERTY_LOGGED * GetPointer() const throw() { return this; } const varT & Get() const { return USER_PROPERTY::ConstData(); } const std::string & GetName() const { return name; } bool Set(const varT & val, @@ -100,7 +113,7 @@ private: bool isPassword; bool isStat; std::string name; - const std::string scriptsDir; + const SETTINGS& settings; }; //----------------------------------------------------------------------------- class USER_PROPERTIES : private NONCOPYABLE { @@ -116,8 +129,9 @@ private: USER_STAT stat; USER_CONF conf; + REGISTRY properties; public: - USER_PROPERTIES(const std::string & sd); + explicit USER_PROPERTIES(const SETTINGS& s); USER_STAT & Stat() { return stat; } USER_CONF & Conf() { return conf; } @@ -128,6 +142,9 @@ public: void SetProperties(const USER_PROPERTIES & p) { stat = p.stat; conf = p.conf; } + std::string GetPropertyValue(const std::string & name) const; + bool Exists(const std::string & name) const; + USER_PROPERTY_LOGGED cash; USER_PROPERTY_LOGGED up; USER_PROPERTY_LOGGED down; @@ -173,7 +190,10 @@ template inline USER_PROPERTY::USER_PROPERTY(varT & val) : value(val), - modificationTime(stgTime) + modificationTime(stgTime), + beforeNotifiers(), + afterNotifiers(), + mutex() { pthread_mutex_init(&mutex, NULL); } @@ -196,7 +216,7 @@ template inline void USER_PROPERTY::Set(const varT & rvalue) { -STG_LOCKER locker(&mutex, __FILE__, __LINE__); +STG_LOCKER locker(&mutex); typename std::set *>::iterator ni; @@ -226,32 +246,32 @@ template inline void USER_PROPERTY::AddBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) { -STG_LOCKER locker(&mutex, __FILE__, __LINE__); +STG_LOCKER locker(&mutex); beforeNotifiers.insert(n); } //----------------------------------------------------------------------------- template inline -void USER_PROPERTY::DelBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_PROPERTY::DelBeforeNotifier(const PROPERTY_NOTIFIER_BASE * n) { -STG_LOCKER locker(&mutex, __FILE__, __LINE__); -beforeNotifiers.erase(n); +STG_LOCKER locker(&mutex); +beforeNotifiers.erase(const_cast *>(n)); } //----------------------------------------------------------------------------- template inline void USER_PROPERTY::AddAfterNotifier(PROPERTY_NOTIFIER_BASE * n) { -STG_LOCKER locker(&mutex, __FILE__, __LINE__); +STG_LOCKER locker(&mutex); afterNotifiers.insert(n); } //----------------------------------------------------------------------------- template inline -void USER_PROPERTY::DelAfterNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_PROPERTY::DelAfterNotifier(const PROPERTY_NOTIFIER_BASE * n) { -STG_LOCKER locker(&mutex, __FILE__, __LINE__); -afterNotifiers.erase(n); +STG_LOCKER locker(&mutex); +afterNotifiers.erase(const_cast *>(n)); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -263,15 +283,17 @@ USER_PROPERTY_LOGGED::USER_PROPERTY_LOGGED(varT & val, bool isPass, bool isSt, STG_LOGGER & logger, - const std::string & sd) + const SETTINGS& s, + REGISTRY & properties) : USER_PROPERTY(val), stgLogger(logger), isPassword(isPass), isStat(isSt), name(n), - scriptsDir(sd) + settings(s) { +properties.insert(std::make_pair(ToLower(name), this)); } //------------------------------------------------------------------------- template @@ -282,8 +304,6 @@ bool USER_PROPERTY_LOGGED::Set(const varT & val, 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) || @@ -293,8 +313,8 @@ if ((priv->userConf && !isStat) || std::stringstream oldVal; std::stringstream newVal; - oldVal.flags(oldVal.flags() | ios::fixed); - newVal.flags(newVal.flags() | ios::fixed); + oldVal.flags(oldVal.flags() | std::ios::fixed); + newVal.flags(newVal.flags() | std::ios::fixed); oldVal << USER_PROPERTY::ConstData(); newVal << val; @@ -348,7 +368,12 @@ stgLogger("%s User \'%s\': \'%s\' parameter changed from \'%s\' to \'%s\'. %s", newValue.c_str(), msg.c_str()); -store->WriteUserChgLog(login, admin->GetLogin(), admin->GetIP(), parameter, oldValue, newValue, msg); +for (size_t i = 0; i < settings.GetFilterParamsLog().size(); ++i) + if (settings.GetFilterParamsLog()[i] == "*" || strcasecmp(settings.GetFilterParamsLog()[i].c_str(), parameter.c_str()) == 0) + { + store->WriteUserChgLog(login, admin->GetLogin(), admin->GetIP(), parameter, oldValue, newValue, msg); + return; + } } //------------------------------------------------------------------------- template @@ -358,7 +383,7 @@ void USER_PROPERTY_LOGGED::OnChange(const std::string & login, const std::string & newValue, const ADMIN * admin) { -std::string filePath = scriptsDir + "/OnChange"; +static std::string filePath = settings.GetScriptsDir() + "/OnChange"; if (access(filePath.c_str(), X_OK) == 0) { @@ -373,12 +398,36 @@ else //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- +inline +std::string USER_PROPERTIES::GetPropertyValue(const std::string & name) const +{ +REGISTRY::const_iterator it = properties.find(ToLower(name)); +if (it == properties.end()) + return ""; +return it->second->ToString(); +} +//----------------------------------------------------------------------------- +inline +bool USER_PROPERTIES::Exists(const std::string & name) const +{ +return properties.find(ToLower(name)) != properties.end(); +} +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- template inline -ostream & operator<< (ostream & stream, const USER_PROPERTY & value) +std::ostream & operator<< (std::ostream & stream, const USER_PROPERTY & value) { return stream << value.ConstData(); } //----------------------------------------------------------------------------- - +template +inline +std::string USER_PROPERTY::ToString() const +{ +std::ostringstream stream; +stream << value; +return stream.str(); +} #endif // USER_PROPERTY_H