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/10/07 20:04:48 $
 
  44 #include "stg_logger.h"
 
  47 #include "noncopyable.h"
 
  48 #include "eventloop.h"
 
  50 const int userDeleteDelayTime = 120;
 
  54 //-----------------------------------------------------------------------------
 
  55 class PROPERTY_NOTIFER_IP_BEFORE: public PROPERTY_NOTIFIER_BASE<uint32_t>
 
  58     PROPERTY_NOTIFER_IP_BEFORE(USERS & us, user_iter u) : users(us), user(u) {};
 
  59     void        Notify(const uint32_t & oldValue, const uint32_t & newValue);
 
  60     user_iter   GetUser() const { return user; };
 
  65 //-----------------------------------------------------------------------------
 
  66 class PROPERTY_NOTIFER_IP_AFTER: public PROPERTY_NOTIFIER_BASE<uint32_t>
 
  69     PROPERTY_NOTIFER_IP_AFTER(USERS & us, user_iter u) : users(us), user(u) {};
 
  70     void        Notify(const uint32_t & oldValue, const uint32_t & newValue);
 
  71     user_iter   GetUser() const { return user; };
 
  76 //-----------------------------------------------------------------------------
 
  84 list<USER>::iterator iter;
 
  87 //-----------------------------------------------------------------------------
 
  88 class USERS : private NONCOPYABLE
 
  90     friend class PROPERTY_NOTIFER_IP_BEFORE;
 
  91     friend class PROPERTY_NOTIFER_IP_AFTER;
 
  94     USERS(SETTINGS * s, BASE_STORE * store, TARIFFS * tariffs, const ADMIN & sysAdmin);
 
  97     int             FindByName(const string & login, user_iter * user) const;
 
  98     int             FindByID(int id, user_iter * user);
 
 100     bool            TariffInUse(const string & tariffName);
 
 102     void            AddNotifierUserAdd(NOTIFIER_BASE<user_iter> *);
 
 103     void            DelNotifierUserAdd(NOTIFIER_BASE<user_iter> *);
 
 105     void            AddNotifierUserDel(NOTIFIER_BASE<user_iter> *);
 
 106     void            DelNotifierUserDel(NOTIFIER_BASE<user_iter> *);
 
 108     int             Add(const string & login, const ADMIN & admin);
 
 109     void            Del(const string & login, const ADMIN & admin);
 
 114     int             FindByIPIdx(uint32_t ip, user_iter * user);
 
 117     int             SearchNext(int handler, user_iter * u);
 
 118     int             CloseSearch(int handler);
 
 124     void            AddToIPIdx(user_iter);
 
 125     void            DelFromIPIdx(uint32_t ip);
 
 127     int             FindByNameNonLock(const string & login, user_iter * user) const;
 
 128     int             FindByIDNonLock(int id, user_iter * user);
 
 131     void            ProcessActions();
 
 133     void            SetUserNotifiers(user_iter user);
 
 134     void            UnSetUserNotifiers(user_iter user);
 
 136     void            AddUserIntoIndexes(user_iter user);
 
 137     void            DelUserFromIndexes(user_iter user);
 
 139     static void *   Run(void *);
 
 140     void            NewMinute(const struct tm & t);
 
 141     void            NewDay(const struct tm & t);
 
 142     void            DayResetTraff(const struct tm & t);
 
 144     bool            TimeToWriteDetailStat(const struct tm & t);
 
 147     list<USER_TO_DEL>   usersToDelete;
 
 148     list<PROPERTY_NOTIFER_IP_BEFORE> userIPNotifiersBefore;
 
 149     list<PROPERTY_NOTIFER_IP_AFTER>  userIPNotifiersAfter;
 
 151     map<uint32_t, user_iter> ipIndex;
 
 152     map<string,   user_iter> loginIndex;
 
 157     const ADMIN         sysAdmin;
 
 158     STG_LOGGER &        WriteServLog;
 
 163     mutable pthread_mutex_t mutex;
 
 165     mutable unsigned int    handle;
 
 167     mutable map<int, user_iter> searchDescriptors;
 
 169     set <NOTIFIER_BASE<user_iter>*> onAddNotifiers;
 
 170     set <NOTIFIER_BASE<user_iter>*> onDelNotifiers;
 
 172 //-----------------------------------------------------------------------------
 
 174 void PROPERTY_NOTIFER_IP_BEFORE::Notify(const uint32_t & oldValue,
 
 180 //EVENT_LOOP_SINGLETON::GetInstance().Enqueue(users, &USERS::DelFromIPIdx, oldValue);
 
 181 // Using explicit call to assure that index is valid, because fast reconnect with delayed call can result in authorization error
 
 182 users.DelFromIPIdx(oldValue);
 
 184 //-----------------------------------------------------------------------------
 
 186 void PROPERTY_NOTIFER_IP_AFTER::Notify(const uint32_t &,
 
 187                                        const uint32_t & newValue)
 
 192 //EVENT_LOOP_SINGLETON::GetInstance().Enqueue(users, &USERS::AddToIPIdx, user);
 
 193 // Using explicit call to assure that index is valid, because fast reconnect with delayed call can result in authorization error
 
 194 users.AddToIPIdx(user);
 
 196 //-----------------------------------------------------------------------------