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);
73 //-----------------------------------------------------------------------------
74 class CHG_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE<std::string>,
77 CHG_TARIFF_NOTIFIER(USER_IMPL * u) : user(u) {}
78 void Notify(const std::string & oldTariff, const std::string & newTariff);
83 //-----------------------------------------------------------------------------
84 class CHG_CASH_NOTIFIER : public PROPERTY_NOTIFIER_BASE<double>,
87 CHG_CASH_NOTIFIER(USER_IMPL * u) : user(u) {}
88 void Notify(const double & oldCash, const double & newCash);
93 //-----------------------------------------------------------------------------
94 class CHG_IPS_NOTIFIER : public PROPERTY_NOTIFIER_BASE<USER_IPS>,
97 CHG_IPS_NOTIFIER(USER_IMPL * u) : user(u) {}
98 void Notify(const USER_IPS & oldIPs, const USER_IPS & newIPs);
103 //-----------------------------------------------------------------------------
104 class USER_IMPL : public USER {
105 friend class CHG_PASSIVE_NOTIFIER;
106 friend class CHG_TARIFF_NOTIFIER;
107 friend class CHG_CASH_NOTIFIER;
108 friend class CHG_IPS_NOTIFIER;
110 #ifdef USE_ABSTRACT_SETTINGS
111 USER_IMPL(const SETTINGS * settings,
113 const TARIFFS * tariffs,
114 const ADMIN * sysAdmin,
117 USER_IMPL(const SETTINGS_IMPL * settings,
119 const TARIFFS * tariffs,
120 const ADMIN * sysAdmin,
123 USER_IMPL(const USER_IMPL & u);
124 virtual ~USER_IMPL();
130 int WriteMonthStat();
132 const std::string & GetLogin() const { return login; }
133 void SetLogin(std::string const & l);
135 uint32_t GetCurrIP() const { return currIP; }
136 time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); }
138 void AddCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
139 void DelCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
141 void AddCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
142 void DelCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE<uint32_t> *);
144 void AddConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
145 void DelConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
147 void AddConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
148 void DelConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE<bool> *);
150 int GetID() const { return id; }
152 double GetPassiveTimePart() const;
153 void ResetPassiveTime() { passiveTime = 0; }
154 void SetPassiveTimeAsNewUser();
156 int WriteDetailStat(bool hard = false);
158 const TARIFF * GetTariff() const { return tariff; }
159 void ResetNextTariff() { nextTariff = ""; }
161 #ifdef TRAFF_STAT_WITH_PORTS
162 void AddTraffStatU(int dir, uint32_t ip, uint16_t port, uint32_t len);
163 void AddTraffStatD(int dir, uint32_t ip, uint16_t port, uint32_t len);
165 void AddTraffStatU(int dir, uint32_t ip, uint32_t len);
166 void AddTraffStatD(int dir, uint32_t ip, uint32_t len);
169 const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; }
170 const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; }
172 bool GetConnected() const { return connected; }
173 time_t GetConnectedModificationTime() const { return connected.ModificationTime(); }
174 int GetAuthorized() const { return authorizedBy.size(); }
175 int Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth);
176 void Unauthorize(const AUTH * auth);
177 bool IsAuthorizedBy(const AUTH * auth) const;
179 int AddMessage(STG_MSG * msg);
181 void UpdatePingTime(time_t t = 0);
182 time_t GetPingTime() const { return pingTime; }
184 void PrintUser() const;
187 const std::string & GetStrError() const { return errorStr; }
189 USER_PROPERTIES & GetProperty() { return property; };
190 const USER_PROPERTIES & GetProperty() const { return property; };
192 void SetDeleted() { deleted = true; }
193 bool GetDeleted() const { return deleted; }
195 time_t GetLastWriteStatTime() const { return lastWriteStat; }
197 void MidnightResetSessionStat();
198 void ProcessDayFee();
199 void SetPrepaidTraff();
200 void ProcessDayFeeSpread();
201 void ProcessNewMonth();
204 std::string GetEnabledDirs();
211 USER_PROPERTIES property;
212 STG_LOGGER & WriteServLog;
214 void Connect(bool fakeConnect = false);
215 void Disconnect(bool fakeDisconnect, const std::string & reason);
216 int SaveMonthStat(int month, int year);
218 int SendMessage(STG_MSG & msg) const;
221 time_t lastScanMessages;
226 USER_PROPERTY<bool> connected;
228 bool enabledDirs[DIR_NUM];
230 USER_ID_GENERATOR userIDGenerator;
232 uint32_t __currIP; // Current user's ip
233 USER_PROPERTY<uint32_t> currIP;
235 uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect
239 const ADMIN * sysAdmin;
242 const TARIFFS * tariffs;
243 const TARIFF * tariff;
245 TRAFF_STAT traffStat;
246 std::pair<time_t, TRAFF_STAT> traffStatSaved;
248 #ifdef USE_ABSTRACT_SETTINGS
249 const SETTINGS * settings;
251 const SETTINGS_IMPL * settings;
254 std::set<const AUTH *> authorizedBy;
256 std::list<STG_MSG> messages;
260 time_t lastWriteStat;
261 time_t lastWriteDetailedStat;
264 USER_PROPERTY<double> & cash;
265 USER_PROPERTY<DIR_TRAFF> & up;
266 USER_PROPERTY<DIR_TRAFF> & down;
267 USER_PROPERTY<double> & lastCashAdd;
268 USER_PROPERTY<time_t> & passiveTime;
269 USER_PROPERTY<time_t> & lastCashAddTime;
270 USER_PROPERTY<double> & freeMb;
271 USER_PROPERTY<time_t> & lastActivityTime;
272 USER_PROPERTY<std::string> & password;
273 USER_PROPERTY<int> & passive;
274 USER_PROPERTY<int> & disabled;
275 USER_PROPERTY<int> & disabledDetailStat;
276 USER_PROPERTY<int> & alwaysOnline;
277 USER_PROPERTY<std::string> & tariffName;
278 USER_PROPERTY<std::string> & nextTariff;
279 USER_PROPERTY<std::string> & address;
280 USER_PROPERTY<std::string> & note;
281 USER_PROPERTY<std::string> & group;
282 USER_PROPERTY<std::string> & email;
283 USER_PROPERTY<std::string> & phone;
284 USER_PROPERTY<std::string> & realName;
285 USER_PROPERTY<double> & credit;
286 USER_PROPERTY<time_t> & creditExpire;
287 USER_PROPERTY<USER_IPS> & ips;
288 USER_PROPERTY<std::string> & userdata0;
289 USER_PROPERTY<std::string> & userdata1;
290 USER_PROPERTY<std::string> & userdata2;
291 USER_PROPERTY<std::string> & userdata3;
292 USER_PROPERTY<std::string> & userdata4;
293 USER_PROPERTY<std::string> & userdata5;
294 USER_PROPERTY<std::string> & userdata6;
295 USER_PROPERTY<std::string> & userdata7;
296 USER_PROPERTY<std::string> & userdata8;
297 USER_PROPERTY<std::string> & userdata9;
301 DIR_TRAFF sessionUpload;
302 DIR_TRAFF sessionDownload;
304 CHG_PASSIVE_NOTIFIER passiveNotifier;
305 CHG_TARIFF_NOTIFIER tariffNotifier;
306 CHG_CASH_NOTIFIER cashNotifier;
307 CHG_IPS_NOTIFIER ipNotifier;
309 mutable pthread_mutex_t mutex;
311 std::string errorStr;
313 //-----------------------------------------------------------------------------
315 typedef USER_IMPL * USER_IMPL_PTR;