X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/810c900ba1bcb412f12eda3a39561b0ff5a72b35..HEAD:/projects/stargazer/user_impl.h diff --git a/projects/stargazer/user_impl.h b/projects/stargazer/user_impl.h index eacf91ee..c5b30a1d 100644 --- a/projects/stargazer/user_impl.h +++ b/projects/stargazer/user_impl.h @@ -18,23 +18,9 @@ * 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 -#include -#include +#pragma once #include "stg/user.h" -#include "stg/os_int.h" -#include "stg/const.h" #include "stg/user_stat.h" #include "stg/user_conf.h" #include "stg/user_ips.h" @@ -42,294 +28,237 @@ #include "stg/auth.h" #include "stg/message.h" #include "stg/noncopyable.h" +#include "stg/const.h" + +#include +#include +#include +#include + +#include +#include + +namespace STG +{ //----------------------------------------------------------------------------- -class TARIFF; -class TARIFFS; -class ADMIN; -class USER_IMPL; +struct Tariff; +class Tariffs; +class Admin; +class UserImpl; #ifdef USE_ABSTRACT_SETTINGS -class SETTINGS; +struct Settings; #else -class SETTINGS_IMPL; +class SettingsImpl; #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: +class UserImpl : public User +{ + public: #ifdef USE_ABSTRACT_SETTINGS - USER_IMPL(const SETTINGS * settings, - const STORE * store, - const TARIFFS * tariffs, - const ADMIN * sysAdmin, - const USERS * u); + using Settings = STG::Settings; #else - USER_IMPL(const SETTINGS_IMPL * settings, - const STORE * store, - const TARIFFS * tariffs, - const ADMIN * sysAdmin, - const USERS * u); + using Settings = STG::SettingsImpl; #endif - USER_IMPL(const USER_IMPL & u); - virtual ~USER_IMPL(); + 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(); - int WriteStat(); - int WriteMonthStat(); + int ReadConf(); + int ReadStat(); + int WriteConf() override; + int WriteStat() override; + int WriteMonthStat(); - const std::string & GetLogin() const { return login; } - void SetLogin(std::string const & l); + const std::string & GetLogin() const override { return login; } + void SetLogin(std::string const & l); - uint32_t GetCurrIP() const { return currIP; } - time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); } + int GetID() const override { return id; } - void AddCurrIPBeforeNotifier(CURR_IP_NOTIFIER * notifier); - void DelCurrIPBeforeNotifier(const CURR_IP_NOTIFIER * notifier); + double GetPassiveTimePart() const override; + void ResetPassiveTime() { passiveTime = 0; } + void SetPassiveTimeAsNewUser(); - void AddCurrIPAfterNotifier(CURR_IP_NOTIFIER * notifier); - void DelCurrIPAfterNotifier(const CURR_IP_NOTIFIER * notifier); + int WriteDetailStat(bool hard = false); - void AddConnectedBeforeNotifier(CONNECTED_NOTIFIER * notifier); - void DelConnectedBeforeNotifier(const CONNECTED_NOTIFIER * notifier); + const Tariff * GetTariff() const override { return tariff; } + void ResetNextTariff() override { nextTariff = ""; } - void AddConnectedAfterNotifier(CONNECTED_NOTIFIER * notifier); - void DelConnectedAfterNotifier(const CONNECTED_NOTIFIER * notifier); + #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 - int GetID() const { return id; } + 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; } - double GetPassiveTimePart() const; - void ResetPassiveTime() { passiveTime = 0; } - void SetPassiveTimeAsNewUser(); + 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 WriteDetailStat(bool hard = false); + int AddMessage(Message * msg) override; - const TARIFF * GetTariff() const { return tariff; } - void ResetNextTariff() { nextTariff = ""; } + void UpdatePingTime(time_t t = 0) override; + time_t GetPingTime() const override { return pingTime; } - #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 + void Run() override; - const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; } - const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; } + const std::string & GetStrError() const override { return errorStr; } - bool GetConnected() const { return connected; } - time_t GetConnectedModificationTime() const { return connected.ModificationTime(); } - int GetAuthorized() const { return static_cast(authorizedBy.size()); } - int Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth); - void Unauthorize(const AUTH * auth); - bool IsAuthorizedBy(const AUTH * auth) const; + UserProperties & GetProperties() override { return properties; } + const UserProperties & GetProperties() const override { return properties; } - int AddMessage(STG_MSG * msg); + void SetDeleted() override { deleted = true; } + bool GetDeleted() const override { return deleted; } - void UpdatePingTime(time_t t = 0); - time_t GetPingTime() const { return pingTime; } + time_t GetLastWriteStatTime() const override { return lastWriteStat; } - void PrintUser() const; - void Run(); + void MidnightResetSessionStat(); + void ProcessDayFee(); + void ProcessDayFeeSpread(); + void ProcessNewMonth(); + void ProcessDailyFee(); + void ProcessServices(); - const std::string & GetStrError() const { return errorStr; } + bool IsInetable() override; + std::string GetEnabledDirs() const override; + + void OnAdd() override; + void OnDelete() override; + + virtual std::string GetParamValue(const std::string & name) const override; - USER_PROPERTIES & GetProperty() { return property; } - const USER_PROPERTIES & GetProperty() const { return property; } + private: + UserImpl & operator=(const UserImpl & rvalue); - void SetDeleted() { deleted = true; } - bool GetDeleted() const { return deleted; } + void Init(); - time_t GetLastWriteStatTime() const { return lastWriteStat; } + const Users* users; + UserProperties properties; + STG::Logger& WriteServLog; - void MidnightResetSessionStat(); - void ProcessDayFee(); - void ProcessDayFeeSpread(); - void ProcessNewMonth(); + void Connect(bool fakeConnect = false); + void Disconnect(bool fakeDisconnect, const std::string & reason); + int SaveMonthStat(int month, int year); - bool IsInetable(); + void SetPrepaidTraff(); - std::string GetEnabledDirs() const; + int SendMessage(Message & msg) const; + void ScanMessage(); - void OnAdd(); - void OnDelete(); + time_t lastScanMessages; - virtual std::string GetParamValue(const std::string & name) const; + std::string login; + int id; -private: - USER_IMPL & operator=(const USER_IMPL & rvalue); + bool enabledDirs[DIR_NUM]; - const USERS * users; - USER_PROPERTIES property; - STG_LOGGER & WriteServLog; + uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect + std::string lastDisconnectReason; - void Connect(bool fakeConnect = false); - void Disconnect(bool fakeDisconnect, const std::string & reason); - int SaveMonthStat(int month, int year); + time_t pingTime; - void SetPrepaidTraff(); + const Admin * sysAdmin; + const Store * store; - int SendMessage(STG_MSG & msg) const; - void ScanMessage(); + const Tariffs * tariffs; + const Tariff * tariff; - time_t lastScanMessages; + const Services & m_services; - std::string login; - int id; - bool __connected; - USER_PROPERTY connected; + TraffStat traffStat; + std::pair traffStatSaved; - bool enabledDirs[DIR_NUM]; + const Settings * settings; - USER_ID_GENERATOR userIDGenerator; + std::set authorizedBy; + time_t authorizedModificationTime; - uint32_t __currIP; // Current user's ip - USER_PROPERTY currIP; + std::vector messages; - uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect + bool deleted; - time_t pingTime; + time_t lastWriteStat; + time_t lastWriteDetailedStat; - const ADMIN * sysAdmin; - const STORE * store; + // 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; - const TARIFFS * tariffs; - const TARIFF * tariff; + // End properties - TRAFF_STAT traffStat; - std::pair traffStatSaved; + DirTraff sessionUpload; + DirTraff sessionDownload; + time_t sessionUploadModTime; + time_t sessionDownloadModTime; -#ifdef USE_ABSTRACT_SETTINGS - const SETTINGS * settings; -#else - const SETTINGS_IMPL * settings; -#endif + ScopedConnection m_beforePassiveConn; + void onPassiveChange(int oldVal, int newVal); + + ScopedConnection m_afterDisabledConn; + void onDisabledChange(int oldVal, int newVal); + + ScopedConnection m_beforeTariffConn; + void onTariffChange(const std::string& oldVal, const std::string& newVal); + + ScopedConnection m_beforeCashConn; + void onCashChange(double oldVal, double newVal); - std::set authorizedBy; - - 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; - - 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; + ScopedConnection m_afterIPConn; + void onIPChange(const UserIPs& oldVal, const UserIPs& newVal); + + mutable std::mutex m_mutex; + + std::string errorStr; + + double getPassiveTimePart() const; }; //----------------------------------------------------------------------------- -typedef USER_IMPL * USER_IMPL_PTR; - -#endif //USER_H +}