]> git.stg.codes - stg.git/commitdiff
Check that IP is not in use before changing.
authorMaxim Mamontov <faust.madf@gmail.com>
Fri, 26 Jul 2013 16:24:10 +0000 (19:24 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Fri, 26 Jul 2013 16:24:10 +0000 (19:24 +0300)
include/stg/user_ips.h
include/stg/users.h
projects/stargazer/plugins/configuration/rpcconfig/user_helper.cpp
projects/stargazer/plugins/configuration/rpcconfig/user_helper.h
projects/stargazer/plugins/configuration/rpcconfig/users_methods.cpp
projects/stargazer/plugins/configuration/sgconfig/parser.cpp
projects/stargazer/plugins/store/firebird/firebird_store_users.cpp
projects/stargazer/plugins/store/postgresql/postgresql_store_users.cpp
projects/stargazer/users_impl.cpp
projects/stargazer/users_impl.h

index e68190c543e5531227ad13c444be1c4b9c728327..264b58960ac2df91e5fa59d991b5583219a8a98a 100644 (file)
@@ -70,7 +70,7 @@ public:
     std::string GetIpStr() const;
     bool IsIPInIPS(uint32_t ip) const;
     bool OnlyOneIP() const;
-    int  Count() const;
+    size_t  Count() const;
     void Add(const IP_MASK &im);
     void Erase();
 
@@ -129,9 +129,9 @@ return s.str();
 }
 //-----------------------------------------------------------------------------
 inline
-int USER_IPS::Count() const
+size_t USER_IPS::Count() const
 {
-return static_cast<int>(ips.size());
+return ips.size();
 }
 //-----------------------------------------------------------------------------
 inline
index 2ba238332297b5b70d0267dc4e967d5aacec9428..b97a9be5b67cde56472999f0c0e39ada583ff59c 100644 (file)
@@ -53,6 +53,7 @@ public:
 
     virtual int  FindByIPIdx(uint32_t ip, USER_PTR * user) const = 0;
     virtual bool IsIPInIndex(uint32_t ip) const = 0;
+    virtual bool IsIPInUse(uint32_t ip, const std::string & login, CONST_USER_PTR * user) const = 0;
 
     virtual int  OpenSearch() = 0;
     virtual int  SearchNext(int handle, USER_PTR * u) = 0;
