X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/8e8c6cdddc6af0a1e7ebcd7fa947395b66bf1103..04711171fa39f7b76f5f4f291a016ddbe4ddcccd:/projects/stargazer/user_impl.cpp?ds=sidebyside diff --git a/projects/stargazer/user_impl.cpp b/projects/stargazer/user_impl.cpp index 733e6256..37178dd6 100644 --- a/projects/stargazer/user_impl.cpp +++ b/projects/stargazer/user_impl.cpp @@ -37,6 +37,9 @@ #include #include +#include +#include +#include #include "stg/users.h" #include "stg/common.h" @@ -132,6 +135,7 @@ lastWriteDetailedStat = stgTime; property.tariffName.AddBeforeNotifier(&tariffNotifier); property.passive.AddBeforeNotifier(&passiveNotifier); +property.disabled.AddAfterNotifier(&disabledNotifier); property.cash.AddBeforeNotifier(&cashNotifier); ips.AddAfterNotifier(&ipNotifier); @@ -210,6 +214,7 @@ USER_IMPL::USER_IMPL(const SETTINGS_IMPL * s, sessionUpload(), sessionDownload(), passiveNotifier(this), + disabledNotifier(this), tariffNotifier(this), cashNotifier(this), ipNotifier(this), @@ -224,6 +229,7 @@ lastWriteDetailedStat = stgTime; property.tariffName.AddBeforeNotifier(&tariffNotifier); property.passive.AddBeforeNotifier(&passiveNotifier); +property.disabled.AddAfterNotifier(&disabledNotifier); property.cash.AddBeforeNotifier(&cashNotifier); ips.AddAfterNotifier(&ipNotifier); @@ -299,6 +305,7 @@ USER_IMPL::USER_IMPL(const USER_IMPL & u) sessionUpload(), sessionDownload(), passiveNotifier(this), + disabledNotifier(this), tariffNotifier(this), cashNotifier(this), ipNotifier(this), @@ -310,6 +317,7 @@ if (&u == this) property.tariffName.AddBeforeNotifier(&tariffNotifier); property.passive.AddBeforeNotifier(&passiveNotifier); +property.disabled.AddAfterNotifier(&disabledNotifier); property.cash.AddBeforeNotifier(&cashNotifier); ips.AddAfterNotifier(&ipNotifier); @@ -323,12 +331,14 @@ pthread_mutex_init(&mutex, &attr); //----------------------------------------------------------------------------- USER_IMPL::~USER_IMPL() { -property.passive.DelBeforeNotifier(&passiveNotifier); property.tariffName.DelBeforeNotifier(&tariffNotifier); +property.passive.DelBeforeNotifier(&passiveNotifier); +property.disabled.DelAfterNotifier(&disabledNotifier); +property.cash.DelBeforeNotifier(&cashNotifier); pthread_mutex_destroy(&mutex); } //----------------------------------------------------------------------------- -void USER_IMPL::SetLogin(string const & l) +void USER_IMPL::SetLogin(const std::string & l) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); assert(login.empty() && "Login is already set"); @@ -534,7 +544,7 @@ ScanMessage(); return 0; } //----------------------------------------------------------------------------- -void USER_IMPL::Unauthorize(const AUTH * auth) +void USER_IMPL::Unauthorize(const AUTH * auth, const std::string & reason) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); /* @@ -545,6 +555,7 @@ if (!authorizedBy.erase(auth)) if (authorizedBy.empty()) { + lastDisconnectReason = reason; lastIPForDisconnect = currIP; currIP = 0; // DelUser in traffcounter return; @@ -558,6 +569,13 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__); return authorizedBy.find(auth) != authorizedBy.end(); } //----------------------------------------------------------------------------- +std::vector USER_IMPL::GetAuthorizers() const +{ + std::vector list; + std::transform(authorizedBy.begin(), authorizedBy.end(), std::back_inserter(list), std::mem_fun(&AUTH::GetVersion)); + return list; +} +//----------------------------------------------------------------------------- void USER_IMPL::Connect(bool fakeConnect) { /* @@ -568,7 +586,7 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__); if (!fakeConnect) { - string scriptOnConnect = settings->GetScriptsDir() + "/OnConnect"; + std::string scriptOnConnect = settings->GetScriptsDir() + "/OnConnect"; if (access(scriptOnConnect.c_str(), X_OK) == 0) { @@ -579,13 +597,13 @@ if (!fakeConnect) dirsStr[i] = enabledDirs[i] ? '1' : '0'; } - string scriptOnConnectParams; + std::string scriptOnConnectParams; strprintf(&scriptOnConnectParams, "%s \"%s\" \"%s\" \"%f\" \"%d\" \"%s\"", scriptOnConnect.c_str(), login.c_str(), inet_ntostring(currIP).c_str(), - (double)cash, + cash.ConstData(), id, dirsStr); @@ -625,7 +643,7 @@ if (!lastIPForDisconnect) if (!fakeDisconnect) { - string scriptOnDisonnect = settings->GetScriptsDir() + "/OnDisconnect"; + std::string scriptOnDisonnect = settings->GetScriptsDir() + "/OnDisconnect"; if (access(scriptOnDisonnect.c_str(), X_OK) == 0) { @@ -636,13 +654,13 @@ if (!fakeDisconnect) dirsStr[i] = enabledDirs[i] ? '1' : '0'; } - string scriptOnDisonnectParams; + std::string scriptOnDisonnectParams; strprintf(&scriptOnDisonnectParams, "%s \"%s\" \"%s\" \"%f\" \"%d\" \"%s\"", scriptOnDisonnect.c_str(), login.c_str(), inet_ntostring(lastIPForDisconnect).c_str(), - (double)cash, + cash.ConstData(), id, dirsStr); @@ -656,7 +674,12 @@ if (!fakeDisconnect) connected = false; } -if (store->WriteUserDisconnect(login, up, down, sessionUpload, sessionDownload, cash, freeMb, reason)) +std::string reasonMessage(reason); +if (!lastDisconnectReason.empty()) + reasonMessage += ": " + lastDisconnectReason; + +if (store->WriteUserDisconnect(login, up, down, sessionUpload, sessionDownload, + cash, freeMb, reasonMessage)) { WriteServLog("Cannot write disconnect for user %s.", login.c_str()); WriteServLog("%s", store->GetStrError().c_str()); @@ -675,37 +698,37 @@ void USER_IMPL::PrintUser() const { //return; STG_LOCKER lock(&mutex, __FILE__, __LINE__); -cout << "============================================================" << endl; -cout << "id=" << id << endl; -cout << "login=" << login << endl; -cout << "password=" << password << endl; -cout << "passive=" << passive << endl; -cout << "disabled=" << disabled << endl; -cout << "disabledDetailStat=" << disabledDetailStat << endl; -cout << "alwaysOnline=" << alwaysOnline << endl; -cout << "tariffName=" << tariffName << endl; -cout << "address=" << address << endl; -cout << "phone=" << phone << endl; -cout << "email=" << email << endl; -cout << "note=" << note << endl; -cout << "realName=" <GetShowFeeInCash() || tariff == NULL) return (cash - tariff->GetFee() >= -credit); } //----------------------------------------------------------------------------- -string USER_IMPL::GetEnabledDirs() +std::string USER_IMPL::GetEnabledDirs() { //STG_LOCKER lock(&mutex, __FILE__, __LINE__); -string dirs = ""; +std::string dirs = ""; for(int i = 0; i < DIR_NUM; i++) dirs += enabledDirs[i] ? "1" : "0"; return dirs; @@ -887,13 +910,13 @@ IP_DIR_PAIR idp(ip, dir, port); IP_DIR_PAIR idp(ip, dir); #endif -map::iterator lb; +std::map::iterator lb; lb = traffStat.lower_bound(idp); if (lb == traffStat.end() || lb->first != idp) { traffStat.insert(lb, - pair(idp, - STAT_NODE(len, 0, cost))); + std::make_pair(idp, + STAT_NODE(len, 0, cost))); } else { @@ -978,13 +1001,13 @@ IP_DIR_PAIR idp(ip, dir, port); IP_DIR_PAIR idp(ip, dir); #endif -map::iterator lb; +std::map::iterator lb; lb = traffStat.lower_bound(idp); if (lb == traffStat.end() || lb->first != idp) { traffStat.insert(lb, - pair(idp, - STAT_NODE(0, len, cost))); + std::make_pair(idp, + STAT_NODE(0, len, cost))); } else { @@ -993,63 +1016,63 @@ else } } //----------------------------------------------------------------------------- -void USER_IMPL::AddCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::AddCurrIPBeforeNotifier(CURR_IP_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -currIP.AddBeforeNotifier(n); +currIP.AddBeforeNotifier(notifier); } //----------------------------------------------------------------------------- -void USER_IMPL::DelCurrIPBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::DelCurrIPBeforeNotifier(const CURR_IP_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -currIP.DelBeforeNotifier(n); +currIP.DelBeforeNotifier(notifier); } //----------------------------------------------------------------------------- -void USER_IMPL::AddCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::AddCurrIPAfterNotifier(CURR_IP_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -currIP.AddAfterNotifier(n); +currIP.AddAfterNotifier(notifier); } //----------------------------------------------------------------------------- -void USER_IMPL::DelCurrIPAfterNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::DelCurrIPAfterNotifier(const CURR_IP_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -currIP.DelAfterNotifier(n); +currIP.DelAfterNotifier(notifier); } //----------------------------------------------------------------------------- -void USER_IMPL::AddConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::AddConnectedBeforeNotifier(CONNECTED_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -connected.AddBeforeNotifier(n); +connected.AddBeforeNotifier(notifier); } //----------------------------------------------------------------------------- -void USER_IMPL::DelConnectedBeforeNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::DelConnectedBeforeNotifier(const CONNECTED_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -connected.DelBeforeNotifier(n); +connected.DelBeforeNotifier(notifier); } //----------------------------------------------------------------------------- -void USER_IMPL::AddConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::AddConnectedAfterNotifier(CONNECTED_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -connected.AddAfterNotifier(n); +connected.AddAfterNotifier(notifier); } //----------------------------------------------------------------------------- -void USER_IMPL::DelConnectedAfterNotifier(PROPERTY_NOTIFIER_BASE * n) +void USER_IMPL::DelConnectedAfterNotifier(const CONNECTED_NOTIFIER * notifier) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -connected.DelAfterNotifier(n); +connected.DelAfterNotifier(notifier); } //----------------------------------------------------------------------------- void USER_IMPL::OnAdd() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -string scriptOnAdd = settings->GetScriptsDir() + "/OnUserAdd"; +std::string scriptOnAdd = settings->GetScriptsDir() + "/OnUserAdd"; if (access(scriptOnAdd.c_str(), X_OK) == 0) { - string scriptOnAddParams; + std::string scriptOnAddParams; strprintf(&scriptOnAddParams, "%s \"%s\"", scriptOnAdd.c_str(), @@ -1067,11 +1090,11 @@ void USER_IMPL::OnDelete() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -string scriptOnDel = settings->GetScriptsDir() + "/OnUserDel"; +std::string scriptOnDel = settings->GetScriptsDir() + "/OnUserDel"; if (access(scriptOnDel.c_str(), X_OK) == 0) { - string scriptOnDelParams; + std::string scriptOnDelParams; strprintf(&scriptOnDelParams, "%s \"%s\"", scriptOnDel.c_str(), @@ -1152,12 +1175,12 @@ if (tms.tm_year % 4 == 0 && tms.tm_mon == 1) secMonth += 24 * 3600; } -int dt = secMonth - passiveTime; +time_t dt = secMonth - passiveTime; if (dt < 0) dt = 0; -return double(dt) / (secMonth); +return static_cast(dt) / secMonth; } //----------------------------------------------------------------------------- void USER_IMPL::SetPassiveTimeAsNewUser() @@ -1168,9 +1191,10 @@ time_t t = stgTime; struct tm tm; localtime_r(&t, &tm); int daysCurrMon = DaysInCurrentMonth(); -double pt = (tm.tm_mday - 1) / (double)daysCurrMon; +double pt = tm.tm_mday - 1; +pt /= daysCurrMon; -passiveTime = (time_t)(pt * 24 * 3600 * daysCurrMon); +passiveTime = static_cast(pt * 24 * 3600 * daysCurrMon); } //----------------------------------------------------------------------------- void USER_IMPL::MidnightResetSessionStat() @@ -1233,7 +1257,7 @@ if (passive.ConstData() || tariff == NULL) double fee = tariff->GetFee() / DaysInCurrentMonth(); -if (fee == 0.0) +if (std::fabs(fee) < 1.0e-3) return; double c = cash; @@ -1250,6 +1274,10 @@ switch (settings->GetFeeChargeType()) if (c + credit >= fee) property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); break; + case 3: + if (c >= 0) + property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + break; } ResetPassiveTime(); } @@ -1278,7 +1306,7 @@ double fee = tariff->GetFee() * passiveTimePart; ResetPassiveTime(); -if (fee == 0.0) +if (std::fabs(fee) < 1.0e-3) { SetPrepaidTraff(); return; @@ -1312,6 +1340,13 @@ switch (settings->GetFeeChargeType()) SetPrepaidTraff(); } break; + case 3: + if (c >= 0) + { + property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + SetPrepaidTraff(); + } + break; } } //----------------------------------------------------------------------------- @@ -1343,9 +1378,9 @@ else msg->header.repeat--; #ifndef DEBUG //TODO: gcc v. 4.x generate ICE on x86_64 - msg->header.lastSendTime = time(NULL); + msg->header.lastSendTime = static_cast(time(NULL)); #else - msg->header.lastSendTime = stgTime; + msg->header.lastSendTime = static_cast(stgTime); #endif if (store->AddMessage(msg, login)) { @@ -1364,7 +1399,7 @@ int USER_IMPL::SendMessage(STG_MSG & msg) const { // No lock `cause we are already locked from caller int ret = -1; -set::iterator it(authorizedBy.begin()); +std::set::iterator it(authorizedBy.begin()); while (it != authorizedBy.end()) { if (!(*it++)->SendMessage(msg, currIP)) @@ -1374,9 +1409,9 @@ if (!ret) { #ifndef DEBUG //TODO: gcc v. 4.x generate ICE on x86_64 - msg.header.lastSendTime = time(NULL); + msg.header.lastSendTime = static_cast(time(NULL)); #else - msg.header.lastSendTime = stgTime; + msg.header.lastSendTime = static_cast(stgTime); #endif msg.header.repeat--; } @@ -1449,7 +1484,20 @@ if (newPassive && !oldPassive && user->tariff != NULL) "Freeze"); } //----------------------------------------------------------------------------- -void CHG_TARIFF_NOTIFIER::Notify(const string &, const string & newTariff) +void CHG_DISABLED_NOTIFIER::Notify(const int & oldValue, const int & newValue) +{ +if (oldValue && !newValue && user->GetConnected()) + { + user->Disconnect(false, "disabled"); + } +else if (!oldValue && newValue && user->IsInetable()) + { + user->Connect(false); + } + +} +//----------------------------------------------------------------------------- +void CHG_TARIFF_NOTIFIER::Notify(const std::string &, const std::string & newTariff) { if (user->settings->GetReconnectOnTariffChange() && user->connected) user->Disconnect(false, "Change tariff");