X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/8c6fa3fbaccc22127280bf77a48fab5a3ee0716e..46b0747592074017ff0ea4b33d4a7194235886e5:/stargazer/user_impl.h diff --git a/stargazer/user_impl.h b/stargazer/user_impl.h new file mode 100644 index 00000000..3293b56d --- /dev/null +++ b/stargazer/user_impl.h @@ -0,0 +1,353 @@ +/* + * 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/const.h" + +#include +#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: + explicit 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: + explicit 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: + explicit 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: + explicit 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: + explicit 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(); + void ProcessServices(); + + 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