2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
23 $Date: 2010/11/03 10:50:03 $
36 #include "stg/os_int.h"
37 #include "stg/const.h"
38 #include "stg/user_stat.h"
39 #include "stg/user_conf.h"
40 #include "stg/user_ips.h"
41 #include "stg/user_property.h"
43 #include "stg/message.h"
44 #include "stg/noncopyable.h"
46 //-----------------------------------------------------------------------------
51 #ifdef USE_ABSTRACT_SETTINGS
56 //-----------------------------------------------------------------------------
57 class USER_ID_GENERATOR {
58 friend class USER_IMPL;
60 USER_ID_GENERATOR() {}
61 int GetNextID() { static int id = 0; return id++; }
63 //-----------------------------------------------------------------------------
64 class CHG_PASSIVE_NOTIFIER : public PROPERTY_NOTIFIER_BASE<int>,
67 CHG_PASSIVE_NOTIFIER(USER_IMPL * u) : user(u) {}
68 void Notify(const int & oldPassive, const int & newPassive);
71 CHG_PASSIVE_NOTIFIER(const CHG_PASSIVE_NOTIFIER & rvalue);
72 CHG_PASSIVE_NOTIFIER & operator=(const CHG_PASSIVE_NOTIFIER & rvalue);
76 //-----------------------------------------------------------------------------
77 class CHG_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE<std::string>,
80 CHG_TARIFF_NOTIFIER(USER_IMPL * u) : user(u) {}
81 void Notify(const std::string & oldTariff, const std::string & newTariff);
84 CHG_TARIFF_NOTIFIER(const CHG_TARIFF_NOTIFIER & rvalue);
85 CHG_TARIFF_NOTIFIER & operator=(const CHG_TARIFF_NOTIFIER & rvalue);
89 //-----------------------------------------------------------------------------
90 class CHG_CASH_NOTIFIER : public PROPERTY_NOTIFIER_BASE<double>,
93 CHG_CASH_NOTIFIER(USER_IMPL * u) : user(u) {}
94 void Notify(const double & oldCash, const double & newCash);
97 CHG_CASH_NOTIFIER(const CHG_CASH_NOTIFIER & rvalue);
98 CHG_CASH_NOTIFIER & operator=(const CHG_CASH_NOTIFIER & rvalue);
102 //-----------------------------------------------------------------------------
103 class CHG_IPS_NOTIFIER : public PROPERTY_NOTIFIER_BASE<USER_IPS>,
104 private NONCOPYABLE {
106 CHG_IPS_NOTIFIER(const CHG_IPS_NOTIFIER & rvalue);
107 CHG_IPS_NOTIFIER & operator=(const CHG_IPS_NOTIFIER & rvalue);
109 CHG_IPS_NOTIFIER(USER_IMPL * u) : user(u) {}
110 void Notify(const USER_IPS & oldIPs, const USER_IPS & newIPs);
115 //-----------------------------------------------------------------------------
116 class USER_IMPL : public USER {
117 friend class CHG_PASSIVE_NOTIFIER;
118 friend class CHG_TARIFF_NOTIFIER;
119 friend class CHG_CASH_NOTIFIER;
120 friend class CHG_IPS_NOTIFIER;
122 #ifdef USE_ABSTRACT_SETTINGS
123 USER_IMPL(const SETTINGS * settings,
125 const TARIFFS * tariffs,
126 const ADMIN * sysAdmin,
129 USER_IMPL(const SETTINGS_IMPL * settings,
131 const TARIFFS * tariffs,
132 const ADMIN * sysAdmin,
135 USER_IMPL(const USER_IMPL & u);
136 virtual ~USER_IMPL();
142 int WriteMonthStat();
144 const std::string & GetLogin() const { return login; }
145 void SetLogin(std::string const & l);
147 uint32_t GetCurrIP() const { return currIP; }
148 time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); }
150 void AddCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
151 void DelCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
153 void AddCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
154 void DelCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
156 void AddConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
157 void DelConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
159 void AddConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
160 void DelConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
162 int GetID() const { return id; }
164 double GetPassiveTimePart() const;
165 void ResetPassiveTime() { passiveTime = 0; }
166 void SetPassiveTimeAsNewUser();
168 int WriteDetailStat(bool hard = false);
170 const TARIFF * GetTariff() const { return tariff; }
171 void ResetNextTariff() { nextTariff = ""; }
173 #ifdef TRAFF_STAT_WITH_PORTS
174 void AddTraffStatU(int dir, uint32_t ip, uint16_t port, uint32_t len);
175 void AddTraffStatD(int dir, uint32_t ip, uint16_t port, uint32_t len);
177 void AddTraffStatU(int dir, uint32_t ip, uint32_t len);
178 void AddTraffStatD(int dir, uint32_t ip, uint32_t len);
181 const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; }
182 const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; }
184 bool GetConnected() const { return connected; }
185 time_t GetConnectedModificationTime() const { return connected.ModificationTime(); }
186 int GetAuthorized() const { return authorizedBy.size(); }
187 int Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth);
188 void Unauthorize(const AUTH * auth);
189 bool IsAuthorizedBy(const AUTH * auth) const;
191 int AddMessage(STG_MSG * msg);
193 void UpdatePingTime(time_t t = 0);
194 time_t GetPingTime() const { return pingTime; }
196 void PrintUser() const;
199 const std::string & GetStrError() const { return errorStr; }
201 USER_PROPERTIES & GetProperty() { return property; };
202 const USER_PROPERTIES & GetProperty() const { return property; };
204 void SetDeleted() { deleted = true; }
205 bool GetDeleted() const { return deleted; }
207 time_t GetLastWriteStatTime() const { return lastWriteStat; }
209 void MidnightResetSessionStat();
210 void ProcessDayFee();
211 void ProcessDayFeeSpread();
212 void ProcessNewMonth();
215 std::string GetEnabledDirs();
221 USER_IMPL & operator=(const USER_IMPL & rvalue);
224 USER_PROPERTIES property;
225 STG_LOGGER & WriteServLog;
227 void Connect(bool fakeConnect = false);
228 void Disconnect(bool fakeDisconnect, const std::string & reason);
229 int SaveMonthStat(int month, int year);
231 void SetPrepaidTraff();
233 int SendMessage(STG_MSG & msg) const;
236 time_t lastScanMessages;
241 USER_PROPERTY<bool> connected;
243 bool enabledDirs[DIR_NUM];
245 USER_ID_GENERATOR userIDGenerator;
247 uint32_t __currIP; // Current user's ip
248 USER_PROPERTY<uint32_t> currIP;
250 uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect
254 const ADMIN * sysAdmin;
257 const TARIFFS * tariffs;
258 const TARIFF * tariff;
260 TRAFF_STAT traffStat;
261 std::pair<time_t, TRAFF_STAT> traffStatSaved;
263 #ifdef USE_ABSTRACT_SETTINGS
264 const SETTINGS * settings;
266 const SETTINGS_IMPL * settings;
269 std::set<const AUTH *> authorizedBy;
271 std::list<STG_MSG> messages;
275 time_t lastWriteStat;
276 time_t lastWriteDetailedStat;
279 USER_PROPERTY<double> & cash;
280 USER_PROPERTY<DIR_TRAFF> & up;
281 USER_PROPERTY<DIR_TRAFF> & down;
282 USER_PROPERTY<double> & lastCashAdd;
283 USER_PROPERTY<time_t> & passiveTime;
284 USER_PROPERTY<time_t> & lastCashAddTime;
285 USER_PROPERTY<double> & freeMb;
286 USER_PROPERTY<time_t> & lastActivityTime;
287 USER_PROPERTY<std::string> & password;
288 USER_PROPERTY<int> & passive;
289 USER_PROPERTY<int> & disabled;
290 USER_PROPERTY<int> & disabledDetailStat;
291 USER_PROPERTY<int> & alwaysOnline;
292 USER_PROPERTY<std::string> & tariffName;
293 USER_PROPERTY<std::string> & nextTariff;
294 USER_PROPERTY<std::string> & address;
295 USER_PROPERTY<std::string> & note;
296 USER_PROPERTY<std::string> & group;
297 USER_PROPERTY<std::string> & email;
298 USER_PROPERTY<std::string> & phone;
299 USER_PROPERTY<std::string> & realName;
300 USER_PROPERTY<double> & credit;
301 USER_PROPERTY<time_t> & creditExpire;
302 USER_PROPERTY<USER_IPS> & ips;
303 USER_PROPERTY<std::string> & userdata0;
304 USER_PROPERTY<std::string> & userdata1;
305 USER_PROPERTY<std::string> & userdata2;
306 USER_PROPERTY<std::string> & userdata3;
307 USER_PROPERTY<std::string> & userdata4;
308 USER_PROPERTY<std::string> & userdata5;
309 USER_PROPERTY<std::string> & userdata6;
310 USER_PROPERTY<std::string> & userdata7;
311 USER_PROPERTY<std::string> & userdata8;
312 USER_PROPERTY<std::string> & userdata9;
316 DIR_TRAFF sessionUpload;
317 DIR_TRAFF sessionDownload;
319 CHG_PASSIVE_NOTIFIER passiveNotifier;
320 CHG_TARIFF_NOTIFIER tariffNotifier;
321 CHG_CASH_NOTIFIER cashNotifier;
322 CHG_IPS_NOTIFIER ipNotifier;
324 mutable pthread_mutex_t mutex;
326 std::string errorStr;
328 //-----------------------------------------------------------------------------
330 typedef USER_IMPL * USER_IMPL_PTR;