: USERS(),
users(),
usersToDelete(),
- userIPNotifiersBefore(),
- userIPNotifiersAfter(),
+ /*userIPNotifiersBefore(),
+ userIPNotifiersAfter(),*/
ipIndex(),
loginIndex(),
settings(s),
}
}
//-----------------------------------------------------------------------------
+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;
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)
class USERS_IMPL;
//-----------------------------------------------------------------------------
-class PROPERTY_NOTIFER_IP_BEFORE: public PROPERTY_NOTIFIER_BASE<uint32_t> {
+/*class PROPERTY_NOTIFER_IP_BEFORE: public PROPERTY_NOTIFIER_BASE<uint32_t> {
public:
PROPERTY_NOTIFER_IP_BEFORE(USERS_IMPL & us, user_iter u) : users(us), user(u) {}
void Notify(const uint32_t & oldValue, const uint32_t & newValue);
private:
USERS_IMPL & users;
user_iter user;
-};
+};*/
//-----------------------------------------------------------------------------
struct USER_TO_DEL {
USER_TO_DEL()
int Add(const std::string & login, const ADMIN * admin);
void Del(const std::string & login, const ADMIN * admin);
+ bool Authorize(const std::string & login, uint32_t ip,
+ uint32_t enabledDirs, const AUTH * auth);
+ bool Unauthorize(const std::string & login, const AUTH * auth);
+
int ReadUsers();
size_t Count() const { return users.size(); }
private:
void AddToIPIdx(user_iter user);
void DelFromIPIdx(uint32_t ip);
+ bool FindByIPIdx(uint32_t ip, user_iter & iter) const;
int FindByNameNonLock(const std::string & login, user_iter * user);
std::list<USER_IMPL> users;
std::list<USER_TO_DEL> usersToDelete;
- std::list<PROPERTY_NOTIFER_IP_BEFORE> userIPNotifiersBefore;
- std::list<PROPERTY_NOTIFER_IP_AFTER> userIPNotifiersAfter;
+ /*std::list<PROPERTY_NOTIFER_IP_BEFORE> userIPNotifiersBefore;
+ std::list<PROPERTY_NOTIFER_IP_AFTER> userIPNotifiersAfter;*/
std::map<uint32_t, user_iter> ipIndex;
std::map<std::string, user_iter> loginIndex;
std::set<NOTIFIER_BASE<USER_IMPL_PTR>*> onDelNotifiersImpl;
};
//-----------------------------------------------------------------------------
-inline
+/*inline
void PROPERTY_NOTIFER_IP_BEFORE::Notify(const uint32_t & oldValue,
const uint32_t &)
{
//EVENT_LOOP_SINGLETON::GetInstance().Enqueue(users, &USERS::AddToIPIdx, user);
// Using explicit call to assure that index is valid, because fast reconnect with delayed call can result in authorization error
users.AddToIPIdx(user);
-}
+}*/
//-----------------------------------------------------------------------------
#endif