/* * 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_IMPL_H #define USER_IMPL_H #include "stg/user.h" #include "stg/user_stat.h" #include "stg/user_conf.h" #include "stg/user_ips.h" #include "stg/user_property.h" #include "stg/auth.h" #include "stg/message.h" #include "stg/noncopyable.h" #include "stg/os_int.h" #include "stg/const.h" #include #include #include #include #include //----------------------------------------------------------------------------- class TARIFF; class TARIFFS; class ADMIN; class USER_IMPL; #ifdef USE_ABSTRACT_SETTINGS class SETTINGS; #else class SETTINGS_IMPL; #endif //----------------------------------------------------------------------------- class USER_ID_GENERATOR { friend class USER_IMPL; 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_IMPL * u) : user(u) {} void Notify(const int & oldPassive, const int & newPassive); private: USER_IMPL * user; }; //----------------------------------------------------------------------------- class CHG_DISABLED_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_DISABLED_NOTIFIER(USER_IMPL * u) : user(u) {} void Notify(const int & oldValue, const int & newValue); private: USER_IMPL * user; }; //----------------------------------------------------------------------------- class CHG_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_TARIFF_NOTIFIER(USER_IMPL * u) : user(u) {} void Notify(const std::string & oldTariff, const std::string & newTariff); private: USER_IMPL * user; }; //----------------------------------------------------------------------------- class CHG_CASH_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_CASH_NOTIFIER(USER_IMPL * u) : user(u) {} void Notify(const double & oldCash, const double & newCash); private: USER_IMPL * user; }; //----------------------------------------------------------------------------- class CHG_IPS_NOTIFIER : public PROPERTY_NOTIFIER_BASE, private NONCOPYABLE { public: CHG_IPS_NOTIFIER(USER_IMPL * u) : user(u) {} void Notify(const USER_IPS & oldIPs, const USER_IPS & newIPs); private: USER_IMPL * user; }; //----------------------------------------------------------------------------- class USER_IMPL : public USER { friend class CHG_PASSIVE_NOTIFIER; friend class CHG_DISABLED_NOTIFIER; friend class CHG_TARIFF_NOTIFIER; friend class CHG_CASH_NOTIFIER; friend class CHG_IPS_NOTIFIER; public: #ifdef USE_ABSTRACT_SETTINGS USER_IMPL(const SETTINGS * settings, const STORE * store, const TARIFFS * tariffs, const ADMIN * sysAdmin, const USERS * u, const SERVICES & svcs); #else USER_IMPL(const SETTINGS_IMPL * settings, const STORE * store, const TARIFFS * tariffs, const ADMIN * sysAdmin, const USERS * u, const SERVICES & svcs); #endif USER_IMPL(const USER_IMPL & u); virtual ~USER_IMPL(); int ReadConf(); int ReadStat(); int WriteConf(); int WriteStat(); int WriteMonthStat(); const std::string & GetLogin() const { return login; } void SetLogin(std::string const & l); uint32_t GetCurrIP() const { return currIP; } time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); } void AddCurrIPBeforeNotifier(CURR_IP_NOTIFIER * notifier); void DelCurrIPBeforeNotifier(const CURR_IP_NOTIFIER * notifier); void AddCurrIPAfterNotifier(CURR_IP_NOTIFIER * notifier); void DelCurrIPAfterNotifier(const CURR_IP_NOTIFIER * notifier); void AddConnectedBeforeNotifier(CONNECTED_NOTIFIER * notifier); void DelConnectedBeforeNotifier(const CONNECTED_NOTIFIER * notifier); void AddConnectedAfterNotifier(CONNECTED_NOTIFIER * notifier); void DelConnectedAfterNotifier(const CONNECTED_NOTIFIER * notifier); 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; } time_t GetSessionUploadModificationTime() const { return sessionUploadModTime; } time_t GetSessionDownloadModificationTime() const { return sessionDownloadModTime; } 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(authorizedBy.size()); } time_t GetAuthorizedModificationTime() const { return authorizedModificationTime; } int Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth); void Unauthorize(const AUTH * auth, const std::string & reason = std::string()); bool IsAuthorizedBy(const AUTH * auth) const; std::vector GetAuthorizers() const; int AddMessage(STG_MSG * msg); void UpdatePingTime(time_t t = 0); time_t GetPingTime() const { return pingTime; } void Run(); const std::string & GetStrError() const { return errorStr; } USER_PROPERTIES & GetProperty() { return property; } const USER_PROPERTIES & GetProperty() const { return property; } void SetDeleted() { deleted = true; } bool GetDeleted() const { return deleted; } time_t GetLastWriteStatTime() const { return lastWriteStat; } void MidnightResetSessionStat(); void ProcessDayFee(); void ProcessDayFeeSpread(); void ProcessNewMonth(); void ProcessDailyFee(); bool IsInetable(); std::string GetEnabledDirs() const; void OnAdd(); void OnDelete(); virtual std::string GetParamValue(const std::string & name) const; private: USER_IMPL & operator=(const USER_IMPL & rvalue); void Init(); const USERS * users; USER_PROPERTIES property; STG_LOGGER & WriteServLog; void Connect(bool fakeConnect = false); void Disconnect(bool fakeDisconnect, const std::string & reason); int SaveMonthStat(int month, int year); void SetPrepaidTraff(); int SendMessage(STG_MSG & msg) const; void ScanMessage(); time_t lastScanMessages; std::string login; int id; bool __connected; USER_PROPERTY connected; bool enabledDirs[DIR_NUM]; USER_ID_GENERATOR userIDGenerator; uint32_t __currIP; // Current user's ip USER_PROPERTY currIP; uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect std::string lastDisconnectReason; time_t pingTime; const ADMIN * sysAdmin; const STORE * store; const TARIFFS * tariffs; const TARIFF * tariff; const SERVICES & m_services; TRAFF_STAT traffStat; std::pair traffStatSaved; #ifdef USE_ABSTRACT_SETTINGS const SETTINGS * settings; #else const SETTINGS_IMPL * settings; #endif std::set authorizedBy; time_t authorizedModificationTime; std::list messages; bool deleted; time_t lastWriteStat; time_t lastWriteDetailedStat; // 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; time_t sessionUploadModTime; time_t sessionDownloadModTime; CHG_PASSIVE_NOTIFIER passiveNotifier; CHG_DISABLED_NOTIFIER disabledNotifier; CHG_TARIFF_NOTIFIER tariffNotifier; CHG_CASH_NOTIFIER cashNotifier; CHG_IPS_NOTIFIER ipNotifier; mutable pthread_mutex_t mutex; std::string errorStr; }; //----------------------------------------------------------------------------- typedef USER_IMPL * USER_IMPL_PTR; #endif //USER_H