X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/4271ab433cd55bbd2612292bcf39e4dc3d7274f1..0907aa4037b12b6b88ee24495d4577a064d4f8db:/projects/stargazer/user_impl.h diff --git a/projects/stargazer/user_impl.h b/projects/stargazer/user_impl.h new file mode 100644 index 00000000..2e254d63 --- /dev/null +++ b/projects/stargazer/user_impl.h @@ -0,0 +1,324 @@ +/* + * 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 + */ + +#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 + +namespace STG +{ + +//----------------------------------------------------------------------------- +struct Tariff; +struct Tariffs; +struct Admin; +class UserImpl; +#ifdef USE_ABSTRACT_SETTINGS +struct Settings; +#else +class SettingsImpl; +#endif +//----------------------------------------------------------------------------- +class CHG_PASSIVE_NOTIFIER : public PropertyNotifierBase { + public: + explicit CHG_PASSIVE_NOTIFIER(UserImpl * u) : user(u) {} + void Notify(const int & oldPassive, const int & newPassive); + + private: + UserImpl * user; +}; +//----------------------------------------------------------------------------- +class CHG_DISABLED_NOTIFIER : public PropertyNotifierBase { +public: + explicit CHG_DISABLED_NOTIFIER(UserImpl * u) : user(u) {} + void Notify(const int & oldValue, const int & newValue); + +private: + UserImpl * user; +}; +//----------------------------------------------------------------------------- +class CHG_TARIFF_NOTIFIER : public PropertyNotifierBase { +public: + explicit CHG_TARIFF_NOTIFIER(UserImpl * u) : user(u) {} + void Notify(const std::string & oldTariff, const std::string & newTariff); + +private: + UserImpl * user; +}; +//----------------------------------------------------------------------------- +class CHG_CASH_NOTIFIER : public PropertyNotifierBase { +public: + explicit CHG_CASH_NOTIFIER(UserImpl * u) : user(u) {} + void Notify(const double & oldCash, const double & newCash); + +private: + UserImpl * user; +}; +//----------------------------------------------------------------------------- +class CHG_IPS_NOTIFIER : public PropertyNotifierBase { +public: + explicit CHG_IPS_NOTIFIER(UserImpl * u) : user(u) {} + void Notify(const UserIPs & oldIPs, const UserIPs & newIPs); + +private: + UserImpl * user; +}; +//----------------------------------------------------------------------------- +class UserImpl : 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 + 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); + virtual ~UserImpl(); + + 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); + + uint32_t GetCurrIP() const override{ return currIP; } + time_t GetCurrIPModificationTime() const override { return currIP.ModificationTime(); } + + void AddCurrIPBeforeNotifier(CURR_IP_NOTIFIER * notifier) override; + void DelCurrIPBeforeNotifier(const CURR_IP_NOTIFIER * notifier) override; + + void AddCurrIPAfterNotifier(CURR_IP_NOTIFIER * notifier) override; + void DelCurrIPAfterNotifier(const CURR_IP_NOTIFIER * notifier) override; + + void AddConnectedBeforeNotifier(CONNECTED_NOTIFIER * notifier) override; + void DelConnectedBeforeNotifier(const CONNECTED_NOTIFIER * notifier) override; + + void AddConnectedAfterNotifier(CONNECTED_NOTIFIER * notifier) override; + void DelConnectedAfterNotifier(const CONNECTED_NOTIFIER * notifier) override; + + 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; } + + bool GetConnected() const override { return connected; } + time_t GetConnectedModificationTime() const override { return connected.ModificationTime(); } + 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); + + void SetPrepaidTraff(); + + int SendMessage(Message & msg) const; + void ScanMessage(); + + time_t lastScanMessages; + + std::string login; + int id; + bool __connected; + UserProperty connected; + + bool enabledDirs[DIR_NUM]; + + uint32_t __currIP; // Current user's ip + UserProperty 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; + + TraffStat traffStat; + std::pair traffStatSaved; + + const Settings * settings; + + std::set authorizedBy; + time_t authorizedModificationTime; + + std::vector messages; + + bool deleted; + + time_t lastWriteStat; + time_t lastWriteDetailedStat; + + // 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; + + // End properties + + DirTraff sessionUpload; + DirTraff 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; +}; +//----------------------------------------------------------------------------- + +}