index 665a04f4af96f9783424a859a005999c743a00f3..89c41587f8527862de5932bbc4cbe52e63ab0c37 100644 (file)
@@ -161,6 +161,18 @@ if ((it = structVal.find("ips")) != structVal.end())
     {
     USER_IPS ips;
     ips = StrToIPS(xmlrpc_c::value_string(it->second));
+
+    for (size_t i = 0; i < ips.Count(); ++i)
+        {
+        CONST_USER_PTR user;
+        uint32_t ip = ips[i].ip;
+        if (users.IsIPInUse(ip, login, &user))
+            {
+            printfd(__FILE__, "Trying to assign an IP %s to '%s' that is already in use by '%s'\n", inet_ntostring(ip).c_str(), login.c_str(), user->GetLogin().c_str());
+            return true;
+            }
+        }
+
     if (!ptr->GetProperty().ips.Set(ips,
                                 admin,
                                 login,
index 83f70b5c4df2428cfabb48a296688c1ff2618604..4e1dd7966f0a584be40ffc972779d2cdc9bfd525 100644 (file)
@@ -14,8 +14,9 @@ class TARIFFS;
 class USER_HELPER
 {
 public:
-    USER_HELPER(USER_PTR & p)
-        : ptr(p)
+    USER_HELPER(USER_PTR & p, USERS & us)
+        : ptr(p),
+          users(us)
     {
     }
 
@@ -28,6 +29,7 @@ public:
                      TARIFFS * tariffs);
 private:
     USER_PTR & ptr;
+    USERS & users;
 };
 
 #endif
index 5b39cf1e84aff4f00ec3ac9016b7629fce753638..9eabced670e8f111fd1089d27877d6b5d4c6ef23 100644 (file)
@@ -39,7 +39,7 @@ if (users->FindByName(login, &u))
     return;
     }
 
-USER_HELPER uhelper(u);
+USER_HELPER uhelper(u, *users);
 
 if (!adminInfo.priviledges.userConf || !adminInfo.priviledges.userPasswd)
     {
@@ -172,7 +172,7 @@ while (1)
 
     xmlrpc_c::value info;
 
-    USER_HELPER uhelper(u);
+    USER_HELPER uhelper(u, *users);
 
     uhelper.GetUserInfo(&info, hidePassword);
 
@@ -216,7 +216,7 @@ if (users->FindByName(login, &u))
     return;
     }
 
-USER_HELPER uhelper(u);
+USER_HELPER uhelper(u, *users);
 
 if (!adminInfo.priviledges.userConf || !adminInfo.priviledges.userPasswd)
     {
index 1f7757d22a99e68e013cba489092061cb9b43e55..8e11a157ccd4a86addebffd3da8f0b49ebfa5ed8 100644 (file)
@@ -1025,9 +1025,23 @@ if (check && alwaysOnline && !onlyOneIP)
     {
     printfd(__FILE__, "Requested change leads to a forbidden state: AlwaysOnline with multiple IP's\n");
     GetStgLogger()("%s Requested change leads to a forbidden state: AlwaysOnline with multiple IP's", currAdmin->GetLogStr().c_str());
+    res = -1;
     return -1;
     }
 
+for (size_t i = 0; i < ucr->ips.const_data().Count(); ++i)
+    {
+    CONST_USER_PTR user;
+    uint32_t ip = ucr->ips.const_data().operator[](i).ip;
+    if (users->IsIPInUse(ip, login, &user))
+        {
+        printfd(__FILE__, "Trying to assign an IP %s to '%s' that is already in use by '%s'\n", inet_ntostring(ip).c_str(), login.c_str(), user->GetLogin().c_str());
+        GetStgLogger()("%s trying to assign an IP %s to '%s' that is currently in use by '%s'", currAdmin->GetLogStr().c_str(), inet_ntostring(ip).c_str(), login.c_str(), user->GetLogin().c_str());
+        res = -1;
+        return -1;
+        }
+    }
+
 if (!ucr->ips.res_empty())
     if (!u->GetProperty().ips.Set(ucr->ips.const_data(), currAdmin, login, store))
         res = -1;
index 8b21907e76c1d58e52824b653b3877099530b3c4..e48fd0d89dacb6effa5d245996b4480d9ad7265e 100644 (file)
@@ -337,7 +337,7 @@ try
     st->Execute();
 
     st->Prepare("insert into tb_allowed_ip (fk_user, ip, mask) values (?, ?, ?)");
-    for(i = 0; i < conf.ips.Count(); i++)
+    for(size_t i = 0; i < conf.ips.Count(); i++)
         {
         st->Set(1, uid);
         st->Set(2, (int32_t)conf.ips[i].ip);
index 4cd64418e9d3f370263e2d1553f13073da07c29b..0722cc4c8d76671982b60fcf2dd948a7ba8d7746 100644 (file)
@@ -1525,7 +1525,7 @@ if (PQresultStatus(result) != PGRES_COMMAND_OK)
 
 PQclear(result);
 
-for (int i = 0; i < ips.Count(); ++i)
+for (size_t i = 0; i < ips.Count(); ++i)
     {
     std::ostringstream query;
     query << "INSERT INTO tb_allowed_ip "
index 17d1e4f77fcd88099fb75d6e00bf8163f48aaae4..dfdc86342e4e35c2dfa92527d64fc9ec380f795e 100644 (file)
@@ -695,6 +695,24 @@ std::map<uint32_t, user_iter>::const_iterator it(ipIndex.find(ip));
 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__);
+std::list<USER_IMPL>::const_iterator iter;
+iter = users.begin();
+while (iter != users.end())
+    {
+    if (iter->GetLogin() != login && iter->GetProperty().ips.Get().IsIPInIPS(ip))
+        {
+        if (user != NULL)
+            *user = &(*iter);
+        return true;
+        }
+    ++iter;
+    }
+return false;
+}
+//-----------------------------------------------------------------------------
 void USERS_IMPL::AddNotifierUserAdd(NOTIFIER_BASE<USER_PTR> * n)
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
index 69f3fbae8d9aca286e1aa9d1ae9f3ac0c9cc04c6..0c2af78d5f84fea5bbab66e25e0deed6787964e2 100644 (file)
@@ -103,6 +103,7 @@ public:
     int             FindByIPIdx(uint32_t ip, USER_PTR * user) const;
     int             FindByIPIdx(uint32_t ip, USER_IMPL ** user) const;
     bool            IsIPInIndex(uint32_t ip) const;
+    bool            IsIPInUse(uint32_t ip, const std::string & login, CONST_USER_PTR * user) const;
 
     int             OpenSearch();
     int             SearchNext(int handler, USER_PTR * user);