#define _GNU_SOURCE
  #endif
  
 -#include <pthread.h>
 -#include <unistd.h> // access
 -
 -#include <cassert>
 -#include <cstdlib>
 -#include <cmath>
 +#include "user_impl.h"
 +#include "settings_impl.h"
 +#include "stg_timer.h"
  
  #include "stg/users.h"
  #include "stg/common.h"
  #include "stg/tariff.h"
  #include "stg/tariffs.h"
  #include "stg/admin.h"
 -#include "user_impl.h"
 -#include "settings_impl.h"
 -#include "stg_timer.h"
 +
 +#include <algorithm>
 +#include <functional>
 +
 +#include <cassert>
 +#include <cstdlib>
 +#include <cmath>
 +
 +#include <pthread.h>
 +#include <unistd.h> // access
  
  #ifdef USE_ABSTRACT_SETTINGS
  USER_IMPL::USER_IMPL(const SETTINGS * s,
        property(s->GetScriptsDir()),
        WriteServLog(GetStgLogger()),
        lastScanMessages(0),
 -      login(),
        id(0),
        __connected(0),
        connected(__connected),
 -      enabledDirs(),
 -      userIDGenerator(),
        __currIP(0),
        currIP(__currIP),
        lastIPForDisconnect(0),
        store(st),
        tariffs(t),
        tariff(NULL),
 -      traffStat(),
 -      traffStatSaved(),
        settings(s),
 -      authorizedBy(),
 -      messages(),
 +      authorizedModificationTime(0),
        deleted(false),
        lastWriteStat(0),
        lastWriteDetailedStat(0),
        userdata7(property.userdata7),
        userdata8(property.userdata8),
        userdata9(property.userdata9),
 -      sessionUpload(),
 -      sessionDownload(),
        passiveNotifier(this),
        tariffNotifier(this),
        cashNotifier(this),
 -      ipNotifier(this),
 -      mutex(),
 -      errorStr()
 +      ipNotifier(this)
  {
  password = "*_EMPTY_PASSWORD_*";
  tariffName = NO_TARIFF_NAME;
        property(s->GetScriptsDir()),
        WriteServLog(GetStgLogger()),
        lastScanMessages(0),
 -      login(),
        id(0),
        __connected(0),
        connected(__connected),
 -      enabledDirs(),
 -      userIDGenerator(),
        __currIP(0),
        currIP(__currIP),
        lastIPForDisconnect(0),
        store(st),
        tariffs(t),
        tariff(NULL),
 -      traffStat(),
 -      traffStatSaved(),
        settings(s),
 -      authorizedBy(),
 -      messages(),
 +      authorizedModificationTime(0),
        deleted(false),
        lastWriteStat(0),
        lastWriteDetailedStat(0),
        userdata7(property.userdata7),
        userdata8(property.userdata8),
        userdata9(property.userdata9),
 -      sessionUpload(),
 -      sessionDownload(),
        passiveNotifier(this),
        disabledNotifier(this),
        tariffNotifier(this),
        cashNotifier(this),
 -      ipNotifier(this),
 -      mutex(),
 -      errorStr()
 +      ipNotifier(this)
  {
  password = "*_EMPTY_PASSWORD_*";
  tariffName = NO_TARIFF_NAME;
        id(u.id),
        __connected(0),
        connected(__connected),
 -      enabledDirs(),
        userIDGenerator(u.userIDGenerator),
        __currIP(u.__currIP),
        currIP(__currIP),
        traffStat(u.traffStat),
        traffStatSaved(u.traffStatSaved),
        settings(u.settings),
 -      authorizedBy(),
 +      authorizedModificationTime(u.authorizedModificationTime),
        messages(u.messages),
        deleted(u.deleted),
        lastWriteStat(u.lastWriteStat),
        disabledNotifier(this),
        tariffNotifier(this),
        cashNotifier(this),
 -      ipNotifier(this),
 -      mutex(),
 -      errorStr()
 +      ipNotifier(this)
  {
  if (&u == this)
      return;
          }
      }
  
 +if (authorizedBy.empty())
 +    authorizedModificationTime = stgTime;
  authorizedBy.insert(auth);
  
  ScanMessage();
  
  if (authorizedBy.empty())
      {
 +    authorizedModificationTime = stgTime;
      lastIPForDisconnect = currIP;
      currIP = 0; // DelUser in traffcounter
      return;
  return authorizedBy.find(auth) != authorizedBy.end();
  }
  //-----------------------------------------------------------------------------
 +std::vector<std::string> USER_IMPL::GetAuthorizers() const
 +{
 +    std::vector<std::string> list;
 +    std::transform(authorizedBy.begin(), authorizedBy.end(), std::back_inserter(list), std::mem_fun(&AUTH::GetVersion));
 +    return list;
 +}
 +//-----------------------------------------------------------------------------
  void USER_IMPL::Connect(bool fakeConnect)
  {
  /*
              }
  
          std::string scriptOnConnectParams;
+ 
          strprintf(&scriptOnConnectParams,
                  "%s \"%s\" \"%s\" \"%f\" \"%d\" \"%s\"",
                  scriptOnConnect.c_str(),
                  id,
                  dirsStr);
  
+         std::vector<std::string>::const_iterator it(settings->GetScriptParams().begin());
+         while (it != settings->GetScriptParams().end())
+             {
+             scriptOnConnectParams += " \"" + GetParamValue(it->c_str()) + "\"";
+             ++it;
+             }
+ 
          ScriptExec(scriptOnConnectParams.c_str());
          }
      else
  
  if (!fakeDisconnect)
      {
 +    lastDisconnectReason = reason;
      std::string scriptOnDisonnect = settings->GetScriptsDir() + "/OnDisconnect";
  
      if (access(scriptOnDisonnect.c_str(), X_OK) == 0)
                  id,
                  dirsStr);
  
+         std::vector<std::string>::const_iterator it(settings->GetScriptParams().begin());
+         while (it != settings->GetScriptParams().end())
+             {
+             scriptOnDisonnectParams += " \"" + GetParamValue(it->c_str()) + "\"";
+             ++it;
+             }
+ 
          ScriptExec(scriptOnDisonnectParams.c_str());
          }
      else
      }
  }
  //-----------------------------------------------------------------------------
+ std::string USER_IMPL::GetParamValue(const std::string & name) const
+ {
+ if (name == "freeMb")       return property.freeMb.ToString();
+ if (name == "passive")      return property.passive.ToString();
+ if (name == "disabled")     return property.disabled.ToString();
+ if (name == "alwaysOnline") return property.alwaysOnline.ToString();
+ if (name == "tariffName")   return property.tariffName;
+ if (name == "nextTariff")   return property.nextTariff;
+ if (name == "address")      return property.address;
+ if (name == "note")         return property.note;
+ if (name == "group")        return property.group;
+ if (name == "email")        return property.email;
+ if (name == "phone")        return property.phone;
+ if (name == "realName")     return property.realName;
+ if (name == "credit")       return property.credit.ToString();
+ if (name == "userdata0")    return property.userdata0;
+ if (name == "userdata1")    return property.userdata1;
+ if (name == "userdata2")    return property.userdata2;
+ if (name == "userdata3")    return property.userdata3;
+ if (name == "userdata4")    return property.userdata4;
+ if (name == "userdata5")    return property.userdata5;
+ if (name == "userdata6")    return property.userdata6;
+ if (name == "userdata7")    return property.userdata7;
+ if (name == "userdata8")    return property.userdata8;
+ if (name == "userdata9")    return property.userdata9;
+ if (name == "cash")         return property.cash.ToString();
+ if (name == "id")
+     {
+     std::stringstream stream;
+     stream << id;
+     return stream.str();;
+     }
+ if (name == "login")        return login;
+ if (name == "ip")           return currIP.ToString();
+ return "";
+ }
+ //-----------------------------------------------------------------------------
  //-----------------------------------------------------------------------------
  //-----------------------------------------------------------------------------
  void CHG_PASSIVE_NOTIFIER::Notify(const int & oldPassive, const int & newPassive)
 
  #ifndef USER_IMPL_H
  #define USER_IMPL_H
  
 -#include <ctime>
 -#include <list>
 -#include <string>
 -#include <set>
 -
  #include "stg/user.h"
 -#include "stg/os_int.h"
 -#include "stg/const.h"
  #include "stg/user_stat.h"
  #include "stg/user_conf.h"
  #include "stg/user_ips.h"
  #include "stg/auth.h"
  #include "stg/message.h"
  #include "stg/noncopyable.h"
 +#include "stg/os_int.h"
 +#include "stg/const.h"
 +
 +#include <list>
 +#include <vector>
 +#include <string>
 +#include <set>
 +
 +#include <ctime>
  
  //-----------------------------------------------------------------------------
  class TARIFF;
  
      bool            GetConnected() const { return connected; }
      time_t          GetConnectedModificationTime() const { return connected.ModificationTime(); }
 +    const std::string & GetLastDisconnectReason() const { return lastDisconnectReason; }
      int             GetAuthorized() const { return static_cast<int>(authorizedBy.size()); }
 +    time_t          GetAuthorizedModificationTime() const { return authorizedModificationTime; }
      int             Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth);
      void            Unauthorize(const AUTH * auth);
      bool            IsAuthorizedBy(const AUTH * auth) const;
 +    std::vector<std::string> GetAuthorizers() const;
  
      int             AddMessage(STG_MSG * msg);
  
      void            OnAdd();
      void            OnDelete();
  
+     virtual std::string GetParamValue(const std::string & name) const;
+ 
  private:
      USER_IMPL & operator=(const USER_IMPL & rvalue);
  
      int             id;
      bool            __connected;
      USER_PROPERTY<bool> connected;
 +    std::string     lastDisconnectReason;
  
      bool            enabledDirs[DIR_NUM];
  
  #endif
  
      std::set<const AUTH *> authorizedBy;
 +    time_t          authorizedModificationTime;
  
      std::list<STG_MSG> messages;