X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/5c19a000ed76d49fae019ed50955a1a530d161f0..24dbb9a02319b9f1e231315c8391cf7609453973:/projects/stargazer/user_impl.cpp diff --git a/projects/stargazer/user_impl.cpp b/projects/stargazer/user_impl.cpp index 7153012a..ca2e2cae 100644 --- a/projects/stargazer/user_impl.cpp +++ b/projects/stargazer/user_impl.cpp @@ -46,6 +46,7 @@ #include "stg/admin.h" #include "user_impl.h" #include "settings_impl.h" +#include "stg_timer.h" #ifdef USE_ABSTRACT_SETTINGS USER_IMPL::USER_IMPL(const SETTINGS * s, @@ -53,13 +54,16 @@ USER_IMPL::USER_IMPL(const SETTINGS * s, const TARIFFS * t, const ADMIN * a, const USERS * u) - : users(u), + : USER(), + users(u), property(s->GetScriptsDir()), WriteServLog(GetStgLogger()), + lastScanMessages(0), login(), id(0), __connected(0), connected(__connected), + enabledDirs(), userIDGenerator(), __currIP(0), currIP(__currIP), @@ -68,7 +72,15 @@ USER_IMPL::USER_IMPL(const SETTINGS * s, sysAdmin(a), store(st), tariffs(t), - tariff(tariffs->GetNoTariff()), + tariff(NULL), + traffStat(), + traffStatSaved(), + settings(s), + authorizedBy(), + messages(), + deleted(false), + lastWriteStat(0), + lastWriteDetailedStat(0), cash(property.cash), up(property.up), down(property.down), @@ -103,19 +115,18 @@ USER_IMPL::USER_IMPL(const SETTINGS * s, userdata7(property.userdata7), userdata8(property.userdata8), userdata9(property.userdata9), + sessionUpload(), + sessionDownload(), passiveNotifier(this), tariffNotifier(this), cashNotifier(this), - ipNotifier(this) + ipNotifier(this), + mutex(), + errorStr() { -settings = s; - password = "*_EMPTY_PASSWORD_*"; tariffName = NO_TARIFF_NAME; -connected = 0; -tariff = tariffs->GetNoTariff(); ips = StrToIPS("*"); -deleted = false; lastWriteStat = stgTime + random() % settings->GetStatWritePeriod(); lastWriteDetailedStat = stgTime; @@ -124,8 +135,6 @@ property.passive.AddBeforeNotifier(&passiveNotifier); property.cash.AddBeforeNotifier(&cashNotifier); ips.AddAfterNotifier(&ipNotifier); -lastScanMessages = 0; - pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); @@ -133,17 +142,20 @@ pthread_mutex_init(&mutex, &attr); } #else USER_IMPL::USER_IMPL(const SETTINGS_IMPL * s, - const STORE * st, - const TARIFFS * t, - const ADMIN * a, - const USERS * u) - : users(u), + const STORE * st, + const TARIFFS * t, + const ADMIN * a, + const USERS * u) + : USER(), + users(u), property(s->GetScriptsDir()), WriteServLog(GetStgLogger()), + lastScanMessages(0), login(), id(0), __connected(0), connected(__connected), + enabledDirs(), userIDGenerator(), __currIP(0), currIP(__currIP), @@ -152,7 +164,15 @@ USER_IMPL::USER_IMPL(const SETTINGS_IMPL * s, sysAdmin(a), store(st), tariffs(t), - tariff(tariffs->GetNoTariff()), + tariff(NULL), + traffStat(), + traffStatSaved(), + settings(s), + authorizedBy(), + messages(), + deleted(false), + lastWriteStat(0), + lastWriteDetailedStat(0), cash(property.cash), up(property.up), down(property.down), @@ -187,19 +207,18 @@ USER_IMPL::USER_IMPL(const SETTINGS_IMPL * s, userdata7(property.userdata7), userdata8(property.userdata8), userdata9(property.userdata9), + sessionUpload(), + sessionDownload(), passiveNotifier(this), tariffNotifier(this), cashNotifier(this), - ipNotifier(this) + ipNotifier(this), + mutex(), + errorStr() { -settings = s; - password = "*_EMPTY_PASSWORD_*"; tariffName = NO_TARIFF_NAME; -connected = 0; -tariff = tariffs->GetNoTariff(); ips = StrToIPS("*"); -deleted = false; lastWriteStat = stgTime + random() % settings->GetStatWritePeriod(); lastWriteDetailedStat = stgTime; @@ -208,8 +227,6 @@ property.passive.AddBeforeNotifier(&passiveNotifier); property.cash.AddBeforeNotifier(&cashNotifier); ips.AddAfterNotifier(&ipNotifier); -lastScanMessages = 0; - pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); @@ -218,13 +235,17 @@ pthread_mutex_init(&mutex, &attr); #endif //----------------------------------------------------------------------------- USER_IMPL::USER_IMPL(const USER_IMPL & u) - : users(u.users), + : USER(), + users(u.users), property(u.settings->GetScriptsDir()), WriteServLog(GetStgLogger()), + lastScanMessages(0), login(u.login), id(u.id), - __connected(u.__connected), + __connected(0), connected(__connected), + enabledDirs(), + userIDGenerator(u.userIDGenerator), __currIP(u.__currIP), currIP(__currIP), lastIPForDisconnect(0), @@ -233,6 +254,14 @@ USER_IMPL::USER_IMPL(const USER_IMPL & u) store(u.store), tariffs(u.tariffs), tariff(u.tariff), + traffStat(u.traffStat), + traffStatSaved(u.traffStatSaved), + settings(u.settings), + authorizedBy(), + messages(u.messages), + deleted(u.deleted), + lastWriteStat(u.lastWriteStat), + lastWriteDetailedStat(u.lastWriteDetailedStat), cash(property.cash), up(property.up), down(property.down), @@ -267,30 +296,23 @@ USER_IMPL::USER_IMPL(const USER_IMPL & u) userdata7(property.userdata7), userdata8(property.userdata8), userdata9(property.userdata9), + sessionUpload(), + sessionDownload(), passiveNotifier(this), tariffNotifier(this), cashNotifier(this), - ipNotifier(this) + ipNotifier(this), + mutex(), + errorStr() { if (&u == this) return; -connected = 0; - -deleted = u.deleted; - -lastWriteStat = u.lastWriteStat; -lastWriteDetailedStat = u.lastWriteDetailedStat; - -settings = u.settings; - property.tariffName.AddBeforeNotifier(&tariffNotifier); property.passive.AddBeforeNotifier(&passiveNotifier); property.cash.AddBeforeNotifier(&cashNotifier); ips.AddAfterNotifier(&ipNotifier); -lastScanMessages = 0; - property.SetProperties(u.property); pthread_mutexattr_t attr; @@ -343,6 +365,9 @@ std::vector hdrsList; if (store->GetMessageHdrs(&hdrsList, login)) { printfd(__FILE__, "Error GetMessageHdrs %s\n", store->GetStrError().c_str()); + WriteServLog("Cannot read user %s. Error reading message headers: %s.", + login.c_str(), + store->GetStrError().c_str()); return -1; } @@ -459,7 +484,7 @@ for (int i = 0; i < DIR_NUM; i++) enabledDirs[i] = dirs & (1 << i); } -if (authorizedBy.size()) +if (!authorizedBy.empty()) { if (currIP != ip) { @@ -564,7 +589,7 @@ if (!fakeConnect) id, dirsStr); - ScriptExec(scriptOnConnectParams); + ScriptExec(scriptOnConnectParams.c_str()); } else { @@ -621,7 +646,7 @@ if (!fakeDisconnect) id, dirsStr); - ScriptExec(scriptOnDisonnectParams); + ScriptExec(scriptOnDisonnectParams.c_str()); } else { @@ -767,7 +792,7 @@ if (settings->GetFreeMbAllowInet()) return true; } -if (settings->GetShowFeeInCash()) +if (settings->GetShowFeeInCash() || tariff == NULL) { return (cash >= -credit); } @@ -793,7 +818,7 @@ void USER_IMPL::AddTraffStatU(int dir, uint32_t ip, uint32_t len) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -if (!connected) +if (!connected || tariff == NULL) return; double cost = 0; @@ -885,7 +910,7 @@ void USER_IMPL::AddTraffStatD(int dir, uint32_t ip, uint32_t len) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -if (!connected) +if (!connected || tariff == NULL) return; double cost = 0; @@ -1030,7 +1055,7 @@ if (access(scriptOnAdd.c_str(), X_OK) == 0) scriptOnAdd.c_str(), login.c_str()); - ScriptExec(scriptOnAddParams); + ScriptExec(scriptOnAddParams.c_str()); } else { @@ -1052,7 +1077,7 @@ if (access(scriptOnDel.c_str(), X_OK) == 0) scriptOnDel.c_str(), login.c_str()); - ScriptExec(scriptOnDelParams); + ScriptExec(scriptOnDelParams.c_str()); } else { @@ -1192,7 +1217,7 @@ if (nextTariff.ConstData() != "") else { property.tariffName.Set(nextTariff, sysAdmin, login, store); - tariff = nt; + //tariff = nt; } ResetNextTariff(); WriteConf(); @@ -1203,7 +1228,7 @@ void USER_IMPL::ProcessDayFeeSpread() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -if (passive.ConstData()) +if (passive.ConstData() || tariff == NULL) return; double fee = tariff->GetFee() / DaysInCurrentMonth(); @@ -1218,11 +1243,11 @@ switch (settings->GetFeeChargeType()) property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); break; case 1: - if (c > 0) + if (c >= 0) property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); break; case 2: - if (c > fee) + if (c >= fee) property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); break; } @@ -1233,6 +1258,9 @@ void USER_IMPL::ProcessDayFee() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); +if (tariff == NULL) + return; + double passiveTimePart = 1.0; if (!settings->GetFullFee()) { @@ -1251,7 +1279,10 @@ double fee = tariff->GetFee() * passiveTimePart; ResetPassiveTime(); if (fee == 0.0) + { + SetPrepaidTraff(); return; + } double c = cash; printfd(__FILE__, "login: %8s Fee=%f PassiveTimePart=%f fee=%f\n", @@ -1263,23 +1294,29 @@ switch (settings->GetFeeChargeType()) { case 0: property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + SetPrepaidTraff(); break; case 1: - if (c > 0) + if (c >= 0) + { property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + SetPrepaidTraff(); + } break; case 2: - if (c > fee) + if (c >= fee) + { property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + SetPrepaidTraff(); + } break; } } //----------------------------------------------------------------------------- void USER_IMPL::SetPrepaidTraff() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); - -property.freeMb.Set(tariff->GetFree(), sysAdmin, login, store, "Prepaid traffic"); +if (tariff != NULL) + property.freeMb.Set(tariff->GetFree(), sysAdmin, login, store, "Prepaid traffic"); } //----------------------------------------------------------------------------- int USER_IMPL::AddMessage(STG_MSG * msg) @@ -1402,7 +1439,7 @@ while (it != messages.end()) //----------------------------------------------------------------------------- void CHG_PASSIVE_NOTIFIER::Notify(const int & oldPassive, const int & newPassive) { -if (newPassive && !oldPassive) +if (newPassive && !oldPassive && user->tariff != NULL) user->property.cash.Set(user->cash - user->tariff->GetPassiveCost(), user->sysAdmin, user->login, @@ -1412,7 +1449,13 @@ if (newPassive && !oldPassive) //----------------------------------------------------------------------------- void CHG_TARIFF_NOTIFIER::Notify(const string &, const string & newTariff) { +if (user->settings->GetReconnectOnTariffChange() && user->connected) + user->Disconnect(false, "Change tariff"); user->tariff = user->tariffs->FindByName(newTariff); +if (user->settings->GetReconnectOnTariffChange() && + !user->authorizedBy.empty() && + user->IsInetable()) + user->Connect(false); } //----------------------------------------------------------------------------- void CHG_CASH_NOTIFIER::Notify(const double & oldCash, const double & newCash) @@ -1425,8 +1468,8 @@ void CHG_IPS_NOTIFIER::Notify(const USER_IPS & from, const USER_IPS & to) { printfd(__FILE__, "Change IP from '%s' to '%s'\n", from.GetIpStr().c_str(), to.GetIpStr().c_str()); if (user->connected) - user->Disconnect(true, "Change IP"); - if (user->IsInetable()) - user->Connect(true); + user->Disconnect(false, "Change IP"); + if (!user->authorizedBy.empty() && user->IsInetable()) + user->Connect(false); } //-----------------------------------------------------------------------------