X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/5ff8211bdcd5f110621c0ff01fa0854b5e6d9762..ebd170a764ab9660adee464588cda1801c7986b4:/projects/stargazer/user_impl.h diff --git a/projects/stargazer/user_impl.h b/projects/stargazer/user_impl.h index 2fc2729e..c5b30a1d 100644 --- a/projects/stargazer/user_impl.h +++ b/projects/stargazer/user_impl.h @@ -18,23 +18,9 @@ * Author : Boris Mikhailenko <stg34@stargazer.dp.ua> */ -/* - $Revision: 1.48 $ - $Date: 2010/11/03 10:50:03 $ - $Author: faust $ - */ - -#ifndef USER_IMPL_H -#define USER_IMPL_H - -#include <ctime> -#include <list> -#include <string> -#include <set> +#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,291 +28,237 @@ #include "stg/auth.h" #include "stg/message.h" #include "stg/noncopyable.h" +#include "stg/const.h" + +#include <vector> +#include <string> +#include <set> +#include <mutex> + +#include <ctime> +#include <cstdint> + +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<int>, - private NONCOPYABLE { -public: - CHG_PASSIVE_NOTIFIER(USER_IMPL * u) : user(u) {} - void Notify(const int & oldPassive, const int & newPassive); +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); -private: - CHG_PASSIVE_NOTIFIER(const CHG_PASSIVE_NOTIFIER & rvalue); - CHG_PASSIVE_NOTIFIER & operator=(const CHG_PASSIVE_NOTIFIER & rvalue); + int ReadConf(); + int ReadStat(); + int WriteConf() override; + int WriteStat() override; + int WriteMonthStat(); - USER_IMPL * user; -}; -//----------------------------------------------------------------------------- -class CHG_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE<std::string>, - private NONCOPYABLE { -public: - CHG_TARIFF_NOTIFIER(USER_IMPL * u) : user(u) {} - void Notify(const std::string & oldTariff, const std::string & newTariff); + const std::string & GetLogin() const override { return login; } + void SetLogin(std::string const & l); -private: - CHG_TARIFF_NOTIFIER(const CHG_TARIFF_NOTIFIER & rvalue); - CHG_TARIFF_NOTIFIER & operator=(const CHG_TARIFF_NOTIFIER & rvalue); + int GetID() const override { return id; } - USER_IMPL * user; -}; -//----------------------------------------------------------------------------- -class CHG_CASH_NOTIFIER : public PROPERTY_NOTIFIER_BASE<double>, - private NONCOPYABLE { -public: - CHG_CASH_NOTIFIER(USER_IMPL * u) : user(u) {} - void Notify(const double & oldCash, const double & newCash); + double GetPassiveTimePart() const override; + void ResetPassiveTime() { passiveTime = 0; } + void SetPassiveTimeAsNewUser(); -private: - CHG_CASH_NOTIFIER(const CHG_CASH_NOTIFIER & rvalue); - CHG_CASH_NOTIFIER & operator=(const CHG_CASH_NOTIFIER & rvalue); + int WriteDetailStat(bool hard = false); - USER_IMPL * user; -}; -//----------------------------------------------------------------------------- -class CHG_IPS_NOTIFIER : public PROPERTY_NOTIFIER_BASE<USER_IPS>, - private NONCOPYABLE { -public: - CHG_IPS_NOTIFIER(const CHG_IPS_NOTIFIER & rvalue); - CHG_IPS_NOTIFIER & operator=(const CHG_IPS_NOTIFIER & rvalue); + const Tariff * GetTariff() const override { return tariff; } + void ResetNextTariff() override { nextTariff = ""; } - CHG_IPS_NOTIFIER(USER_IMPL * u) : user(u) {} - void Notify(const USER_IPS & oldIPs, const USER_IPS & newIPs); + #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 -private: - USER_IMPL * user; -}; -//----------------------------------------------------------------------------- -class USER_IMPL : public USER { -friend class CHG_PASSIVE_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); -#else - USER_IMPL(const SETTINGS_IMPL * settings, - const STORE * store, - const TARIFFS * tariffs, - const ADMIN * sysAdmin, - const USERS * u); -#endif - USER_IMPL(const USER_IMPL & u); - virtual ~USER_IMPL(); + 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; } - int ReadConf(); - int ReadStat(); - int WriteConf(); - int WriteStat(); - int WriteMonthStat(); + const std::string & GetLastDisconnectReason() const override { return lastDisconnectReason; } + int GetAuthorized() const override { return static_cast<int>(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<std::string> GetAuthorizers() const override; - const std::string & GetLogin() const { return login; } - void SetLogin(std::string const & l); + int AddMessage(Message * msg) override; - uint32_t GetCurrIP() const { return currIP; } - time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); } + void UpdatePingTime(time_t t = 0) override; + time_t GetPingTime() const override { return pingTime; } - void AddCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *); - void DelCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *); + void Run() override; - void AddCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *); - void DelCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *); + const std::string & GetStrError() const override { return errorStr; } - void AddConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *); - void DelConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *); + UserProperties & GetProperties() override { return properties; } + const UserProperties & GetProperties() const override { return properties; } - void AddConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *); - void DelConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *); + void SetDeleted() override { deleted = true; } + bool GetDeleted() const override { return deleted; } - int GetID() const { return id; } + time_t GetLastWriteStatTime() const override { return lastWriteStat; } - double GetPassiveTimePart() const; - void ResetPassiveTime() { passiveTime = 0; } - void SetPassiveTimeAsNewUser(); + void MidnightResetSessionStat(); + void ProcessDayFee(); + void ProcessDayFeeSpread(); + void ProcessNewMonth(); + void ProcessDailyFee(); + void ProcessServices(); - int WriteDetailStat(bool hard = false); + bool IsInetable() override; + std::string GetEnabledDirs() const override; + + void OnAdd() override; + void OnDelete() override; + + virtual std::string GetParamValue(const std::string & name) const override; - const TARIFF * GetTariff() const { return tariff; } - void ResetNextTariff() { nextTariff = ""; } + private: + UserImpl & operator=(const UserImpl & rvalue); - #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 Init(); - const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; } - const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; } + const Users* users; + UserProperties properties; + STG::Logger& WriteServLog; - bool GetConnected() const { return connected; } - time_t GetConnectedModificationTime() const { return connected.ModificationTime(); } - int GetAuthorized() const { return authorizedBy.size(); } - int Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth); - void Unauthorize(const AUTH * auth); - bool IsAuthorizedBy(const AUTH * auth) const; + void Connect(bool fakeConnect = false); + void Disconnect(bool fakeDisconnect, const std::string & reason); + int SaveMonthStat(int month, int year); - int AddMessage(STG_MSG * msg); + void SetPrepaidTraff(); - void UpdatePingTime(time_t t = 0); - time_t GetPingTime() const { return pingTime; } + int SendMessage(Message & msg) const; + void ScanMessage(); - void PrintUser() const; - void Run(); + time_t lastScanMessages; - const std::string & GetStrError() const { return errorStr; } + std::string login; + int id; - USER_PROPERTIES & GetProperty() { return property; }; - const USER_PROPERTIES & GetProperty() const { return property; }; + bool enabledDirs[DIR_NUM]; - void SetDeleted() { deleted = true; } - bool GetDeleted() const { return deleted; } + uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect + std::string lastDisconnectReason; - time_t GetLastWriteStatTime() const { return lastWriteStat; } + time_t pingTime; - void MidnightResetSessionStat(); - void ProcessDayFee(); - void ProcessDayFeeSpread(); - void ProcessNewMonth(); + const Admin * sysAdmin; + const Store * store; - bool IsInetable(); - std::string GetEnabledDirs(); + const Tariffs * tariffs; + const Tariff * tariff; - void OnAdd(); - void OnDelete(); + const Services & m_services; -private: - USER_IMPL & operator=(const USER_IMPL & rvalue); + TraffStat traffStat; + std::pair<time_t, TraffStat> traffStatSaved; - const USERS * users; - USER_PROPERTIES property; - STG_LOGGER & WriteServLog; + const Settings * settings; - void Connect(bool fakeConnect = false); - void Disconnect(bool fakeDisconnect, const std::string & reason); - int SaveMonthStat(int month, int year); + std::set<const Auth *> authorizedBy; + time_t authorizedModificationTime; - void SetPrepaidTraff(); + std::vector<Message> messages; - int SendMessage(STG_MSG & msg) const; - void ScanMessage(); + bool deleted; - time_t lastScanMessages; + time_t lastWriteStat; + time_t lastWriteDetailedStat; - std::string login; - int id; - bool __connected; - USER_PROPERTY<bool> connected; + // Properties + UserProperty<double> & cash; + UserProperty<DirTraff> & up; + UserProperty<DirTraff> & down; + UserProperty<double> & lastCashAdd; + UserProperty<time_t> & passiveTime; + UserProperty<time_t> & lastCashAddTime; + UserProperty<double> & freeMb; + UserProperty<time_t> & lastActivityTime; + UserProperty<std::string> & password; + UserProperty<int> & passive; + UserProperty<int> & disabled; + UserProperty<int> & disabledDetailStat; + UserProperty<int> & alwaysOnline; + UserProperty<std::string> & tariffName; + UserProperty<std::string> & nextTariff; + UserProperty<std::string> & address; + UserProperty<std::string> & note; + UserProperty<std::string> & group; + UserProperty<std::string> & email; + UserProperty<std::string> & phone; + UserProperty<std::string> & realName; + UserProperty<double> & credit; + UserProperty<time_t> & creditExpire; + UserProperty<UserIPs> & ips; + UserProperty<std::string> & userdata0; + UserProperty<std::string> & userdata1; + UserProperty<std::string> & userdata2; + UserProperty<std::string> & userdata3; + UserProperty<std::string> & userdata4; + UserProperty<std::string> & userdata5; + UserProperty<std::string> & userdata6; + UserProperty<std::string> & userdata7; + UserProperty<std::string> & userdata8; + UserProperty<std::string> & userdata9; - bool enabledDirs[DIR_NUM]; + // End properties - USER_ID_GENERATOR userIDGenerator; + DirTraff sessionUpload; + DirTraff sessionDownload; + time_t sessionUploadModTime; + time_t sessionDownloadModTime; - uint32_t __currIP; // Current user's ip - USER_PROPERTY<uint32_t> currIP; + ScopedConnection m_beforePassiveConn; + void onPassiveChange(int oldVal, int newVal); - uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect + ScopedConnection m_afterDisabledConn; + void onDisabledChange(int oldVal, int newVal); - time_t pingTime; + ScopedConnection m_beforeTariffConn; + void onTariffChange(const std::string& oldVal, const std::string& newVal); - const ADMIN * sysAdmin; - const STORE * store; + ScopedConnection m_beforeCashConn; + void onCashChange(double oldVal, double newVal); - const TARIFFS * tariffs; - const TARIFF * tariff; + ScopedConnection m_afterIPConn; + void onIPChange(const UserIPs& oldVal, const UserIPs& newVal); - TRAFF_STAT traffStat; - std::pair<time_t, TRAFF_STAT> traffStatSaved; + mutable std::mutex m_mutex; -#ifdef USE_ABSTRACT_SETTINGS - const SETTINGS * settings; -#else - const SETTINGS_IMPL * settings; -#endif + std::string errorStr; - std::set<const AUTH *> authorizedBy; - - std::list<STG_MSG> messages; - - bool deleted; - - time_t lastWriteStat; - time_t lastWriteDetailedStat; - - // Properties - USER_PROPERTY<double> & cash; - USER_PROPERTY<DIR_TRAFF> & up; - USER_PROPERTY<DIR_TRAFF> & down; - USER_PROPERTY<double> & lastCashAdd; - USER_PROPERTY<time_t> & passiveTime; - USER_PROPERTY<time_t> & lastCashAddTime; - USER_PROPERTY<double> & freeMb; - USER_PROPERTY<time_t> & lastActivityTime; - USER_PROPERTY<std::string> & password; - USER_PROPERTY<int> & passive; - USER_PROPERTY<int> & disabled; - USER_PROPERTY<int> & disabledDetailStat; - USER_PROPERTY<int> & alwaysOnline; - USER_PROPERTY<std::string> & tariffName; - USER_PROPERTY<std::string> & nextTariff; - USER_PROPERTY<std::string> & address; - USER_PROPERTY<std::string> & note; - USER_PROPERTY<std::string> & group; - USER_PROPERTY<std::string> & email; - USER_PROPERTY<std::string> & phone; - USER_PROPERTY<std::string> & realName; - USER_PROPERTY<double> & credit; - USER_PROPERTY<time_t> & creditExpire; - USER_PROPERTY<USER_IPS> & ips; - USER_PROPERTY<std::string> & userdata0; - USER_PROPERTY<std::string> & userdata1; - USER_PROPERTY<std::string> & userdata2; - USER_PROPERTY<std::string> & userdata3; - USER_PROPERTY<std::string> & userdata4; - USER_PROPERTY<std::string> & userdata5; - USER_PROPERTY<std::string> & userdata6; - USER_PROPERTY<std::string> & userdata7; - USER_PROPERTY<std::string> & userdata8; - USER_PROPERTY<std::string> & userdata9; - - // End properties - - DIR_TRAFF sessionUpload; - DIR_TRAFF sessionDownload; - - CHG_PASSIVE_NOTIFIER passiveNotifier; - CHG_TARIFF_NOTIFIER tariffNotifier; - CHG_CASH_NOTIFIER cashNotifier; - CHG_IPS_NOTIFIER ipNotifier; - - mutable pthread_mutex_t mutex; - - std::string errorStr; + double getPassiveTimePart() const; }; //----------------------------------------------------------------------------- -typedef USER_IMPL * USER_IMPL_PTR; - -#endif //USER_H +}