X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/4e02ad6c394e407ed532da55a141605681f312c4..efc31e581ff0c9ca27959ff3b2b694d401d7349c:/projects/stargazer/user_impl.cpp diff --git a/projects/stargazer/user_impl.cpp b/projects/stargazer/user_impl.cpp index 30a3c171..44fac908 100644 --- a/projects/stargazer/user_impl.cpp +++ b/projects/stargazer/user_impl.cpp @@ -59,8 +59,7 @@ USER_IMPL::USER_IMPL(const SETTINGS * s, const TARIFFS * t, const ADMIN * a, const USERS * u) - : USER(), - users(u), + : users(u), property(s->GetScriptsDir()), WriteServLog(GetStgLogger()), lastScanMessages(0), @@ -115,26 +114,12 @@ USER_IMPL::USER_IMPL(const SETTINGS * s, userdata8(property.userdata8), userdata9(property.userdata9), passiveNotifier(this), + disabledNotifier(this), tariffNotifier(this), cashNotifier(this), ipNotifier(this) { -password = "*_EMPTY_PASSWORD_*"; -tariffName = NO_TARIFF_NAME; -ips = StrToIPS("*"); -lastWriteStat = stgTime + random() % settings->GetStatWritePeriod(); -lastWriteDetailedStat = stgTime; - -property.tariffName.AddBeforeNotifier(&tariffNotifier); -property.passive.AddBeforeNotifier(&passiveNotifier); -property.disabled.AddAfterNotifier(&disabledNotifier); -property.cash.AddBeforeNotifier(&cashNotifier); -ips.AddAfterNotifier(&ipNotifier); - -pthread_mutexattr_t attr; -pthread_mutexattr_init(&attr); -pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); -pthread_mutex_init(&mutex, &attr); +Init(); } #else USER_IMPL::USER_IMPL(const SETTINGS_IMPL * s, @@ -142,8 +127,7 @@ USER_IMPL::USER_IMPL(const SETTINGS_IMPL * s, const TARIFFS * t, const ADMIN * a, const USERS * u) - : USER(), - users(u), + : users(u), property(s->GetScriptsDir()), WriteServLog(GetStgLogger()), lastScanMessages(0), @@ -203,6 +187,12 @@ USER_IMPL::USER_IMPL(const SETTINGS_IMPL * s, cashNotifier(this), ipNotifier(this) { +Init(); +} +#endif +//----------------------------------------------------------------------------- +void USER_IMPL::Init() +{ password = "*_EMPTY_PASSWORD_*"; tariffName = NO_TARIFF_NAME; ips = StrToIPS("*"); @@ -220,7 +210,6 @@ pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&mutex, &attr); } -#endif //----------------------------------------------------------------------------- USER_IMPL::USER_IMPL(const USER_IMPL & u) : USER(), @@ -319,7 +308,7 @@ pthread_mutex_destroy(&mutex); //----------------------------------------------------------------------------- void USER_IMPL::SetLogin(const std::string & l) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); assert(login.empty() && "Login is already set"); login = l; id = userIDGenerator.GetNextID(); @@ -327,7 +316,7 @@ id = userIDGenerator.GetNextID(); //----------------------------------------------------------------------------- int USER_IMPL::ReadConf() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); USER_CONF conf; if (store->RestoreUserConf(&conf, login)) @@ -375,7 +364,7 @@ return 0; //----------------------------------------------------------------------------- int USER_IMPL::ReadStat() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); USER_STAT stat; if (store->RestoreUserStat(&stat, login)) @@ -394,7 +383,7 @@ return 0; //----------------------------------------------------------------------------- int USER_IMPL::WriteConf() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); USER_CONF conf(property.GetConf()); printfd(__FILE__, "USER::WriteConf()\n"); @@ -413,7 +402,7 @@ return 0; //----------------------------------------------------------------------------- int USER_IMPL::WriteStat() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); USER_STAT stat(property.GetStat()); if (store->SaveUserStat(stat, login)) @@ -432,7 +421,7 @@ return 0; //----------------------------------------------------------------------------- int USER_IMPL::WriteMonthStat() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); time_t tt = stgTime - 3600; struct tm t1; localtime_r(&tt, &t1); @@ -452,7 +441,7 @@ return 0; //----------------------------------------------------------------------------- int USER_IMPL::Authorize(uint32_t ip, uint32_t dirs, const AUTH * auth) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); /* * Authorize user. It only means that user will be authorized. Nothing more. * User can be connected or disconnected while authorized. @@ -527,7 +516,7 @@ return 0; //----------------------------------------------------------------------------- void USER_IMPL::Unauthorize(const AUTH * auth, const std::string & reason) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); /* * Authorizer tries to unauthorize user, that was not authorized by it */ @@ -546,7 +535,7 @@ if (authorizedBy.empty()) //----------------------------------------------------------------------------- bool USER_IMPL::IsAuthorizedBy(const AUTH * auth) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); // Is this user authorized by specified authorizer? return authorizedBy.find(auth) != authorizedBy.end(); } @@ -564,7 +553,7 @@ void USER_IMPL::Connect(bool fakeConnect) * Connect user to Internet. This function is differ from Authorize() !!! */ -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (!fakeConnect) { @@ -623,7 +612,7 @@ void USER_IMPL::Disconnect(bool fakeDisconnect, const std::string & reason) * Disconnect user from Internet. This function is differ from UnAuthorize() !!! */ -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (!lastIPForDisconnect) { @@ -690,12 +679,14 @@ DIR_TRAFF zeroSesssion; sessionUpload = zeroSesssion; sessionDownload = zeroSesssion; +sessionUploadModTime = stgTime; +sessionDownloadModTime = stgTime; } //----------------------------------------------------------------------------- void USER_IMPL::PrintUser() const { //return; -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); std::cout << "============================================================" << std::endl; std::cout << "id=" << id << std::endl; std::cout << "login=" << login << std::endl; @@ -731,7 +722,7 @@ std::cout << "============================================================" << s //----------------------------------------------------------------------------- void USER_IMPL::Run() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (stgTime > static_cast(lastWriteStat + settings->GetStatWritePeriod())) { @@ -792,7 +783,7 @@ else //----------------------------------------------------------------------------- void USER_IMPL::UpdatePingTime(time_t t) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); //printfd(__FILE__, "UpdatePingTime(%d) %s\n", t, login.c_str()); if (t) pingTime = t; @@ -802,7 +793,7 @@ else //----------------------------------------------------------------------------- bool USER_IMPL::IsInetable() { -//STG_LOCKER lock(&mutex, __FILE__, __LINE__); +//STG_LOCKER lock(&mutex); if (disabled || passive) return false; @@ -823,7 +814,7 @@ return (cash - tariff->GetFee() >= -credit); //----------------------------------------------------------------------------- std::string USER_IMPL::GetEnabledDirs() const { -//STG_LOCKER lock(&mutex, __FILE__, __LINE__); +//STG_LOCKER lock(&mutex); std::string dirs = ""; for(int i = 0; i < DIR_NUM; i++) @@ -837,7 +828,7 @@ void USER_IMPL::AddTraffStatU(int dir, uint32_t ip, uint16_t port, uint32_t len) void USER_IMPL::AddTraffStatU(int dir, uint32_t ip, uint32_t len) #endif { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (!connected || tariff == NULL) return; @@ -851,10 +842,10 @@ int64_t threshold = tariff->GetThreshold(dir) * 1024 * 1024; dt[dir] += len; int tt = tariff->GetTraffType(); -if (tt == TRAFF_UP || - tt == TRAFF_UP_DOWN || +if (tt == TARIFF::TRAFF_UP || + tt == TARIFF::TRAFF_UP_DOWN || // Check NEW traff data - (tt == TRAFF_MAX && dt[dir] > down.ConstData()[dir])) + (tt == TARIFF::TRAFF_MAX && dt[dir] > down.ConstData()[dir])) { double dc = 0; if (traff < threshold && @@ -895,6 +886,7 @@ if (tt == TRAFF_UP || up = dt; sessionUpload[dir] += len; +sessionUploadModTime = stgTime; //Add detailed stat @@ -929,7 +921,7 @@ void USER_IMPL::AddTraffStatD(int dir, uint32_t ip, uint16_t port, uint32_t len) void USER_IMPL::AddTraffStatD(int dir, uint32_t ip, uint32_t len) #endif { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (!connected || tariff == NULL) return; @@ -943,10 +935,10 @@ int64_t threshold = tariff->GetThreshold(dir) * 1024 * 1024; dt[dir] += len; int tt = tariff->GetTraffType(); -if (tt == TRAFF_DOWN || - tt == TRAFF_UP_DOWN || +if (tt == TARIFF::TRAFF_DOWN || + tt == TARIFF::TRAFF_UP_DOWN || // Check NEW traff data - (tt == TRAFF_MAX && up.ConstData()[dir] <= dt[dir])) + (tt == TARIFF::TRAFF_MAX && up.ConstData()[dir] <= dt[dir])) { double dc = 0; if (traff < threshold && @@ -986,6 +978,7 @@ if (tt == TRAFF_DOWN || down = dt; sessionDownload[dir] += len; +sessionDownloadModTime = stgTime; //Add detailed stat @@ -1016,55 +1009,55 @@ else //----------------------------------------------------------------------------- void USER_IMPL::AddCurrIPBeforeNotifier(CURR_IP_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); currIP.AddBeforeNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::DelCurrIPBeforeNotifier(const CURR_IP_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); currIP.DelBeforeNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::AddCurrIPAfterNotifier(CURR_IP_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); currIP.AddAfterNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::DelCurrIPAfterNotifier(const CURR_IP_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); currIP.DelAfterNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::AddConnectedBeforeNotifier(CONNECTED_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); connected.AddBeforeNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::DelConnectedBeforeNotifier(const CONNECTED_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); connected.DelBeforeNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::AddConnectedAfterNotifier(CONNECTED_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); connected.AddAfterNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::DelConnectedAfterNotifier(const CONNECTED_NOTIFIER * notifier) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); connected.DelAfterNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::OnAdd() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); std::string scriptOnAdd = settings->GetScriptsDir() + "/OnUserAdd"; @@ -1086,7 +1079,7 @@ else //----------------------------------------------------------------------------- void USER_IMPL::OnDelete() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); std::string scriptOnDel = settings->GetScriptsDir() + "/OnUserDel"; @@ -1127,7 +1120,7 @@ if (!traffStatSaved.second.empty()) TRAFF_STAT ts; { - STG_LOCKER lock(&mutex, __FILE__, __LINE__); + STG_LOCKER lock(&mutex); ts.swap(traffStat); } @@ -1143,7 +1136,7 @@ if (ts.size() && !disabledDetailStat) if (!hard) { printfd(__FILE__, "USER::WriteDetailStat() - pushing detail stat to queue\n"); - STG_LOCKER lock(&mutex, __FILE__, __LINE__); + STG_LOCKER lock(&mutex); traffStatSaved.second.swap(ts); traffStatSaved.first = lastWriteDetailedStat; } @@ -1156,7 +1149,7 @@ return 0; //----------------------------------------------------------------------------- double USER_IMPL::GetPassiveTimePart() const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); static int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; @@ -1183,7 +1176,7 @@ return static_cast(dt) / secMonth; //----------------------------------------------------------------------------- void USER_IMPL::SetPassiveTimeAsNewUser() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); time_t t = stgTime; struct tm tm; @@ -1197,7 +1190,7 @@ passiveTime = static_cast(pt * 24 * 3600 * daysCurrMon); //----------------------------------------------------------------------------- void USER_IMPL::MidnightResetSessionStat() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (connected) { @@ -1208,7 +1201,7 @@ if (connected) //----------------------------------------------------------------------------- void USER_IMPL::ProcessNewMonth() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); // Reset traff if (connected) { @@ -1248,7 +1241,7 @@ if (nextTariff.ConstData() != "") //----------------------------------------------------------------------------- void USER_IMPL::ProcessDayFeeSpread() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (passive.ConstData() || tariff == NULL) return; @@ -1285,7 +1278,7 @@ ResetPassiveTime(); //----------------------------------------------------------------------------- void USER_IMPL::ProcessDayFee() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (tariff == NULL) return; @@ -1356,7 +1349,7 @@ switch (settings->GetFeeChargeType()) //----------------------------------------------------------------------------- void USER_IMPL::ProcessDailyFee() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (passive.ConstData() || tariff == NULL) return; @@ -1395,7 +1388,7 @@ if (tariff != NULL) //----------------------------------------------------------------------------- int USER_IMPL::AddMessage(STG_MSG * msg) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (SendMessage(*msg)) { @@ -1521,7 +1514,7 @@ std::string USER_IMPL::GetParamValue(const std::string & name) const if (lowerName == "login") return login; if (lowerName == "currip") return currIP.ToString(); if (lowerName == "enableddirs") return GetEnabledDirs(); - if (lowerName == "tariffname") return property.GetPropertyValue("tarrif"); + if (lowerName == "tariff") return property.tariffName; if (property.Exists(lowerName)) return property.GetPropertyValue(lowerName); else