X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/6f7160dd027c8ce7e2760aa369768ba39ab80181..296c906e2689b9b5dc26d2f2d3e1e2d9e1662d3b:/projects/stargazer/user_impl.h?ds=inline diff --git a/projects/stargazer/user_impl.h b/projects/stargazer/user_impl.h index dc21f696..c5b30a1d 100644 --- a/projects/stargazer/user_impl.h +++ b/projects/stargazer/user_impl.h @@ -18,282 +18,247 @@ * Author : Boris Mikhailenko */ -/* - $Revision: 1.48 $ - $Date: 2010/11/03 10:50:03 $ - $Author: faust $ - */ - -#ifndef USER_IMPL_H -#define USER_IMPL_H - -#include -#include +#pragma once + +#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 "user.h" -#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" +#include +#include -using namespace std; +namespace STG +{ //----------------------------------------------------------------------------- -class TARIFF; -class TARIFFS; -class ADMIN; -class USER_IMPL; -//----------------------------------------------------------------------------- -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_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE, - private NONCOPYABLE { -public: - CHG_TARIFF_NOTIFIER(USER_IMPL * u) : user(u) {} - void Notify(const string & oldTariff, const 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_IP_NOTIFIER : public PROPERTY_NOTIFIER_BASE, - private NONCOPYABLE { -public: - CHG_IP_NOTIFIER(USER_IMPL * u) : user(u) {} - void Notify(const uint32_t & oldCash, const uint32_t & newCash); - -private: - USER_IMPL * user; -}; +struct Tariff; +class Tariffs; +class Admin; +class UserImpl; +#ifdef USE_ABSTRACT_SETTINGS +struct Settings; +#else +class SettingsImpl; +#endif //----------------------------------------------------------------------------- -class USER_IMPL : public USER { -friend class CHG_PASSIVE_NOTIFIER; -friend class CHG_TARIFF_NOTIFIER; -friend class CHG_CASH_NOTIFIER; -friend class CHG_IP_NOTIFIER; -public: - USER_IMPL(const SETTINGS * settings, - const BASE_STORE * store, - const TARIFFS * tariffs, - const ADMIN & sysAdmin, - const USERS * u); - USER_IMPL(const USER_IMPL & u); - virtual ~USER_IMPL(); +class UserImpl : public User +{ + public: +#ifdef USE_ABSTRACT_SETTINGS + using Settings = STG::Settings; +#else + using Settings = STG::SettingsImpl; +#endif + UserImpl(const Settings * settings, + const Store * store, + const Tariffs * tariffs, + const Admin * sysAdmin, + const Users * u, + const Services & svcs); + UserImpl(const UserImpl & u); + + int ReadConf(); + int ReadStat(); + int WriteConf() override; + int WriteStat() override; + int WriteMonthStat(); + + const std::string & GetLogin() const override { return login; } + void SetLogin(std::string const & l); + + int GetID() const override { return id; } + + double GetPassiveTimePart() const override; + void ResetPassiveTime() { passiveTime = 0; } + void SetPassiveTimeAsNewUser(); + + int WriteDetailStat(bool hard = false); + + const Tariff * GetTariff() const override { return tariff; } + void ResetNextTariff() override { 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 DirTraff & GetSessionUpload() const override { return sessionUpload; } + const DirTraff & GetSessionDownload() const override { return sessionDownload; } + time_t GetSessionUploadModificationTime() const override { return sessionUploadModTime; } + time_t GetSessionDownloadModificationTime() const override { return sessionDownloadModTime; } + + const std::string & GetLastDisconnectReason() const override { return lastDisconnectReason; } + int GetAuthorized() const override { return static_cast(authorizedBy.size()); } + time_t GetAuthorizedModificationTime() const override { 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 override; + std::vector GetAuthorizers() const override; + + int AddMessage(Message * msg) override; + + void UpdatePingTime(time_t t = 0) override; + time_t GetPingTime() const override { return pingTime; } + + void Run() override; + + const std::string & GetStrError() const override { return errorStr; } + + UserProperties & GetProperties() override { return properties; } + const UserProperties & GetProperties() const override { return properties; } + + void SetDeleted() override { deleted = true; } + bool GetDeleted() const override { return deleted; } + + time_t GetLastWriteStatTime() const override { return lastWriteStat; } + + void MidnightResetSessionStat(); + void ProcessDayFee(); + void ProcessDayFeeSpread(); + void ProcessNewMonth(); + void ProcessDailyFee(); + void ProcessServices(); + + bool IsInetable() override; + std::string GetEnabledDirs() const override; + + void OnAdd() override; + void OnDelete() override; + + virtual std::string GetParamValue(const std::string & name) const override; + + private: + UserImpl & operator=(const UserImpl & rvalue); + + void Init(); + + const Users* users; + UserProperties properties; + STG::Logger& WriteServLog; + + void Connect(bool fakeConnect = false); + void Disconnect(bool fakeDisconnect, const std::string & reason); + int SaveMonthStat(int month, int year); - int ReadConf(); - int ReadStat(); - int WriteConf(); - int WriteStat(); - int WriteMonthStat(); + void SetPrepaidTraff(); - string const & GetLogin() const { return login; } - void SetLogin(string const & l); + int SendMessage(Message & msg) const; + void ScanMessage(); - uint32_t GetCurrIP() const { return currIP; } - time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); } + time_t lastScanMessages; - void AddCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE *); - void DelCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE *); + std::string login; + int id; - void AddCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE *); - void DelCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE *); + bool enabledDirs[DIR_NUM]; - int GetID() const { return id; } + uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect + std::string lastDisconnectReason; - double GetPassiveTimePart() const; - void ResetPassiveTime() { passiveTime = 0; } - void SetPassiveTimeAsNewUser(); + time_t pingTime; - int WriteDetailStat(bool hard = false); + const Admin * sysAdmin; + const Store * store; - const TARIFF * GetTariff() const { return tariff; } - void ResetNextTariff() { nextTariff = ""; } + const Tariffs * tariffs; + const Tariff * tariff; - #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 Services & m_services; - const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; } - const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; } + TraffStat traffStat; + std::pair traffStatSaved; - 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; + const Settings * settings; - int AddMessage(STG_MSG * msg); + std::set authorizedBy; + time_t authorizedModificationTime; - void UpdatePingTime(time_t t = 0); - time_t GetPingTime() const { return pingTime; } + std::vector messages; - void PrintUser() const; - void Run(); - - const 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 SetPrepaidTraff(); - void ProcessDayFeeSpread(); - void ProcessNewMonth(); - - bool IsInetable(); - string GetEnabledDirs(); - - void OnAdd(); - void OnDelete(); - -private: - 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); - - int SendMessage(STG_MSG & msg) const; - void ScanMessage(); - - time_t lastScanMessages; - - string login; - int id; - bool __connected; - USER_PROPERTY connected; + bool deleted; - bool enabledDirs[DIR_NUM]; + time_t lastWriteStat; + time_t lastWriteDetailedStat; - USER_ID_GENERATOR userIDGenerator; + // Properties + UserProperty & cash; + UserProperty & up; + UserProperty & down; + UserProperty & lastCashAdd; + UserProperty & passiveTime; + UserProperty & lastCashAddTime; + UserProperty & freeMb; + UserProperty & lastActivityTime; + UserProperty & password; + UserProperty & passive; + UserProperty & disabled; + UserProperty & disabledDetailStat; + UserProperty & alwaysOnline; + UserProperty & tariffName; + UserProperty & nextTariff; + UserProperty & address; + UserProperty & note; + UserProperty & group; + UserProperty & email; + UserProperty & phone; + UserProperty & realName; + UserProperty & credit; + UserProperty & creditExpire; + UserProperty & ips; + UserProperty & userdata0; + UserProperty & userdata1; + UserProperty & userdata2; + UserProperty & userdata3; + UserProperty & userdata4; + UserProperty & userdata5; + UserProperty & userdata6; + UserProperty & userdata7; + UserProperty & userdata8; + UserProperty & userdata9; - uint32_t __currIP; // ôÅËÕÝÉÊ ÁÄÒÅÓ ÐÏÌØÚÏ×ÁÔÅÌÑ - USER_PROPERTY currIP; + // End properties - /* - ë ÔÏÍÕ ÍÏÍÅÎÔÕ ËÁË ÍÙ ÕÖÅ ÎÅ Á×ÔÏÒÉÚÏ×ÁÎÉÙ, ÎÏ ÅÝÅ ÎÅ ×ÙÐÏÌÎÅÎ Disconnect, - currIP ÕÖÅ ÓÂÒÏÛÅÎ. ðÏÓÌÅÄÎÅÅ ÚÎÁÞÅÎÉÅ currIP ÓÏÈÒÁÎÑÅÍ × lastIPForDisconnect - */ - uint32_t lastIPForDisconnect; + DirTraff sessionUpload; + DirTraff sessionDownload; + time_t sessionUploadModTime; + time_t sessionDownloadModTime; - time_t pingTime; + ScopedConnection m_beforePassiveConn; + void onPassiveChange(int oldVal, int newVal); - const ADMIN & sysAdmin; - const BASE_STORE * store; + ScopedConnection m_afterDisabledConn; + void onDisabledChange(int oldVal, int newVal); - const TARIFFS * tariffs; - const TARIFF * tariff; + ScopedConnection m_beforeTariffConn; + void onTariffChange(const std::string& oldVal, const std::string& newVal); - TRAFF_STAT traffStat; - std::pair traffStatSaved; + ScopedConnection m_beforeCashConn; + void onCashChange(double oldVal, double newVal); - const SETTINGS * settings; + ScopedConnection m_afterIPConn; + void onIPChange(const UserIPs& oldVal, const UserIPs& newVal); - set authorizedBy; + mutable std::mutex m_mutex; - list messages; + std::string errorStr; - bool deleted; - - time_t lastWriteStat; // ÷ÒÅÍÑ ÐÏÓÌÅÄÎÅÊ ÚÁÐÉÓÉ ÓÔÁÔÉÓÔÉËÉ - time_t lastWriteDeatiledStat; // ÷ÒÅÍÑ ÐÏÓÌÅÄÎÅÊ ÚÁÐÉÓÉ ÄÅÔÁÌØÎÏÊ ÓÔÁÔÉÓÔÉËÉ - - // 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; + double getPassiveTimePart() const; }; //----------------------------------------------------------------------------- -#endif //USER_H +}