/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * Author : Boris Mikhailenko */ /* $Revision: 1.48 $ $Date: 2010/11/03 10:50:03 $ $Author: faust $ */ #ifndef USER_H #define USER_H #include #include #include #include #include #include "os_int.h" #include "stg_const.h" #include "user_stat.h" #include "user_conf.h" #include "user_ips.h" #include "user_property.h" #include "base_auth.h" #include "stg_message.h" #include "noncopyable.h" using namespace std; //----------------------------------------------------------------------------- class USER; class TARIFF; class TARIFFS; class ADMIN; typedef list::iterator user_iter; typedef list::const_iterator const_user_iter; //----------------------------------------------------------------------------- class USER_ID_GENERATOR { friend class USER; private: USER_ID_GENERATOR() {} int GetNextID() { static int id = 0; return id++; } }; //----------------------------------------------------------------------------- class CHG_PASSIVE_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_PASSIVE_NOTIFIER(USER * u) : user(u) {} void Notify(const int & oldPassive, const int & newPassive); private: USER * user; }; //----------------------------------------------------------------------------- class CHG_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_TARIFF_NOTIFIER(USER * u) : user(u) {} void Notify(const string & oldTariff, const string & newTariff); private: USER * user; }; //----------------------------------------------------------------------------- class CHG_CASH_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_CASH_NOTIFIER(USER * u) : user(u) {} void Notify(const double & oldCash, const double & newCash); private: USER * user; }; //----------------------------------------------------------------------------- class CHG_IP_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_IP_NOTIFIER(USER * u) : user(u) {} void Notify(const uint32_t & oldCash, const uint32_t & newCash); private: USER * user; }; //----------------------------------------------------------------------------- class USER { friend class CHG_PASSIVE_NOTIFIER; friend class CHG_TARIFF_NOTIFIER; friend class CHG_CASH_NOTIFIER; friend class CHG_IP_NOTIFIER; public: USER(const SETTINGS * settings, const BASE_STORE * store, const TARIFFS * tariffs, const ADMIN & sysAdmin, const map * ipIndex); USER(const USER & u); ~USER(); int ReadConf(); int ReadStat(); int WriteConf(); int WriteStat(); int WriteMonthStat(); string const & GetLogin() const { return login; } void SetLogin(string const & l); uint32_t GetCurrIP() const { return currIP; } time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); } void AddCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE *); void DelCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE *); void AddCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE *); void DelCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE *); int GetID() const { return id; } double GetPassiveTimePart() const; void ResetPassiveTime() { passiveTime = 0; } void SetPassiveTimeAsNewUser(); int WriteDetailStat(bool hard = false); const TARIFF * GetTariff() const { return tariff; } void ResetNextTariff() { nextTariff = ""; } #ifdef TRAFF_STAT_WITH_PORTS void AddTraffStatU(int dir, uint32_t ip, uint16_t port, uint32_t len); void AddTraffStatD(int dir, uint32_t ip, uint16_t port, uint32_t len); #else void AddTraffStatU(int dir, uint32_t ip, uint32_t len); void AddTraffStatD(int dir, uint32_t ip, uint32_t len); #endif const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; } const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; } bool GetConnected() const { return connected; } time_t GetConnectedModificationTime() const { return connected.ModificationTime(); } int GetAuthorized() const { return authorizedBy.size(); } int Authorize(uint32_t ip, const string & iface, uint32_t enabledDirs, const BASE_AUTH * auth); void Unauthorize(const BASE_AUTH * auth); bool IsAuthorizedBy(const BASE_AUTH * auth) const; void OnAdd(); void OnDelete(); int AddMessage(STG_MSG * msg); void UpdatePingTime(time_t t = 0); time_t GetPingTime() const { return pingTime; } void PrintUser() const; void Run(); const string & GetStrError() const { return errorStr; } USER_PROPERTIES property; void SetDeleted() { deleted = true; } bool GetDeleted() const { return deleted; } time_t GetLastWriteStatTime() const { return lastWriteStat; } void MidnightResetSessionStat(); void ProcessDayFee(); void SetPrepaidTraff(); void ProcessDayFeeSpread(); void ProcessNewMonth(); bool IsInetable(); string GetEnabledDirs(); private: STG_LOGGER & WriteServLog; void Connect(bool fakeConnect = false); void Disconnect(bool fakeDisconnect, const std::string & reason); int SaveMonthStat(int month, int year); int SendMessage(const STG_MSG & msg); int ScanMessage(); time_t lastScanMessages; string login; int id; bool __connected; USER_PROPERTY connected; bool enabledDirs[DIR_NUM]; USER_ID_GENERATOR userIDGenerator; uint32_t __currIP; // Текущий адрес пользователя USER_PROPERTY currIP; /* К тому моменту как мы уже не авторизованиы, но еще не выполнен Disconnect, currIP уже сброшен. Последнее значение currIP сохраняем в lastIPForDisconnect */ uint32_t lastIPForDisconnect; time_t pingTime; const ADMIN sysAdmin; const BASE_STORE * store; const TARIFFS * tariffs; const TARIFF * tariff; TRAFF_STAT traffStat; std::pair traffStatSaved; const SETTINGS * settings; set authorizedBy; const map * ipIndex; bool deleted; time_t lastWriteStat; // Время последней записи статистики time_t lastWriteDeatiledStat; // Время последней записи детальной статистики bool writeFreeMbTraffCost; // Properties USER_PROPERTY & cash; USER_PROPERTY & up; USER_PROPERTY & down; USER_PROPERTY & lastCashAdd; USER_PROPERTY & passiveTime; USER_PROPERTY & lastCashAddTime; USER_PROPERTY & freeMb; USER_PROPERTY & lastActivityTime; USER_PROPERTY & password; USER_PROPERTY & passive; USER_PROPERTY & disabled; USER_PROPERTY & disabledDetailStat; USER_PROPERTY & alwaysOnline; USER_PROPERTY & tariffName; USER_PROPERTY & nextTariff; USER_PROPERTY & address; USER_PROPERTY & note; USER_PROPERTY & group; USER_PROPERTY & email; USER_PROPERTY & phone; USER_PROPERTY & realName; USER_PROPERTY & credit; USER_PROPERTY & creditExpire; USER_PROPERTY & ips; USER_PROPERTY & userdata0; USER_PROPERTY & userdata1; USER_PROPERTY & userdata2; USER_PROPERTY & userdata3; USER_PROPERTY & userdata4; USER_PROPERTY & userdata5; USER_PROPERTY & userdata6; USER_PROPERTY & userdata7; USER_PROPERTY & userdata8; USER_PROPERTY & userdata9; // End properties DIR_TRAFF sessionUpload; DIR_TRAFF sessionDownload; CHG_PASSIVE_NOTIFIER passiveNotifier; CHG_TARIFF_NOTIFIER tariffNotifier; CHG_CASH_NOTIFIER cashNotifier; CHG_IP_NOTIFIER ipNotifier; mutable pthread_mutex_t mutex; string errorStr; }; //----------------------------------------------------------------------------- #endif //USER_H