X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/27266b5280c04292ca621da13f36ba70cac403bb..8c6fa3fbaccc22127280bf77a48fab5a3ee0716e:/projects/stargazer/users_impl.cpp diff --git a/projects/stargazer/users_impl.cpp b/projects/stargazer/users_impl.cpp index 5b88e685..ef5e98ca 100644 --- a/projects/stargazer/users_impl.cpp +++ b/projects/stargazer/users_impl.cpp @@ -51,29 +51,18 @@ extern volatile time_t stgTime; //#define USERS_DEBUG 1 //----------------------------------------------------------------------------- -USERS_IMPL::USERS_IMPL(SETTINGS_IMPL * s, STORE * st, TARIFFS * t, const ADMIN * sa) - : USERS(), - users(), - usersToDelete(), - /*userIPNotifiersBefore(), - userIPNotifiersAfter(),*/ - ipIndex(), - loginIndex(), - settings(s), +USERS_IMPL::USERS_IMPL(SETTINGS_IMPL * s, STORE * st, + TARIFFS * t, SERVICES & svcs, + const ADMIN * sa) + : settings(s), tariffs(t), + m_services(svcs), store(st), sysAdmin(sa), WriteServLog(GetStgLogger()), nonstop(false), isRunning(false), - mutex(), - thread(), - handle(0), - searchDescriptors(), - onAddNotifiers(), - onDelNotifiers(), - onAddNotifiersImpl(), - onDelNotifiersImpl() + handle(0) { pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); @@ -108,7 +97,7 @@ return 0; //----------------------------------------------------------------------------- int USERS_IMPL::FindByName(const std::string & login, USER_PTR * user) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); user_iter u; if (FindByNameNonLock(login, &u)) return -1; @@ -118,7 +107,7 @@ return 0; //----------------------------------------------------------------------------- int USERS_IMPL::FindByName(const std::string & login, CONST_USER_PTR * user) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); const_user_iter u; if (FindByNameNonLock(login, &u)) return -1; @@ -126,9 +115,16 @@ if (FindByNameNonLock(login, &u)) return 0; } //----------------------------------------------------------------------------- +bool USERS_IMPL::Exists(const std::string & login) const +{ +STG_LOCKER lock(&mutex); +const std::map::const_iterator iter(loginIndex.find(login)); +return iter != loginIndex.end(); +} +//----------------------------------------------------------------------------- bool USERS_IMPL::TariffInUse(const std::string & tariffName) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); std::list::const_iterator iter; iter = users.begin(); while (iter != users.end()) @@ -142,7 +138,7 @@ return false; //----------------------------------------------------------------------------- int USERS_IMPL::Add(const std::string & login, const ADMIN * admin) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); const PRIV * priv = admin->GetPriv(); if (!priv->userAddDel) @@ -164,7 +160,7 @@ if (store->AddUser(login)) } ////// -USER_IMPL u(settings, store, tariffs, sysAdmin, this); +USER_IMPL u(settings, store, tariffs, sysAdmin, this, m_services); /*struct tm * tms; time_t t = stgTime; @@ -233,7 +229,7 @@ if (!priv->userAddDel) { - STG_LOCKER lock(&mutex, __FILE__, __LINE__); + STG_LOCKER lock(&mutex); if (FindByNameNonLock(login, &u)) { @@ -265,7 +261,7 @@ if (!priv->userAddDel) } { - STG_LOCKER lock(&mutex, __FILE__, __LINE__); + STG_LOCKER lock(&mutex); u->OnDelete(); @@ -286,7 +282,7 @@ bool USERS_IMPL::Authorize(const std::string & login, uint32_t ip, uint32_t enabledDirs, const AUTH * auth) { user_iter iter; -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (FindByNameNonLock(login, &iter)) { WriteServLog("Attempt to authorize non-existant user '%s'", login.c_str()); @@ -314,19 +310,22 @@ AddToIPIdx(iter); return true; } //----------------------------------------------------------------------------- -bool USERS_IMPL::Unauthorize(const std::string & login, const AUTH * auth) +bool USERS_IMPL::Unauthorize(const std::string & login, + const AUTH * auth, + const std::string & reason) { user_iter iter; -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (FindByNameNonLock(login, &iter)) { WriteServLog("Attempt to unauthorize non-existant user '%s'", login.c_str()); + printfd(__FILE__, "Attempt to unauthorize non-existant user '%s'", login.c_str()); return false; } uint32_t ip = iter->GetCurrIP(); -iter->Unauthorize(auth); +iter->Unauthorize(auth, reason); if (!iter->GetAuthorized()) DelFromIPIdx(ip); @@ -346,9 +345,10 @@ if (store->GetUsersList(&usersList) < 0) user_iter ui; +unsigned errors = 0; for (unsigned int i = 0; i < usersList.size(); i++) { - USER_IMPL u(settings, store, tariffs, sysAdmin, this); + USER_IMPL u(settings, store, tariffs, sysAdmin, this, m_services); u.SetLogin(usersList[i]); users.push_front(u); @@ -356,13 +356,26 @@ for (unsigned int i = 0; i < usersList.size(); i++) AddUserIntoIndexes(ui); - if (ui->ReadConf() < 0) - return -1; + if (settings->GetStopOnError()) + { + if (ui->ReadConf() < 0) + return -1; - if (ui->ReadStat() < 0) - return -1; + if (ui->ReadStat() < 0) + return -1; + } + else + { + if (ui->ReadConf() < 0) + errors++; + + if (ui->ReadStat() < 0) + errors++; + } } +if (errors > 0) + return -1; return 0; } //----------------------------------------------------------------------------- @@ -420,21 +433,13 @@ while (us->nonstop) { //printfd(__FILE__, "Monitor=%d file TRAFFCOUNTER %s\n", tc->monitoring, monFile.c_str()); touchTime = stgTime; - TouchFile(monFile.c_str()); + TouchFile(monFile); } stgUsleep(100000); } //while (us->nonstop) -user_iter ui = us->users.begin(); -while (ui != us->users.end()) - { - us->DelUserFromIndexes(ui); - ++ui; - } - -std::list::iterator iter; -iter = us->usersToDelete.begin(); +std::list::iterator iter(us->usersToDelete.begin()); while (iter != us->usersToDelete.end()) { iter->delTime -= 2 * userDeleteDelayTime; @@ -511,6 +516,9 @@ else } } +std::for_each(users.begin(), users.end(), std::mem_fun_ref(&USER_IMPL::ProcessDailyFee)); +std::for_each(users.begin(), users.end(), std::mem_fun_ref(&USER_IMPL::ProcessServices)); + if (settings->GetDayFeeIsLastDay()) { printfd(__FILE__, "DayResetTraff - 2 -\n"); @@ -602,7 +610,7 @@ return 0; //----------------------------------------------------------------------------- void USERS_IMPL::RealDelUser() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); printfd(__FILE__, "RealDelUser() users to del: %d\n", usersToDelete.size()); @@ -637,7 +645,7 @@ uint32_t ip = user->GetCurrIP(); if (!ip) return; // User has disconnected -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); const std::map::iterator it( ipIndex.lower_bound(ip) @@ -653,7 +661,7 @@ void USERS_IMPL::DelFromIPIdx(uint32_t ip) printfd(__FILE__, "USERS: Del IP Idx\n"); assert(ip && "User has non-null ip"); -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); const std::map::iterator it( ipIndex.find(ip) @@ -676,7 +684,7 @@ return true; //----------------------------------------------------------------------------- int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_PTR * usr) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); user_iter iter; if (FindByIPIdx(ip, iter)) @@ -690,7 +698,7 @@ return -1; //----------------------------------------------------------------------------- int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_IMPL ** usr) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); user_iter iter; if (FindByIPIdx(ip, iter)) @@ -704,7 +712,7 @@ return -1; //----------------------------------------------------------------------------- bool USERS_IMPL::IsIPInIndex(uint32_t ip) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); std::map::const_iterator it(ipIndex.find(ip)); @@ -713,7 +721,7 @@ return it != ipIndex.end(); //----------------------------------------------------------------------------- bool USERS_IMPL::IsIPInUse(uint32_t ip, const std::string & login, CONST_USER_PTR * user) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); std::list::const_iterator iter; iter = users.begin(); while (iter != users.end()) @@ -733,55 +741,55 @@ return false; //----------------------------------------------------------------------------- void USERS_IMPL::AddNotifierUserAdd(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onAddNotifiers.insert(n); } //----------------------------------------------------------------------------- void USERS_IMPL::DelNotifierUserAdd(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onAddNotifiers.erase(n); } //----------------------------------------------------------------------------- void USERS_IMPL::AddNotifierUserDel(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onDelNotifiers.insert(n); } //----------------------------------------------------------------------------- void USERS_IMPL::DelNotifierUserDel(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onDelNotifiers.erase(n); } //----------------------------------------------------------------------------- void USERS_IMPL::AddNotifierUserAdd(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onAddNotifiersImpl.insert(n); } //----------------------------------------------------------------------------- void USERS_IMPL::DelNotifierUserAdd(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onAddNotifiersImpl.erase(n); } //----------------------------------------------------------------------------- void USERS_IMPL::AddNotifierUserDel(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onDelNotifiersImpl.insert(n); } //----------------------------------------------------------------------------- void USERS_IMPL::DelNotifierUserDel(NOTIFIER_BASE * n) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); onDelNotifiersImpl.erase(n); } //----------------------------------------------------------------------------- int USERS_IMPL::OpenSearch() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); handle++; searchDescriptors[handle] = users.begin(); return handle; @@ -798,7 +806,7 @@ int USERS_IMPL::SearchNext(int h, USER_PTR * user) //----------------------------------------------------------------------------- int USERS_IMPL::SearchNext(int h, USER_IMPL ** user) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (searchDescriptors.find(h) == searchDescriptors.end()) { @@ -827,7 +835,7 @@ return 0; //----------------------------------------------------------------------------- int USERS_IMPL::CloseSearch(int h) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (searchDescriptors.find(h) != searchDescriptors.end()) { searchDescriptors.erase(searchDescriptors.find(h)); @@ -840,13 +848,13 @@ return -1; //----------------------------------------------------------------------------- void USERS_IMPL::AddUserIntoIndexes(user_iter user) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); loginIndex.insert(make_pair(user->GetLogin(), user)); } //----------------------------------------------------------------------------- void USERS_IMPL::DelUserFromIndexes(user_iter user) { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); loginIndex.erase(user->GetLogin()); } //-----------------------------------------------------------------------------