//-----------------------------------------------------------------------------
USERS_IMPL::USERS_IMPL(SETTINGS_IMPL * s, STORE * st, TARIFFS * t, const ADMIN * sa)
- : users(),
+ : USERS(),
+ users(),
usersToDelete(),
- userIPNotifiersBefore(),
- userIPNotifiersAfter(),
+ /*userIPNotifiersBefore(),
+ userIPNotifiersAfter(),*/
ipIndex(),
loginIndex(),
settings(s),
login.c_str());
return;
}
+
+ u->SetDeleted();
}
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
u->OnDelete();
- u->SetDeleted();
USER_TO_DEL utd;
utd.iter = u;
}
}
//-----------------------------------------------------------------------------
+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__);
+if (FindByNameNonLock(login, &iter))
+ {
+ WriteServLog("Attempt to authorize non-existant user '%s'", login.c_str());
+ return false;
+ }
+
+if (iter->Authorize(ip, enabledDirs, auth))
+ return false;
+
+if (FindByIPIdx(ip, iter))
+ {
+ if (iter->GetLogin() != login)
+ {
+ WriteServLog("Attempt to authorize user '%s' from ip %s which already occupied by '%s'",
+ login.c_str(), inet_ntostring(ip).c_str(),
+ iter->GetLogin().c_str());
+ return false;
+ }
+ return true;
+ }
+
+AddToIPIdx(iter);
+return true;
+}
+//-----------------------------------------------------------------------------
+bool USERS_IMPL::Unauthorize(const std::string & login, const AUTH * auth)
+{
+user_iter iter;
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+if (FindByNameNonLock(login, &iter))
+ {
+ WriteServLog("Attempt to unauthorize non-existant user '%s'", login.c_str());
+ return false;
+ }
+
+uint32_t ip = iter->GetCurrIP();
+
+iter->Unauthorize(auth);
+
+if (!iter->GetAuthorized())
+ DelFromIPIdx(ip);
+
+return true;
+}
+//-----------------------------------------------------------------------------
int USERS_IMPL::ReadUsers()
{
vector<string> usersList;
if (store->GetUsersList(&usersList) < 0)
{
WriteServLog(store->GetStrError().c_str());
- exit(1);
+ return -1;
}
user_iter ui;
{
printfd(__FILE__, "ResetTraff\n");
for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::ProcessNewMonth));
- for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::SetPrepaidTraff));
+ //for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::SetPrepaidTraff));
}
}
//-----------------------------------------------------------------------------
it->WriteDetailStat(true);
for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteStat));
-for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteConf));
+//for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteConf));
printfd(__FILE__, "USERS::Stop()\n");
return 0;
return;
}
//-----------------------------------------------------------------------------
-int USERS_IMPL::GetUserNum() const
-{
-return users.size();
-}
-//-----------------------------------------------------------------------------
void USERS_IMPL::AddToIPIdx(user_iter user)
{
printfd(__FILE__, "USERS: Add IP Idx\n");
ipIndex.find(ip)
);
-//assert(it != ipIndex.end() && "User is in index");
if (it == ipIndex.end())
- return; // User has not been added
+ return;
ipIndex.erase(it);
}
//-----------------------------------------------------------------------------
+bool USERS_IMPL::FindByIPIdx(uint32_t ip, user_iter & iter) const
+{
+map<uint32_t, user_iter>::const_iterator it(ipIndex.find(ip));
+if (it == ipIndex.end())
+ return false;
+iter = it->second;
+return true;
+}
+//-----------------------------------------------------------------------------
int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_PTR * usr) const
{
- USER_IMPL * ptr = NULL;
- if (FindByIPIdx(ip, &ptr))
- return -1;
- *usr = ptr;
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+
+user_iter iter;
+if (FindByIPIdx(ip, iter))
+ {
+ *usr = &(*iter);
return 0;
+ }
+
+return -1;
}
//-----------------------------------------------------------------------------
int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_IMPL ** usr) const
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-map<uint32_t, user_iter>::const_iterator it;
-it = ipIndex.find(ip);
-
-if (it == ipIndex.end())
+user_iter iter;
+if (FindByIPIdx(ip, iter))
{
- //printfd(__FILE__, "User NOT found in IP_Index!!!\n");
- return -1;
+ *usr = &(*iter);
+ return 0;
}
-*usr = &(*it->second);
-//printfd(__FILE__, "User found in IP_Index\n");
-return 0;
+
+return -1;
}
//-----------------------------------------------------------------------------
bool USERS_IMPL::IsIPInIndex(uint32_t ip) const
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-map<uint32_t, user_iter>::const_iterator it;
-it = ipIndex.find(ip);
+map<uint32_t, user_iter>::const_iterator it(ipIndex.find(ip));
return it != ipIndex.end();
}
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-PROPERTY_NOTIFER_IP_BEFORE nb(*this, user);
+/*PROPERTY_NOTIFER_IP_BEFORE nb(*this, user);
PROPERTY_NOTIFER_IP_AFTER na(*this, user);
userIPNotifiersBefore.push_front(nb);
userIPNotifiersAfter.push_front(na);
user->AddCurrIPBeforeNotifier(&(*userIPNotifiersBefore.begin()));
-user->AddCurrIPAfterNotifier(&(*userIPNotifiersAfter.begin()));
+user->AddCurrIPAfterNotifier(&(*userIPNotifiersAfter.begin()));*/
}
//-----------------------------------------------------------------------------
void USERS_IMPL::UnSetUserNotifiers(user_iter user)
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-list<PROPERTY_NOTIFER_IP_BEFORE>::iterator bi;
+/*list<PROPERTY_NOTIFER_IP_BEFORE>::iterator bi;
list<PROPERTY_NOTIFER_IP_AFTER>::iterator ai;
bi = userIPNotifiersBefore.begin();
break;
}
++ai;
- }
+ }*/
}
//-----------------------------------------------------------------------------
void USERS_IMPL::AddUserIntoIndexes(user_iter user)