]> git.stg.codes - stg.git/blobdiff - projects/stargazer/users_impl.cpp
Move authorization from USER to USERS
[stg.git] / projects / stargazer / users_impl.cpp
index d0e5364463ea12d0a1aae688d5cf24209833eb01..7b110431130fbcb50fe02fbf8091c396bd39f8b3 100644 (file)
@@ -53,10 +53,11 @@ extern const volatile time_t stgTime;
 
 //-----------------------------------------------------------------------------
 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),
@@ -227,6 +228,8 @@ if (!priv->userAddDel)
                      login.c_str());
         return;
         }
+
+    u->SetDeleted();
     }
 
     {
@@ -251,7 +254,6 @@ if (!priv->userAddDel)
     STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 
     u->OnDelete();
-    u->SetDeleted();
 
     USER_TO_DEL utd;
     utd.iter = u;
@@ -267,6 +269,56 @@ if (!priv->userAddDel)
     }
 }
 //-----------------------------------------------------------------------------
+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;
@@ -274,7 +326,7 @@ usersList.clear();
 if (store->GetUsersList(&usersList) < 0)
     {
     WriteServLog(store->GetStrError().c_str());
-    exit(1);
+    return -1;
     }
 
 user_iter ui;
@@ -560,11 +612,6 @@ while (iter != usersToDelete.end())
 return;
 }
 //-----------------------------------------------------------------------------
-int USERS_IMPL::GetUserNum() const
-{
-return users.size();
-}
-//-----------------------------------------------------------------------------
 void USERS_IMPL::AddToIPIdx(user_iter user)
 {
 printfd(__FILE__, "USERS: Add IP Idx\n");
@@ -595,45 +642,54 @@ const map<uint32_t, user_iter>::iterator it(
         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();
 }
@@ -749,21 +805,21 @@ void USERS_IMPL::SetUserNotifiers(user_iter user)
 {
 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();
@@ -790,7 +846,7 @@ while (ai != userIPNotifiersAfter.end())
         break;
         }
     ++ai;
-    }
+    }*/
 }
 //-----------------------------------------------------------------------------
 void USERS_IMPL::AddUserIntoIndexes(user_iter user)