]> git.stg.codes - stg.git/commitdiff
user_property.h moved to general include dir
authorMaxim Mamontov <faust.madf@gmail.com>
Mon, 21 Mar 2011 12:40:53 +0000 (14:40 +0200)
committerMaxim Mamontov <faust.madf@gmail.com>
Mon, 21 Mar 2011 12:40:53 +0000 (14:40 +0200)
include/user_property.h [new file with mode: 0644]
projects/stargazer/plugins/authorization/ao/ao.cpp
projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp
projects/stargazer/plugins/configuration/rpcconfig/user_helper.cpp
projects/stargazer/plugins/configuration/rpcconfig/users_methods.cpp
projects/stargazer/plugins/configuration/sgconfig/parser.cpp
projects/stargazer/plugins/other/ping/ping.cpp
projects/stargazer/plugins/other/radius/radius.cpp
projects/stargazer/plugins/other/rscript/rscript.cpp
projects/stargazer/user_property.h [deleted file]

diff --git a/include/user_property.h b/include/user_property.h
new file mode 100644 (file)
index 0000000..b269389
--- /dev/null
@@ -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 <ctime>
+#include <string>
+#include <set>
+#include <sstream>
+#include <iostream>
+
+#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<typename varT>
+class USER_PROPERTY {
+public:
+    USER_PROPERTY(varT & val);
+    virtual ~USER_PROPERTY();
+
+    void Set(const varT & rvalue);
+
+    USER_PROPERTY<varT> & operator= (const varT & rvalue);
+    USER_PROPERTY<varT> & 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<varT> * n);
+    void    DelBeforeNotifier(PROPERTY_NOTIFIER_BASE<varT> * n);
+
+    void    AddAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n);
+    void    DelAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n);
+
+    time_t  ModificationTime() const throw();
+    void    ModifyTime() throw();
+
+private:
+    varT & value;
+    time_t modificationTime;
+    std::set<PROPERTY_NOTIFIER_BASE<varT> *> beforeNotifiers;
+    std::set<PROPERTY_NOTIFIER_BASE<varT> *> afterNotifiers;
+    pthread_mutex_t mutex;
+};
+//-----------------------------------------------------------------------------
+template<typename varT>
+class USER_PROPERTY_LOGGED: public USER_PROPERTY<varT> {
+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<varT> * 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<double>            cash;
+    USER_PROPERTY_LOGGED<DIR_TRAFF>         up;
+    USER_PROPERTY_LOGGED<DIR_TRAFF>         down;
+    USER_PROPERTY_LOGGED<double>            lastCashAdd;
+    USER_PROPERTY_LOGGED<time_t>            passiveTime;
+    USER_PROPERTY_LOGGED<time_t>            lastCashAddTime;
+    USER_PROPERTY_LOGGED<double>            freeMb;
+    USER_PROPERTY_LOGGED<time_t>            lastActivityTime;
+
+    USER_PROPERTY_LOGGED<std::string>       password;
+    USER_PROPERTY_LOGGED<int>               passive;
+    USER_PROPERTY_LOGGED<int>               disabled;
+    USER_PROPERTY_LOGGED<int>               disabledDetailStat;
+    USER_PROPERTY_LOGGED<int>               alwaysOnline;
+    USER_PROPERTY_LOGGED<std::string>       tariffName;
+    USER_PROPERTY_LOGGED<std::string>       nextTariff;
+    USER_PROPERTY_LOGGED<std::string>       address;
+    USER_PROPERTY_LOGGED<std::string>       note;
+    USER_PROPERTY_LOGGED<std::string>       group;
+    USER_PROPERTY_LOGGED<std::string>       email;
+    USER_PROPERTY_LOGGED<std::string>       phone;
+    USER_PROPERTY_LOGGED<std::string>       realName;
+    USER_PROPERTY_LOGGED<double>            credit;
+    USER_PROPERTY_LOGGED<time_t>            creditExpire;
+    USER_PROPERTY_LOGGED<USER_IPS>          ips;
+    USER_PROPERTY_LOGGED<std::string>       userdata0;
+    USER_PROPERTY_LOGGED<std::string>       userdata1;
+    USER_PROPERTY_LOGGED<std::string>       userdata2;
+    USER_PROPERTY_LOGGED<std::string>       userdata3;
+    USER_PROPERTY_LOGGED<std::string>       userdata4;
+    USER_PROPERTY_LOGGED<std::string>       userdata5;
+    USER_PROPERTY_LOGGED<std::string>       userdata6;
+    USER_PROPERTY_LOGGED<std::string>       userdata7;
+    USER_PROPERTY_LOGGED<std::string>       userdata8;
+    USER_PROPERTY_LOGGED<std::string>       userdata9;
+};
+//=============================================================================
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <typename varT>
+USER_PROPERTY<varT>::USER_PROPERTY(varT & val)
+    : value(val)
+{
+pthread_mutex_init(&mutex, NULL);
+modificationTime = stgTime;
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+USER_PROPERTY<varT>::~USER_PROPERTY()
+{
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+void USER_PROPERTY<varT>::ModifyTime() throw()
+{
+modificationTime = stgTime;
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+void USER_PROPERTY<varT>::Set(const varT & rvalue)
+{
+STG_LOCKER locker(&mutex, __FILE__, __LINE__);
+
+typename std::set<PROPERTY_NOTIFIER_BASE<varT> *>::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 <typename varT>
+USER_PROPERTY<varT> & USER_PROPERTY<varT>::operator= (const varT & newValue)
+{
+Set(newValue);
+return *this;
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+USER_PROPERTY<varT>& USER_PROPERTY<varT>::operator-= (const varT & delta)
+{
+varT newValue = ConstData() - delta;
+Set(newValue);
+return *this;
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+const varT * USER_PROPERTY<varT>::operator&() const throw()
+{
+return &value;
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+const varT & USER_PROPERTY<varT>::ConstData() const throw()
+{
+return value;
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+void USER_PROPERTY<varT>::AddBeforeNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
+{
+STG_LOCKER locker(&mutex, __FILE__, __LINE__);
+beforeNotifiers.insert(n);
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+void USER_PROPERTY<varT>::DelBeforeNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
+{
+STG_LOCKER locker(&mutex, __FILE__, __LINE__);
+beforeNotifiers.erase(n);
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+void USER_PROPERTY<varT>::AddAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
+{
+STG_LOCKER locker(&mutex, __FILE__, __LINE__);
+afterNotifiers.insert(n);
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+void USER_PROPERTY<varT>::DelAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
+{
+STG_LOCKER locker(&mutex, __FILE__, __LINE__);
+afterNotifiers.erase(n);
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+time_t USER_PROPERTY<varT>::ModificationTime() const throw()
+{
+return modificationTime;
+}
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <typename varT>
+USER_PROPERTY_LOGGED<varT>::USER_PROPERTY_LOGGED(varT & val,
+                                                 std::string n,
+                                                 bool isPass,
+                                                 bool isSt,
+                                                 STG_LOGGER & logger,
+                                                 const std::string & sd)
+
+    : USER_PROPERTY<varT>(val),
+      stgLogger(logger),
+      isPassword(isPass),
+      isStat(isSt),
+      name(n),
+      scriptsDir(sd)
+{
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+USER_PROPERTY_LOGGED<varT>::~USER_PROPERTY_LOGGED()
+{
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+USER_PROPERTY_LOGGED<varT> * USER_PROPERTY_LOGGED<varT>::GetPointer() throw()
+{
+return this;
+}
+//-----------------------------------------------------------------------------
+template <typename varT>
+const varT & USER_PROPERTY_LOGGED<varT>::Get() const
+{
+return USER_PROPERTY<varT>::ConstData();
+};
+//-------------------------------------------------------------------------
+template <typename varT>
+const std::string & USER_PROPERTY_LOGGED<varT>::GetName() const
+{
+return name;
+};
+//-------------------------------------------------------------------------
+template <typename varT>
+bool USER_PROPERTY_LOGGED<varT>::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<varT>::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<varT>::Set(val);
+    return true;
+    }
+else
+    {
+    WriteAccessDenied(login, admin, name);
+    return false;
+    }
+return true;
+}
+//-------------------------------------------------------------------------
+template <typename varT>
+void USER_PROPERTY_LOGGED<varT>::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 <typename varT>
+void USER_PROPERTY_LOGGED<varT>::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 <typename varT>
+void USER_PROPERTY_LOGGED<varT>::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<typename varT>
+ostream & operator<< (ostream & stream, const USER_PROPERTY<varT> & value)
+{
+return stream << value.ConstData();
+}
+//-----------------------------------------------------------------------------
+
+#endif // USER_PROPERTY_H
index b59bd58c8d2643782ef6af60bbeabd41f9ae01bc..811807deb4b9dade998eb8306af8038ab201ba01 100644 (file)
@@ -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
index b3d8823eabbaf74a17a157f129ea12b018967f29..4e60829d032193fae663c0ef121f82072a982428 100644 (file)
@@ -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;
 
index a557b677f7e75a4e249e45b1745eee1eb84a502f..30205c9207049711486071b7d23423847df10b1e 100644 (file)
@@ -6,8 +6,7 @@
 #include "user_ips.h"
 #include "utils.h"
 #include "common.h"
-
-#include "../../../user_property.h"
+#include "user_property.h"
 
 //------------------------------------------------------------------------------
 
index d16d883f480d4be0ead41f829cec7bb15e393621..296a7c7bb9ebd5d3809213537582403d60a47b0b 100644 (file)
@@ -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"
 
 //------------------------------------------------------------------------------
 
index b90cb2b6b8c15f6358ebd41fdd557a1763a83bdc..8a01f169f35d2401e955d73ddc0f59defdb1fee8 100644 (file)
@@ -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)
 //-----------------------------------------------------------------------------
index 3067e87ec480060dc79b4f211ce85aba32a722cc..169ac61df986af04f29df2fc5a8605f4c674bd76 100644 (file)
@@ -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
 {
index c3fb7183b8c5e913993be1bef8fa4f0ab4cdfcc6..a4eea3a8902a68089568904a36c1a30bf74f1f54 100644 (file)
@@ -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;
 
index 1cc7883b3e1a2b26acfed3938d7544f85eda9341..a772e5076cf1523fdfd13b53479812e63b55fbb0 100644 (file)
@@ -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 (file)
index b269389..0000000
+++ /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 <ctime>
-#include <string>
-#include <set>
-#include <sstream>
-#include <iostream>
-
-#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<typename varT>
-class USER_PROPERTY {
-public:
-    USER_PROPERTY(varT & val);
-    virtual ~USER_PROPERTY();
-
-    void Set(const varT & rvalue);
-
-    USER_PROPERTY<varT> & operator= (const varT & rvalue);
-    USER_PROPERTY<varT> & 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<varT> * n);
-    void    DelBeforeNotifier(PROPERTY_NOTIFIER_BASE<varT> * n);
-
-    void    AddAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n);
-    void    DelAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n);
-
-    time_t  ModificationTime() const throw();
-    void    ModifyTime() throw();
-
-private:
-    varT & value;
-    time_t modificationTime;
-    std::set<PROPERTY_NOTIFIER_BASE<varT> *> beforeNotifiers;
-    std::set<PROPERTY_NOTIFIER_BASE<varT> *> afterNotifiers;
-    pthread_mutex_t mutex;
-};
-//-----------------------------------------------------------------------------
-template<typename varT>
-class USER_PROPERTY_LOGGED: public USER_PROPERTY<varT> {
-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<varT> * 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<double>            cash;
-    USER_PROPERTY_LOGGED<DIR_TRAFF>         up;
-    USER_PROPERTY_LOGGED<DIR_TRAFF>         down;
-    USER_PROPERTY_LOGGED<double>            lastCashAdd;
-    USER_PROPERTY_LOGGED<time_t>            passiveTime;
-    USER_PROPERTY_LOGGED<time_t>            lastCashAddTime;
-    USER_PROPERTY_LOGGED<double>            freeMb;
-    USER_PROPERTY_LOGGED<time_t>            lastActivityTime;
-
-    USER_PROPERTY_LOGGED<std::string>       password;
-    USER_PROPERTY_LOGGED<int>               passive;
-    USER_PROPERTY_LOGGED<int>               disabled;
-    USER_PROPERTY_LOGGED<int>               disabledDetailStat;
-    USER_PROPERTY_LOGGED<int>               alwaysOnline;
-    USER_PROPERTY_LOGGED<std::string>       tariffName;
-    USER_PROPERTY_LOGGED<std::string>       nextTariff;
-    USER_PROPERTY_LOGGED<std::string>       address;
-    USER_PROPERTY_LOGGED<std::string>       note;
-    USER_PROPERTY_LOGGED<std::string>       group;
-    USER_PROPERTY_LOGGED<std::string>       email;
-    USER_PROPERTY_LOGGED<std::string>       phone;
-    USER_PROPERTY_LOGGED<std::string>       realName;
-    USER_PROPERTY_LOGGED<double>            credit;
-    USER_PROPERTY_LOGGED<time_t>            creditExpire;
-    USER_PROPERTY_LOGGED<USER_IPS>          ips;
-    USER_PROPERTY_LOGGED<std::string>       userdata0;
-    USER_PROPERTY_LOGGED<std::string>       userdata1;
-    USER_PROPERTY_LOGGED<std::string>       userdata2;
-    USER_PROPERTY_LOGGED<std::string>       userdata3;
-    USER_PROPERTY_LOGGED<std::string>       userdata4;
-    USER_PROPERTY_LOGGED<std::string>       userdata5;
-    USER_PROPERTY_LOGGED<std::string>       userdata6;
-    USER_PROPERTY_LOGGED<std::string>       userdata7;
-    USER_PROPERTY_LOGGED<std::string>       userdata8;
-    USER_PROPERTY_LOGGED<std::string>       userdata9;
-};
-//=============================================================================
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-template <typename varT>
-USER_PROPERTY<varT>::USER_PROPERTY(varT & val)
-    : value(val)
-{
-pthread_mutex_init(&mutex, NULL);
-modificationTime = stgTime;
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-USER_PROPERTY<varT>::~USER_PROPERTY()
-{
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-void USER_PROPERTY<varT>::ModifyTime() throw()
-{
-modificationTime = stgTime;
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-void USER_PROPERTY<varT>::Set(const varT & rvalue)
-{
-STG_LOCKER locker(&mutex, __FILE__, __LINE__);
-
-typename std::set<PROPERTY_NOTIFIER_BASE<varT> *>::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 <typename varT>
-USER_PROPERTY<varT> & USER_PROPERTY<varT>::operator= (const varT & newValue)
-{
-Set(newValue);
-return *this;
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-USER_PROPERTY<varT>& USER_PROPERTY<varT>::operator-= (const varT & delta)
-{
-varT newValue = ConstData() - delta;
-Set(newValue);
-return *this;
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-const varT * USER_PROPERTY<varT>::operator&() const throw()
-{
-return &value;
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-const varT & USER_PROPERTY<varT>::ConstData() const throw()
-{
-return value;
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-void USER_PROPERTY<varT>::AddBeforeNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
-{
-STG_LOCKER locker(&mutex, __FILE__, __LINE__);
-beforeNotifiers.insert(n);
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-void USER_PROPERTY<varT>::DelBeforeNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
-{
-STG_LOCKER locker(&mutex, __FILE__, __LINE__);
-beforeNotifiers.erase(n);
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-void USER_PROPERTY<varT>::AddAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
-{
-STG_LOCKER locker(&mutex, __FILE__, __LINE__);
-afterNotifiers.insert(n);
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-void USER_PROPERTY<varT>::DelAfterNotifier(PROPERTY_NOTIFIER_BASE<varT> * n)
-{
-STG_LOCKER locker(&mutex, __FILE__, __LINE__);
-afterNotifiers.erase(n);
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-time_t USER_PROPERTY<varT>::ModificationTime() const throw()
-{
-return modificationTime;
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-template <typename varT>
-USER_PROPERTY_LOGGED<varT>::USER_PROPERTY_LOGGED(varT & val,
-                                                 std::string n,
-                                                 bool isPass,
-                                                 bool isSt,
-                                                 STG_LOGGER & logger,
-                                                 const std::string & sd)
-
-    : USER_PROPERTY<varT>(val),
-      stgLogger(logger),
-      isPassword(isPass),
-      isStat(isSt),
-      name(n),
-      scriptsDir(sd)
-{
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-USER_PROPERTY_LOGGED<varT>::~USER_PROPERTY_LOGGED()
-{
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-USER_PROPERTY_LOGGED<varT> * USER_PROPERTY_LOGGED<varT>::GetPointer() throw()
-{
-return this;
-}
-//-----------------------------------------------------------------------------
-template <typename varT>
-const varT & USER_PROPERTY_LOGGED<varT>::Get() const
-{
-return USER_PROPERTY<varT>::ConstData();
-};
-//-------------------------------------------------------------------------
-template <typename varT>
-const std::string & USER_PROPERTY_LOGGED<varT>::GetName() const
-{
-return name;
-};
-//-------------------------------------------------------------------------
-template <typename varT>
-bool USER_PROPERTY_LOGGED<varT>::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<varT>::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<varT>::Set(val);
-    return true;
-    }
-else
-    {
-    WriteAccessDenied(login, admin, name);
-    return false;
-    }
-return true;
-}
-//-------------------------------------------------------------------------
-template <typename varT>
-void USER_PROPERTY_LOGGED<varT>::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 <typename varT>
-void USER_PROPERTY_LOGGED<varT>::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 <typename varT>
-void USER_PROPERTY_LOGGED<varT>::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<typename varT>
-ostream & operator<< (ostream & stream, const USER_PROPERTY<varT> & value)
-{
-return stream << value.ConstData();
-}
-//-----------------------------------------------------------------------------
-
-#endif // USER_PROPERTY_H