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 $
31 #include "stg/user_stat.h"
32 #include "stg/user_conf.h"
33 #include "stg/user_ips.h"
34 #include "stg/user_property.h"
36 #include "stg/message.h"
37 #include "stg/noncopyable.h"
38 #include "stg/const.h"
48 //-----------------------------------------------------------------------------
53 #ifdef USE_ABSTRACT_SETTINGS
58 //-----------------------------------------------------------------------------
59 class USER_ID_GENERATOR {
60 friend class USER_IMPL;
62 USER_ID_GENERATOR() {}
63 int GetNextID() { static int id = 0; return id++; }
65 //-----------------------------------------------------------------------------
66 class CHG_PASSIVE_NOTIFIER : public PROPERTY_NOTIFIER_BASE<int>,
69 explicit CHG_PASSIVE_NOTIFIER(USER_IMPL * u) : user(u) {}
70 void Notify(const int & oldPassive, const int & newPassive);
75 //-----------------------------------------------------------------------------
76 class CHG_DISABLED_NOTIFIER : public PROPERTY_NOTIFIER_BASE<int>,
79 explicit CHG_DISABLED_NOTIFIER(USER_IMPL * u) : user(u) {}
80 void Notify(const int & oldValue, const int & newValue);
85 //-----------------------------------------------------------------------------
86 class CHG_TARIFF_NOTIFIER : public PROPERTY_NOTIFIER_BASE<std::string>,
89 explicit CHG_TARIFF_NOTIFIER(USER_IMPL * u) : user(u) {}
90 void Notify(const std::string & oldTariff, const std::string & newTariff);
95 //-----------------------------------------------------------------------------
96 class CHG_CASH_NOTIFIER : public PROPERTY_NOTIFIER_BASE<double>,
99 explicit CHG_CASH_NOTIFIER(USER_IMPL * u) : user(u) {}
100 void Notify(const double & oldCash, const double & newCash);
105 //-----------------------------------------------------------------------------
106 class CHG_IPS_NOTIFIER : public PROPERTY_NOTIFIER_BASE<USER_IPS>,
107 private NONCOPYABLE {
109 explicit 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_DISABLED_NOTIFIER;
119 friend class CHG_TARIFF_NOTIFIER;
120 friend class CHG_CASH_NOTIFIER;
121 friend class CHG_IPS_NOTIFIER;
123 #ifdef USE_ABSTRACT_SETTINGS
124 USER_IMPL(const SETTINGS * settings,
126 const TARIFFS * tariffs,
127 const ADMIN * sysAdmin,
129 const SERVICES & svcs);
131 USER_IMPL(const SETTINGS_IMPL * settings,
133 const TARIFFS * tariffs,
134 const ADMIN * sysAdmin,
136 const SERVICES & svcs);
138 USER_IMPL(const USER_IMPL & u);
139 virtual ~USER_IMPL();
145 int WriteMonthStat();
147 const std::string & GetLogin() const { return login; }
148 void SetLogin(std::string const & l);
150 uint32_t GetCurrIP() const { return currIP; }
151 time_t GetCurrIPModificationTime() const { return currIP.ModificationTime(); }
153 void AddCurrIPBeforeNotifier(CURR_IP_NOTIFIER * notifier);
154 void DelCurrIPBeforeNotifier(const CURR_IP_NOTIFIER * notifier);
156 void AddCurrIPAfterNotifier(CURR_IP_NOTIFIER * notifier);
157 void DelCurrIPAfterNotifier(const CURR_IP_NOTIFIER * notifier);
159 void AddConnectedBeforeNotifier(CONNECTED_NOTIFIER * notifier);
160 void DelConnectedBeforeNotifier(const CONNECTED_NOTIFIER * notifier);
162 void AddConnectedAfterNotifier(CONNECTED_NOTIFIER * notifier);
163 void DelConnectedAfterNotifier(const CONNECTED_NOTIFIER * notifier);
165 int GetID() const { return id; }
167 double GetPassiveTimePart() const;
168 void ResetPassiveTime() { passiveTime = 0; }
169 void SetPassiveTimeAsNewUser();
171 int WriteDetailStat(bool hard = false);
173 const TARIFF * GetTariff() const { return tariff; }
174 void ResetNextTariff() { nextTariff = ""; }
176 #ifdef TRAFF_STAT_WITH_PORTS
177 void AddTraffStatU(int dir, uint32_t ip, uint16_t port, uint32_t len);
178 void AddTraffStatD(int dir, uint32_t ip, uint16_t port, uint32_t len);
180 void AddTraffStatU(int dir, uint32_t ip, uint32_t len);
181 void AddTraffStatD(int dir, uint32_t ip, uint32_t len);
184 const DIR_TRAFF & GetSessionUpload() const { return sessionUpload; }
185 const DIR_TRAFF & GetSessionDownload() const { return sessionDownload; }
186 time_t GetSessionUploadModificationTime() const { return sessionUploadModTime; }
187 time_t GetSessionDownloadModificationTime() const { return sessionDownloadModTime; }
189 bool GetConnected() const { return connected; }
190 time_t GetConnectedModificationTime() const { return connected.ModificationTime(); }
191 const std::string & GetLastDisconnectReason() const { return lastDisconnectReason; }
192 int GetAuthorized() const { return static_cast<int>(authorizedBy.size()); }
193 time_t GetAuthorizedModificationTime() const { return authorizedModificationTime; }
194 int Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth);
195 void Unauthorize(const AUTH * auth,
196 const std::string & reason = std::string());
197 bool IsAuthorizedBy(const AUTH * auth) const;
198 std::vector<std::string> GetAuthorizers() const;
200 int AddMessage(STG_MSG * msg);
202 void UpdatePingTime(time_t t = 0);
203 time_t GetPingTime() const { return pingTime; }
207 const std::string & GetStrError() const { return errorStr; }
209 USER_PROPERTIES & GetProperty() { return property; }
210 const USER_PROPERTIES & GetProperty() const { return property; }
212 void SetDeleted() { deleted = true; }
213 bool GetDeleted() const { return deleted; }
215 time_t GetLastWriteStatTime() const { return lastWriteStat; }
217 void MidnightResetSessionStat();
218 void ProcessDayFee();
219 void ProcessDayFeeSpread();
220 void ProcessNewMonth();
221 void ProcessDailyFee();
222 void ProcessServices();
225 std::string GetEnabledDirs() const;
230 virtual std::string GetParamValue(const std::string & name) const;
233 USER_IMPL & operator=(const USER_IMPL & rvalue);
238 USER_PROPERTIES property;
239 STG_LOGGER & WriteServLog;
241 void Connect(bool fakeConnect = false);
242 void Disconnect(bool fakeDisconnect, const std::string & reason);
243 int SaveMonthStat(int month, int year);
245 void SetPrepaidTraff();
247 int SendMessage(STG_MSG & msg) const;
250 time_t lastScanMessages;
255 USER_PROPERTY<bool> connected;
257 bool enabledDirs[DIR_NUM];
259 USER_ID_GENERATOR userIDGenerator;
261 uint32_t __currIP; // Current user's ip
262 USER_PROPERTY<uint32_t> currIP;
264 uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect
265 std::string lastDisconnectReason;
269 const ADMIN * sysAdmin;
272 const TARIFFS * tariffs;
273 const TARIFF * tariff;
275 const SERVICES & m_services;
277 TRAFF_STAT traffStat;
278 std::pair<time_t, TRAFF_STAT> traffStatSaved;
280 #ifdef USE_ABSTRACT_SETTINGS
281 const SETTINGS * settings;
283 const SETTINGS_IMPL * settings;
286 std::set<const AUTH *> authorizedBy;
287 time_t authorizedModificationTime;
289 std::list<STG_MSG> messages;
293 time_t lastWriteStat;
294 time_t lastWriteDetailedStat;
297 USER_PROPERTY<double> & cash;
298 USER_PROPERTY<DIR_TRAFF> & up;
299 USER_PROPERTY<DIR_TRAFF> & down;
300 USER_PROPERTY<double> & lastCashAdd;
301 USER_PROPERTY<time_t> & passiveTime;
302 USER_PROPERTY<time_t> & lastCashAddTime;
303 USER_PROPERTY<double> & freeMb;
304 USER_PROPERTY<time_t> & lastActivityTime;
305 USER_PROPERTY<std::string> & password;
306 USER_PROPERTY<int> & passive;
307 USER_PROPERTY<int> & disabled;
308 USER_PROPERTY<int> & disabledDetailStat;
309 USER_PROPERTY<int> & alwaysOnline;
310 USER_PROPERTY<std::string> & tariffName;
311 USER_PROPERTY<std::string> & nextTariff;
312 USER_PROPERTY<std::string> & address;
313 USER_PROPERTY<std::string> & note;
314 USER_PROPERTY<std::string> & group;
315 USER_PROPERTY<std::string> & email;
316 USER_PROPERTY<std::string> & phone;
317 USER_PROPERTY<std::string> & realName;
318 USER_PROPERTY<double> & credit;
319 USER_PROPERTY<time_t> & creditExpire;
320 USER_PROPERTY<USER_IPS> & ips;
321 USER_PROPERTY<std::string> & userdata0;
322 USER_PROPERTY<std::string> & userdata1;
323 USER_PROPERTY<std::string> & userdata2;
324 USER_PROPERTY<std::string> & userdata3;
325 USER_PROPERTY<std::string> & userdata4;
326 USER_PROPERTY<std::string> & userdata5;
327 USER_PROPERTY<std::string> & userdata6;
328 USER_PROPERTY<std::string> & userdata7;
329 USER_PROPERTY<std::string> & userdata8;
330 USER_PROPERTY<std::string> & userdata9;
334 DIR_TRAFF sessionUpload;
335 DIR_TRAFF sessionDownload;
336 time_t sessionUploadModTime;
337 time_t sessionDownloadModTime;
339 CHG_PASSIVE_NOTIFIER passiveNotifier;
340 CHG_DISABLED_NOTIFIER disabledNotifier;
341 CHG_TARIFF_NOTIFIER tariffNotifier;
342 CHG_CASH_NOTIFIER cashNotifier;
343 CHG_IPS_NOTIFIER ipNotifier;
345 mutable pthread_mutex_t mutex;
347 std::string errorStr;
349 //-----------------------------------------------------------------------------
351 typedef USER_IMPL * USER_IMPL_PTR;