2  *    This program is free software; you can redistribute it and/or modify
 
   3  *    it under the terms of the GNU General Public License as published by
 
   4  *    the Free Software Foundation; either version 2 of the License, or
 
   5  *    (at your option) any later version.
 
   7  *    This program is distributed in the hope that it will be useful,
 
   8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  10  *    GNU General Public License for more details.
 
  12  *    You should have received a copy of the GNU General Public License
 
  13  *    along with this program; if not, write to the Free Software
 
  14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
 
  23  $Date: 2010/11/03 10:50:03 $
 
  36 #include "stg/os_int.h"
 
  37 #include "stg/const.h"
 
  38 #include "stg/user_stat.h"
 
  39 #include "stg/user_conf.h"
 
  40 #include "stg/user_ips.h"
 
  41 #include "stg/user_property.h"
 
  43 #include "stg/message.h"
 
  44 #include "stg/noncopyable.h"
 
  46 //-----------------------------------------------------------------------------
 
  51 #ifdef USE_ABSTRACT_SETTINGS
 
  56 //-----------------------------------------------------------------------------
 
  57 class USER_ID_GENERATOR {
 
  58 friend class USER_IMPL;
 
  60     USER_ID_GENERATOR() {}
 
  61     int GetNextID() { static int id = 0; return id++; }
 
  63 //-----------------------------------------------------------------------------
 
  64 class CHG_PASSIVE_NOTIFIER : public PROPERTY_NOTIFIER_BASE<int>,
 
  67     CHG_PASSIVE_NOTIFIER(USER_IMPL * u) : user(u) {}
 
  68     void Notify(const int & oldPassive, const int & newPassive);
 
  71     CHG_PASSIVE_NOTIFIER(const CHG_PASSIVE_NOTIFIER & rvalue);
 
  72     CHG_PASSIVE_NOTIFIER & operator=(const CHG_PASSIVE_NOTIFIER & rvalue);
 
  76 //-----------------------------------------------------------------------------
 
  77 class CHG_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE<std::string>,
 
  80     CHG_TARIFF_NOTIFIER(USER_IMPL * u) : user(u) {}
 
  81     void Notify(const std::string & oldTariff, const std::string & newTariff);
 
  84     CHG_TARIFF_NOTIFIER(const CHG_TARIFF_NOTIFIER & rvalue);
 
  85     CHG_TARIFF_NOTIFIER & operator=(const CHG_TARIFF_NOTIFIER & rvalue);
 
  89 //-----------------------------------------------------------------------------
 
  90 class CHG_CASH_NOTIFIER : public PROPERTY_NOTIFIER_BASE<double>,
 
  93     CHG_CASH_NOTIFIER(USER_IMPL * u) : user(u) {}
 
  94     void Notify(const double & oldCash, const double & newCash);
 
  97     CHG_CASH_NOTIFIER(const CHG_CASH_NOTIFIER & rvalue);
 
  98     CHG_CASH_NOTIFIER & operator=(const CHG_CASH_NOTIFIER & rvalue);
 
 102 //-----------------------------------------------------------------------------
 
 103 class CHG_IPS_NOTIFIER : public PROPERTY_NOTIFIER_BASE<USER_IPS>,
 
 104                          private NONCOPYABLE {
 
 106     CHG_IPS_NOTIFIER(const CHG_IPS_NOTIFIER & rvalue);
 
 107     CHG_IPS_NOTIFIER & operator=(const CHG_IPS_NOTIFIER & rvalue);
 
 109     CHG_IPS_NOTIFIER(USER_IMPL * u) : user(u) {}
 
 110     void Notify(const USER_IPS & oldIPs, const USER_IPS & newIPs);
 
 115 //-----------------------------------------------------------------------------
 
 116 class USER_IMPL : public USER {
 
 117 friend class CHG_PASSIVE_NOTIFIER;
 
 118 friend class CHG_TARIFF_NOTIFIER;
 
 119 friend class CHG_CASH_NOTIFIER;
 
 120 friend class CHG_IPS_NOTIFIER;
 
 122 #ifdef USE_ABSTRACT_SETTINGS
 
 123     USER_IMPL(const SETTINGS * settings,
 
 125               const TARIFFS * tariffs,
 
 126               const ADMIN * sysAdmin,
 
 129     USER_IMPL(const SETTINGS_IMPL * settings,
 
 131               const TARIFFS * tariffs,
 
 132               const ADMIN * sysAdmin,
 
 135     USER_IMPL(const USER_IMPL & u);
 
 136     virtual ~USER_IMPL();
 
 142     int             WriteMonthStat();
 
 144     const std::string & GetLogin() const { return login; }
 
 145     void            SetLogin(std::string const & l);
 
 147     uint32_t        GetCurrIP() const { return currIP; }
 
 148     time_t          GetCurrIPModificationTime() const { return currIP.ModificationTime(); }
 
 150     void            AddCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
 
 151     void            DelCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
 
 153     void            AddCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
 
 154     void            DelCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
 
 156     void            AddConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
 
 157     void            DelConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
 
 159     void            AddConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
 
 160     void            DelConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
 
 162     int             GetID() const { return id; }
 
 164     double          GetPassiveTimePart() const;
 
 165     void            ResetPassiveTime() { passiveTime = 0; }
 
 166     void            SetPassiveTimeAsNewUser();
 
 168     int             WriteDetailStat(bool hard = false);
 
 170     const TARIFF *  GetTariff() const { return tariff; }
 
 171     void            ResetNextTariff() { nextTariff = ""; }
 
 173     #ifdef TRAFF_STAT_WITH_PORTS
 
 174     void            AddTraffStatU(int dir, uint32_t ip, uint16_t port, uint32_t len);
 
 175     void            AddTraffStatD(int dir, uint32_t ip, uint16_t port, uint32_t len);
 
 177     void            AddTraffStatU(int dir, uint32_t ip, uint32_t len);
 
 178     void            AddTraffStatD(int dir, uint32_t ip, uint32_t len);
 
 181     const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; }
 
 182     const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; }
 
 184     bool            GetConnected() const { return connected; }
 
 185     time_t          GetConnectedModificationTime() const { return connected.ModificationTime(); }
 
 186     int             GetAuthorized() const { return authorizedBy.size(); }
 
 187     int             Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth);
 
 188     void            Unauthorize(const AUTH * auth);
 
 189     bool            IsAuthorizedBy(const AUTH * auth) const;
 
 191     int             AddMessage(STG_MSG * msg);
 
 193     void            UpdatePingTime(time_t t = 0);
 
 194     time_t          GetPingTime() const { return pingTime; }
 
 196     void            PrintUser() const;
 
 199     const std::string & GetStrError() const { return errorStr; }
 
 201     USER_PROPERTIES & GetProperty() { return property; };
 
 202     const USER_PROPERTIES & GetProperty() const { return property; };
 
 204     void            SetDeleted() { deleted = true; }
 
 205     bool            GetDeleted() const { return deleted; }
 
 207     time_t          GetLastWriteStatTime() const { return lastWriteStat; }
 
 209     void            MidnightResetSessionStat();
 
 210     void            ProcessDayFee();
 
 211     void            ProcessDayFeeSpread();
 
 212     void            ProcessNewMonth();
 
 215     std::string     GetEnabledDirs();
 
 221     USER_IMPL & operator=(const USER_IMPL & rvalue);
 
 224     USER_PROPERTIES property;
 
 225     STG_LOGGER &    WriteServLog;
 
 227     void            Connect(bool fakeConnect = false);
 
 228     void            Disconnect(bool fakeDisconnect, const std::string & reason);
 
 229     int             SaveMonthStat(int month, int year);
 
 231     void            SetPrepaidTraff();
 
 233     int             SendMessage(STG_MSG & msg) const;
 
 236     time_t          lastScanMessages;
 
 241     USER_PROPERTY<bool> connected;
 
 243     bool            enabledDirs[DIR_NUM];
 
 245     USER_ID_GENERATOR userIDGenerator;
 
 247     uint32_t        __currIP; // Current user's ip
 
 248     USER_PROPERTY<uint32_t> currIP;
 
 250     uint32_t        lastIPForDisconnect; // User's ip after unauth but before disconnect
 
 254     const ADMIN *   sysAdmin;
 
 257     const TARIFFS * tariffs;
 
 258     const TARIFF *  tariff;
 
 260     TRAFF_STAT      traffStat;
 
 261     std::pair<time_t, TRAFF_STAT> traffStatSaved;
 
 263 #ifdef USE_ABSTRACT_SETTINGS
 
 264     const SETTINGS * settings;
 
 266     const SETTINGS_IMPL * settings;
 
 269     std::set<const AUTH *> authorizedBy;
 
 271     std::list<STG_MSG> messages;
 
 275     time_t          lastWriteStat;
 
 276     time_t          lastWriteDetailedStat;
 
 279     USER_PROPERTY<double>         & cash;
 
 280     USER_PROPERTY<DIR_TRAFF>      & up;
 
 281     USER_PROPERTY<DIR_TRAFF>      & down;
 
 282     USER_PROPERTY<double>         & lastCashAdd;
 
 283     USER_PROPERTY<time_t>         & passiveTime;
 
 284     USER_PROPERTY<time_t>         & lastCashAddTime;
 
 285     USER_PROPERTY<double>         & freeMb;
 
 286     USER_PROPERTY<time_t>         & lastActivityTime;
 
 287     USER_PROPERTY<std::string>    & password;
 
 288     USER_PROPERTY<int>            & passive;
 
 289     USER_PROPERTY<int>            & disabled;
 
 290     USER_PROPERTY<int>            & disabledDetailStat;
 
 291     USER_PROPERTY<int>            & alwaysOnline;
 
 292     USER_PROPERTY<std::string>    & tariffName;
 
 293     USER_PROPERTY<std::string>    & nextTariff;
 
 294     USER_PROPERTY<std::string>    & address;
 
 295     USER_PROPERTY<std::string>    & note;
 
 296     USER_PROPERTY<std::string>    & group;
 
 297     USER_PROPERTY<std::string>    & email;
 
 298     USER_PROPERTY<std::string>    & phone;
 
 299     USER_PROPERTY<std::string>    & realName;
 
 300     USER_PROPERTY<double>         & credit;
 
 301     USER_PROPERTY<time_t>         & creditExpire;
 
 302     USER_PROPERTY<USER_IPS>       & ips;
 
 303     USER_PROPERTY<std::string>    & userdata0;
 
 304     USER_PROPERTY<std::string>    & userdata1;
 
 305     USER_PROPERTY<std::string>    & userdata2;
 
 306     USER_PROPERTY<std::string>    & userdata3;
 
 307     USER_PROPERTY<std::string>    & userdata4;
 
 308     USER_PROPERTY<std::string>    & userdata5;
 
 309     USER_PROPERTY<std::string>    & userdata6;
 
 310     USER_PROPERTY<std::string>    & userdata7;
 
 311     USER_PROPERTY<std::string>    & userdata8;
 
 312     USER_PROPERTY<std::string>    & userdata9;
 
 316     DIR_TRAFF                sessionUpload;
 
 317     DIR_TRAFF                sessionDownload;
 
 319     CHG_PASSIVE_NOTIFIER     passiveNotifier;
 
 320     CHG_TARIFF_NOTIFIER      tariffNotifier;
 
 321     CHG_CASH_NOTIFIER        cashNotifier;
 
 322     CHG_IPS_NOTIFIER         ipNotifier;
 
 324     mutable pthread_mutex_t  mutex;
 
 326     std::string              errorStr;
 
 328 //-----------------------------------------------------------------------------
 
 330 typedef USER_IMPL * USER_IMPL_PTR;