]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp
Simplified admins API
[stg.git] / projects / stargazer / plugins / authorization / inetaccess / inetaccess.cpp
index 0319ef8db360791ee98daa6f4f6a36ce8ce23eb8..58d9259f68f124a433b00ec44ff4e6ce54991287 100644 (file)
 
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/select.h>
+#include <unistd.h> // usleep, close
+
 #include <csignal>
 #include <cstdlib>
+#include <cstdio> // snprintf
+#include <cerrno>
 #include <algorithm>
 
+#include "stg/common.h"
+#include "stg/locker.h"
+#include "stg/tariff.h"
+#include "stg/user_property.h"
+#include "stg/settings.h"
+#include "stg/plugin_creator.h"
 #include "inetaccess.h"
-#include "common.h"
 
 extern volatile const time_t stgTime;
 
-//-----------------------------------------------------------------------------
-class IA_CREATOR
-{
-private:
-    AUTH_IA * ia;
-
-public:
-    IA_CREATOR()
-        : ia(new AUTH_IA())
-        {
-        };
-    ~IA_CREATOR()
-        {
-        delete ia;
-        };
+void InitEncrypt(BLOWFISH_CTX * ctx, const string & password);
+void Decrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8);
+void Encrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8);
 
-    AUTH_IA * GetPlugin()
-    {
-        return ia;
-    };
-};
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-IA_CREATOR iac;
+PLUGIN_CREATOR<AUTH_IA> iac;
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-BASE_PLUGIN * GetPlugin()
+PLUGIN * GetPlugin()
 {
 return iac.GetPlugin();
 }
@@ -82,21 +75,6 @@ AUTH_IA_SETTINGS::AUTH_IA_SETTINGS()
 {
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA_SETTINGS::ParseIntInRange(const string & str, int min, int max, int * val)
-{
-if (str2x(str.c_str(), *val))
-    {
-    errorStr = "Incorrect value \'" + str + "\'.";
-    return -1;
-    }
-if (*val < min || *val > max)
-    {
-    errorStr = "Value \'" + str + "\' out of range.";
-    return -1;
-    }
-return 0;
-}
-//-----------------------------------------------------------------------------
 int AUTH_IA_SETTINGS::ParseSettings(const MODULE_SETTINGS & s)
 {
 int p;
@@ -323,6 +301,9 @@ AUTH_IA::AUTH_IA()
     : nonstop(false),
       isRunningRun(false),
       isRunningRunTimeouter(false),
+      users(NULL),
+      stgSettings(NULL),
+      listenSocket(-1),
       WriteServLog(GetStgLogger()),
       enabledDirs(0xFFffFFff),
       onDelUserNotifier(*this)
@@ -632,7 +613,7 @@ Decrypt(&ctxS, login, buffer + 8, PASSWD_LEN / 8);
 uint32_t sip = *((uint32_t*)&outerAddr.sin_addr);
 uint16_t sport = htons(outerAddr.sin_port);
 
-user_iter user;
+USER_PTR user;
 if (users->FindByName(login, &user) == 0)
     {
     printfd(__FILE__, "User %s FOUND!\n", user->GetLogin().c_str());
@@ -759,7 +740,7 @@ while (it != ip2user.end())
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::PacketProcessor(char * buff, int dataLen, uint32_t sip, uint16_t sport, int protoVer, user_iter * user)
+int AUTH_IA::PacketProcessor(char * buff, int dataLen, uint32_t sip, uint16_t sport, int protoVer, USER_PTR * user)
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 // ôÕÔ ÓÏÂÒÁÎÙ ÏÂÒÁÂÏÔÞÉËÉ ÒÁÚÎÙÈ ÐÁËÅÔÏ×
@@ -806,10 +787,10 @@ iaUser = &(it->second);
 if (iaUser->port != sport)
     iaUser->port = sport;
 
-if (iaUser->password != (*user)->property.password.Get())
+if (iaUser->password != (*user)->GetProperty().password.Get())
     {
-    InitEncrypt(&iaUser->ctx, (*user)->property.password.Get());
-    iaUser->password = (*user)->property.password.Get();
+    InitEncrypt(&iaUser->ctx, (*user)->GetProperty().password.Get());
+    iaUser->password = (*user)->GetProperty().password.Get();
     }
 
 buff += offset;
@@ -833,13 +814,13 @@ else
     pn = pi->second;
     }
 
-if ((*user)->property.disabled.Get())
+if ((*user)->GetProperty().disabled.Get())
     {
     SendError(sip, sport, protoVer, "õÞÅÔÎÁÑ ÚÁÐÉÓØ ÚÁÂÌÏËÉÒÏ×ÁÎÁ");
     return 0;
     }
 
-if ((*user)->property.passive.Get())
+if ((*user)->GetProperty().passive.Get())
     {
     SendError(sip, sport, protoVer, "õÞÅÔÎÁÑ ÚÁÐÉÓØ ÚÁÍÏÒÏÖÅÎÁ");
     return 0;
@@ -847,23 +828,23 @@ if ((*user)->property.passive.Get())
 
 if ((*user)->GetAuthorized() && (*user)->GetCurrIP() != sip)
     {
-    printfd(__FILE__, "Login %s alredy in use. IP \'%s\'\n", (*user)->GetLogin().c_str(), inet_ntostring(sip).c_str());
-    WriteServLog("Login %s alredy in use. IP \'%s\'", (*user)->GetLogin().c_str(), inet_ntostring(sip).c_str());
+    printfd(__FILE__, "Login %s already in use. IP \'%s\'\n", (*user)->GetLogin().c_str(), inet_ntostring(sip).c_str());
+    WriteServLog("Login %s already in use. IP \'%s\'", (*user)->GetLogin().c_str(), inet_ntostring(sip).c_str());
     SendError(sip, sport, protoVer, "÷ÁÛ ÌÏÇÉΠÕÖÅ ÉÓÐÏÌØÚÕÅÔÓÑ!");
     return 0;
     }
 
-user_iter u;
+USER_PTR u;
 if (users->FindByIPIdx(sip, &u) == 0 && u->GetLogin() != (*user)->GetLogin())
     {
-    printfd(__FILE__, "IP address alredy in use. IP \'%s\'", inet_ntostring(sip).c_str());
-    WriteServLog("IP address alredy in use. IP \'%s\'", inet_ntostring(sip).c_str());
+    printfd(__FILE__, "IP address already in use. IP \'%s\'", inet_ntostring(sip).c_str());
+    WriteServLog("IP address already in use. IP \'%s\'", inet_ntostring(sip).c_str());
     SendError(sip, sport, protoVer, "÷ÁÛ IP ÁÄÒÅÓ ÕÖÅ ÉÓÐÏÌØÚÕÅÔÓÑ!");
     return 0;
     }
 
 // ôÅÐÅÒØ ÍÙ ÄÏÌÖÎÙ ÐÒÏ×ÅÒÉÔØ, ÍÏÖÅÔ ÌÉ ÐÏÌØÚÏ×ÁÔÅÌØ ÐÏÄËÌÀÞÉÔÓÑ Ó ÜÔÏÇÏ ÁÄÒÅÓÁ.
-int ipFound = (*user)->property.ips.Get().IsIPInIPS(sip);
+int ipFound = (*user)->GetProperty().ips.Get().IsIPInIPS(sip);
 if (!ipFound)
     {
     printfd(__FILE__, "User %s. IP address is incorrect. IP \'%s\'\n", (*user)->GetLogin().c_str(), inet_ntostring(sip).c_str());
@@ -881,15 +862,15 @@ switch (pn)
             {
             case 6:
                 connSyn6 = (CONN_SYN_6*)(buff - offset);
-                ret = Process_CONN_SYN_6(connSyn6, &(it->second), user, sip);
+                ret = Process_CONN_SYN_6(connSyn6, &(it->second), sip);
                 break;
             case 7:
                 connSyn7 = (CONN_SYN_7*)(buff - offset);
-                ret = Process_CONN_SYN_7(connSyn7, &(it->second), user, sip);
+                ret = Process_CONN_SYN_7(connSyn7, &(it->second), sip);
                 break;
             case 8:
                 connSyn8 = (CONN_SYN_8*)(buff - offset);
-                ret = Process_CONN_SYN_8(connSyn8, &(it->second), user, sip);
+                ret = Process_CONN_SYN_8(connSyn8, &(it->second), sip);
                 break;
             }
 
@@ -900,13 +881,13 @@ switch (pn)
         switch (protoVer)
             {
             case 6:
-                Send_CONN_SYN_ACK_6(iaUser, user, sip);
+                Send_CONN_SYN_ACK_6(iaUser, sip);
                 break;
             case 7:
-                Send_CONN_SYN_ACK_7(iaUser, user, sip);
+                Send_CONN_SYN_ACK_7(iaUser, sip);
                 break;
             case 8:
-                Send_CONN_SYN_ACK_8(iaUser, user, sip);
+                Send_CONN_SYN_ACK_8(iaUser, sip);
                 break;
             }
         break;
@@ -916,13 +897,13 @@ switch (pn)
         switch (protoVer)
             {
             case 6:
-                ret = Process_CONN_ACK_6(connAck, iaUser, user, sip);
+                ret = Process_CONN_ACK_6(connAck, iaUser, sip);
                 break;
             case 7:
-                ret = Process_CONN_ACK_7(connAck, iaUser, user, sip);
+                ret = Process_CONN_ACK_7(connAck, iaUser, sip);
                 break;
             case 8:
-                ret = Process_CONN_ACK_8((CONN_ACK_8*)(buff - offset), iaUser, user, sip);
+                ret = Process_CONN_ACK_8((CONN_ACK_8*)(buff - offset), iaUser, sip);
                 break;
             }
 
@@ -953,13 +934,13 @@ switch (pn)
         switch (protoVer)
             {
             case 6:
-                ret = Process_ALIVE_ACK_6(aliveAck, iaUser, user, sip);
+                ret = Process_ALIVE_ACK_6(aliveAck, iaUser, sip);
                 break;
             case 7:
-                ret = Process_ALIVE_ACK_7(aliveAck, iaUser, user, sip);
+                ret = Process_ALIVE_ACK_7(aliveAck, iaUser, sip);
                 break;
             case 8:
-                ret = Process_ALIVE_ACK_8((ALIVE_ACK_8*)(buff - offset), iaUser, user, sip);
+                ret = Process_ALIVE_ACK_8((ALIVE_ACK_8*)(buff - offset), iaUser, sip);
                 break;
             }
         break;
@@ -971,13 +952,13 @@ switch (pn)
         switch (protoVer)
             {
             case 6:
-                ret = Process_DISCONN_SYN_6(disconnSyn, iaUser, user, sip);
+                ret = Process_DISCONN_SYN_6(disconnSyn, iaUser, sip);
                 break;
             case 7:
-                ret = Process_DISCONN_SYN_7(disconnSyn, iaUser, user, sip);
+                ret = Process_DISCONN_SYN_7(disconnSyn, iaUser, sip);
                 break;
             case 8:
-                ret = Process_DISCONN_SYN_8((DISCONN_SYN_8*)(buff - offset), iaUser, user, sip);
+                ret = Process_DISCONN_SYN_8((DISCONN_SYN_8*)(buff - offset), iaUser, sip);
                 break;
             }
 
@@ -1004,13 +985,13 @@ switch (pn)
         switch (protoVer)
             {
             case 6:
-                ret = Process_DISCONN_ACK_6(disconnAck, iaUser, user, sip, it);
+                ret = Process_DISCONN_ACK_6(disconnAck, iaUser, sip, it);
                 break;
             case 7:
-                ret = Process_DISCONN_ACK_7(disconnAck, iaUser, user, sip, it);
+                ret = Process_DISCONN_ACK_7(disconnAck, iaUser, sip, it);
                 break;
             case 8:
-                ret = Process_DISCONN_ACK_8((DISCONN_ACK_8*)(buff - offset), iaUser, user, sip, it);
+                ret = Process_DISCONN_ACK_8((DISCONN_ACK_8*)(buff - offset), iaUser, sip, it);
                 break;
             }
 
@@ -1032,7 +1013,7 @@ switch (pn)
 return 0;
 }
 //-----------------------------------------------------------------------------
-void AUTH_IA::DelUser(user_iter u)
+void AUTH_IA::DelUser(USER_PTR u)
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 
@@ -1128,30 +1109,6 @@ gettimeofday(&tv, NULL);
 return res;
 }
 //-----------------------------------------------------------------------------
-void AUTH_IA::InitEncrypt(BLOWFISH_CTX * ctx, const string & password)
-{
-unsigned char keyL[PASSWD_LEN];  // ðÁÒÏÌØ ÄÌÑ ÛÉÆÒÏ×ËÉ
-memset(keyL, 0, PASSWD_LEN);
-strncpy((char *)keyL, password.c_str(), PASSWD_LEN);
-Blowfish_Init(ctx, keyL, PASSWD_LEN);
-}
-//-----------------------------------------------------------------------------
-void AUTH_IA::Decrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8)
-{
-// len8 - ÄÌÉÎÁ × 8-ÍÉ ÂÁÊÔÏ×ÙÈ ÂÌÏËÁÈ
-
-for (int i = 0; i < len8; i++)
-    DecodeString(dst + i * 8, src + i * 8, ctx);
-}
-//-----------------------------------------------------------------------------
-void AUTH_IA::Encrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8)
-{
-// len8 - ÄÌÉÎÁ × 8-ÍÉ ÂÁÊÔÏ×ÙÈ ÂÌÏËÁÈ
-
-for (int i = 0; i < len8; i++)
-    EncodeString(dst + i * 8, src + i * 8, ctx);
-}
-//-----------------------------------------------------------------------------
 int AUTH_IA::SendMessage(const STG_MSG & msg, uint32_t ip) const
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
@@ -1263,7 +1220,7 @@ Send(ip, user.port, buffer, len);
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_CONN_SYN_6(CONN_SYN_6 *, IA_USER * iaUser, user_iter *, uint32_t)
+int AUTH_IA::Process_CONN_SYN_6(CONN_SYN_6 *, IA_USER * iaUser, uint32_t)
 {
 if (!(iaUser->phase.GetPhase() == 1 || iaUser->phase.GetPhase() == 3))
     return -1;
@@ -1275,22 +1232,22 @@ printfd(__FILE__, "Phase changed from %d to 2. Reason: CONN_SYN_6\n", iaUser->ph
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_CONN_SYN_7(CONN_SYN_7 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip)
+int AUTH_IA::Process_CONN_SYN_7(CONN_SYN_7 * connSyn, IA_USER * iaUser, uint32_t sip)
 {
-return Process_CONN_SYN_6(connSyn, iaUser, user, sip);
+return Process_CONN_SYN_6(connSyn, iaUser, sip);
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_CONN_SYN_8(CONN_SYN_8 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip)
+int AUTH_IA::Process_CONN_SYN_8(CONN_SYN_8 * connSyn, IA_USER * iaUser, uint32_t sip)
 {
 #ifdef ARCH_BE
 SwapBytes(connSyn->dirs);
 #endif
-int ret = Process_CONN_SYN_6((CONN_SYN_6*)connSyn, iaUser, user, sip);
+int ret = Process_CONN_SYN_6((CONN_SYN_6*)connSyn, iaUser, sip);
 enabledDirs = connSyn->dirs;
 return ret;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_CONN_ACK_6(CONN_ACK_6 * connAck, IA_USER * iaUser, user_iter *, uint32_t sip)
+int AUTH_IA::Process_CONN_ACK_6(CONN_ACK_6 * connAck, IA_USER * iaUser, uint32_t sip)
 {
 #ifdef ARCH_BE
 SwapBytes(connAck->len);
@@ -1303,7 +1260,7 @@ if ((iaUser->phase.GetPhase() == 2) && (connAck->rnd == iaUser->rnd + 1))
     iaUser->phase.UpdateTime();
 
     iaUser->lastSendAlive = iaUser->phase.GetTime();
-    if (iaUser->user->Authorize(sip, "", enabledDirs, this) == 0)
+    if (iaUser->user->Authorize(sip, enabledDirs, this) == 0)
         {
         iaUser->phase.SetPhase3();
         printfd(__FILE__, "Phase changed from 2 to 3. Reason: CONN_ACK_6\n");
@@ -1321,12 +1278,12 @@ printfd(__FILE__, "Invalid phase or control number. Phase: %d. Control number: %
 return -1;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_CONN_ACK_7(CONN_ACK_7 * connAck, IA_USER * iaUser, user_iter * user, uint32_t sip)
+int AUTH_IA::Process_CONN_ACK_7(CONN_ACK_7 * connAck, IA_USER * iaUser, uint32_t sip)
 {
-return Process_CONN_ACK_6(connAck, iaUser, user, sip);
+return Process_CONN_ACK_6(connAck, iaUser, sip);
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_CONN_ACK_8(CONN_ACK_8 * connAck, IA_USER * iaUser, user_iter *, uint32_t sip)
+int AUTH_IA::Process_CONN_ACK_8(CONN_ACK_8 * connAck, IA_USER * iaUser, uint32_t sip)
 {
 #ifdef ARCH_BE
 SwapBytes(connAck->len);
@@ -1338,7 +1295,7 @@ if ((iaUser->phase.GetPhase() == 2) && (connAck->rnd == iaUser->rnd + 1))
     {
     iaUser->phase.UpdateTime();
     iaUser->lastSendAlive = iaUser->phase.GetTime();
-    if (iaUser->user->Authorize(sip, "", enabledDirs, this) == 0)
+    if (iaUser->user->Authorize(sip, enabledDirs, this) == 0)
         {
         iaUser->phase.SetPhase3();
         printfd(__FILE__, "Phase changed from 2 to 3. Reason: CONN_ACK_8\n");
@@ -1356,7 +1313,7 @@ printfd(__FILE__, "Invalid phase or control number. Phase: %d. Control number: %
 return -1;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_ALIVE_ACK_6(ALIVE_ACK_6 * aliveAck, IA_USER * iaUser, user_iter *, uint32_t)
+int AUTH_IA::Process_ALIVE_ACK_6(ALIVE_ACK_6 * aliveAck, IA_USER * iaUser, uint32_t)
 {
 #ifdef ARCH_BE
 SwapBytes(aliveAck->len);
@@ -1373,12 +1330,12 @@ if ((iaUser->phase.GetPhase() == 3) && (aliveAck->rnd == iaUser->rnd + 1))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_ALIVE_ACK_7(ALIVE_ACK_7 * aliveAck, IA_USER * iaUser, user_iter * user, uint32_t sip)
+int AUTH_IA::Process_ALIVE_ACK_7(ALIVE_ACK_7 * aliveAck, IA_USER * iaUser, uint32_t sip)
 {
-return Process_ALIVE_ACK_6(aliveAck, iaUser, user, sip);
+return Process_ALIVE_ACK_6(aliveAck, iaUser, sip);
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_ALIVE_ACK_8(ALIVE_ACK_8 * aliveAck, IA_USER * iaUser, user_iter *, uint32_t)
+int AUTH_IA::Process_ALIVE_ACK_8(ALIVE_ACK_8 * aliveAck, IA_USER * iaUser, uint32_t)
 {
 #ifdef ARCH_BE
 SwapBytes(aliveAck->len);
@@ -1395,7 +1352,7 @@ if ((iaUser->phase.GetPhase() == 3) && (aliveAck->rnd == iaUser->rnd + 1))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_DISCONN_SYN_6(DISCONN_SYN_6 *, IA_USER * iaUser, user_iter *, uint32_t)
+int AUTH_IA::Process_DISCONN_SYN_6(DISCONN_SYN_6 *, IA_USER * iaUser, uint32_t)
 {
 printfd(__FILE__, "DISCONN_SYN_6\n");
 if (iaUser->phase.GetPhase() != 3)
@@ -1411,12 +1368,12 @@ printfd(__FILE__, "Phase changed from 3 to 4. Reason: DISCONN_SYN_6\n");
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_DISCONN_SYN_7(DISCONN_SYN_7 * disconnSyn, IA_USER * iaUser, user_iter * user, uint32_t sip)
+int AUTH_IA::Process_DISCONN_SYN_7(DISCONN_SYN_7 * disconnSyn, IA_USER * iaUser, uint32_t sip)
 {
-return Process_DISCONN_SYN_6(disconnSyn, iaUser, user, sip);
+return Process_DISCONN_SYN_6(disconnSyn, iaUser, sip);
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_DISCONN_SYN_8(DISCONN_SYN_8 *, IA_USER * iaUser, user_iter *, uint32_t)
+int AUTH_IA::Process_DISCONN_SYN_8(DISCONN_SYN_8 *, IA_USER * iaUser, uint32_t)
 {
 if (iaUser->phase.GetPhase() != 3)
     {
@@ -1433,7 +1390,6 @@ return 0;
 //-----------------------------------------------------------------------------
 int AUTH_IA::Process_DISCONN_ACK_6(DISCONN_ACK_6 * disconnAck,
                                    IA_USER * iaUser,
-                                   user_iter *,
                                    uint32_t,
                                    map<uint32_t, IA_USER>::iterator)
 {
@@ -1451,12 +1407,12 @@ if (!((iaUser->phase.GetPhase() == 4) && (disconnAck->rnd == iaUser->rnd + 1)))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_DISCONN_ACK_7(DISCONN_ACK_7 * disconnAck, IA_USER * iaUser, user_iter * user, uint32_t sip, map<uint32_t, IA_USER>::iterator it)
+int AUTH_IA::Process_DISCONN_ACK_7(DISCONN_ACK_7 * disconnAck, IA_USER * iaUser, uint32_t sip, map<uint32_t, IA_USER>::iterator it)
 {
-return Process_DISCONN_ACK_6(disconnAck, iaUser, user, sip, it);
+return Process_DISCONN_ACK_6(disconnAck, iaUser, sip, it);
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Process_DISCONN_ACK_8(DISCONN_ACK_8 * disconnAck, IA_USER * iaUser, user_iter *, uint32_t, map<uint32_t, IA_USER>::iterator)
+int AUTH_IA::Process_DISCONN_ACK_8(DISCONN_ACK_8 * disconnAck, IA_USER * iaUser, uint32_t, map<uint32_t, IA_USER>::iterator)
 {
 #ifdef ARCH_BE
 SwapBytes(disconnAck->len);
@@ -1472,7 +1428,7 @@ if (!((iaUser->phase.GetPhase() == 4) && (disconnAck->rnd == iaUser->rnd + 1)))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Send_CONN_SYN_ACK_6(IA_USER * iaUser, user_iter *, uint32_t sip)
+int AUTH_IA::Send_CONN_SYN_ACK_6(IA_USER * iaUser, uint32_t sip)
 {
 //+++ Fill static data in connSynAck +++
 // TODO Move this code. It must be executed only once
@@ -1505,12 +1461,12 @@ Encrypt(&iaUser->ctx, (char*)&connSynAck6, (char*)&connSynAck6, Min8(sizeof(CONN
 return Send(sip, iaSettings.GetUserPort(), (char*)&connSynAck6, Min8(sizeof(CONN_SYN_ACK_6)));;
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Send_CONN_SYN_ACK_7(IA_USER * iaUser, user_iter * user, uint32_t sip)
+int AUTH_IA::Send_CONN_SYN_ACK_7(IA_USER * iaUser, uint32_t sip)
 {
-return Send_CONN_SYN_ACK_6(iaUser, user, sip);
+return Send_CONN_SYN_ACK_6(iaUser, sip);
 }
 //-----------------------------------------------------------------------------
-int AUTH_IA::Send_CONN_SYN_ACK_8(IA_USER * iaUser, user_iter *, uint32_t sip)
+int AUTH_IA::Send_CONN_SYN_ACK_8(IA_USER * iaUser, uint32_t sip)
 {
 strcpy((char*)connSynAck8.hdr.magic, IA_ID);
 connSynAck8.hdr.protoVer[0] = 0;
@@ -1557,8 +1513,8 @@ strcpy((char*)aliveSyn6.type, "ALIVE_SYN");
 
 for (int i = 0; i < DIR_NUM; i++)
     {
-    aliveSyn6.md[i] = iaUser->user->property.down.Get()[i];
-    aliveSyn6.mu[i] = iaUser->user->property.up.Get()[i];
+    aliveSyn6.md[i] = iaUser->user->GetProperty().down.Get()[i];
+    aliveSyn6.mu[i] = iaUser->user->GetProperty().up.Get()[i];
 
     aliveSyn6.sd[i] = iaUser->user->GetSessionDownload()[i];
     aliveSyn6.su[i] = iaUser->user->GetSessionUpload()[i];
@@ -1581,7 +1537,7 @@ if (dn < DIR_NUM)
         }
     else
         {
-        double fmb = iaUser->user->property.freeMb;
+        double fmb = iaUser->user->GetProperty().freeMb;
         fmb = fmb < 0 ? 0 : fmb;
         snprintf((char*)aliveSyn6.freeMb, IA_FREEMB_LEN, "%.3f", fmb / p);
         }
@@ -1594,7 +1550,7 @@ else
         }
     else
         {
-        double fmb = iaUser->user->property.freeMb;
+        double fmb = iaUser->user->GetProperty().freeMb;
         fmb = fmb < 0 ? 0 : fmb;
         snprintf((char*)aliveSyn6.freeMb, IA_FREEMB_LEN, "C%.3f", fmb);
         }
@@ -1608,7 +1564,7 @@ if (iaUser->aliveSent)
 iaUser->aliveSent = true;
 #endif
 
-aliveSyn6.cash =(int64_t) (iaUser->user->property.cash.Get() * 1000.0);
+aliveSyn6.cash =(int64_t) (iaUser->user->GetProperty().cash.Get() * 1000.0);
 if (!stgSettings->GetShowFeeInCash())
     aliveSyn6.cash -= (int64_t)(tf->GetFee() * 1000.0);
 
@@ -1647,8 +1603,8 @@ strcpy((char*)aliveSyn8.type, "ALIVE_SYN");
 
 for (int i = 0; i < DIR_NUM; i++)
     {
-    aliveSyn8.md[i] = iaUser->user->property.down.Get()[i];
-    aliveSyn8.mu[i] = iaUser->user->property.up.Get()[i];
+    aliveSyn8.md[i] = iaUser->user->GetProperty().down.Get()[i];
+    aliveSyn8.mu[i] = iaUser->user->GetProperty().up.Get()[i];
 
     aliveSyn8.sd[i] = iaUser->user->GetSessionDownload()[i];
     aliveSyn8.su[i] = iaUser->user->GetSessionUpload()[i];
@@ -1671,7 +1627,7 @@ if (dn < DIR_NUM)
         }
     else
         {
-        double fmb = iaUser->user->property.freeMb;
+        double fmb = iaUser->user->GetProperty().freeMb;
         fmb = fmb < 0 ? 0 : fmb;
         snprintf((char*)aliveSyn8.freeMb, IA_FREEMB_LEN, "%.3f", fmb / p);
         }
@@ -1684,7 +1640,7 @@ else
         }
     else
         {
-        double fmb = iaUser->user->property.freeMb;
+        double fmb = iaUser->user->GetProperty().freeMb;
         fmb = fmb < 0 ? 0 : fmb;
         snprintf((char*)aliveSyn8.freeMb, IA_FREEMB_LEN, "C%.3f", fmb);
         }
@@ -1700,7 +1656,7 @@ iaUser->aliveSent = true;
 
 const TARIFF * tf = iaUser->user->GetTariff();
 
-aliveSyn8.cash =(int64_t) (iaUser->user->property.cash.Get() * 1000.0);
+aliveSyn8.cash =(int64_t) (iaUser->user->GetProperty().cash.Get() * 1000.0);
 if (!stgSettings->GetShowFeeInCash())
     aliveSyn8.cash -= (int64_t)(tf->GetFee() * 1000.0);
 
@@ -1835,3 +1791,30 @@ if (res == 0) // Timeout
 
 return true;
 }
+//-----------------------------------------------------------------------------
+inline
+void InitEncrypt(BLOWFISH_CTX * ctx, const string & password)
+{
+unsigned char keyL[PASSWD_LEN];  // ðÁÒÏÌØ ÄÌÑ ÛÉÆÒÏ×ËÉ
+memset(keyL, 0, PASSWD_LEN);
+strncpy((char *)keyL, password.c_str(), PASSWD_LEN);
+Blowfish_Init(ctx, keyL, PASSWD_LEN);
+}
+//-----------------------------------------------------------------------------
+inline
+void Decrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8)
+{
+// len8 - ÄÌÉÎÁ × 8-ÍÉ ÂÁÊÔÏ×ÙÈ ÂÌÏËÁÈ
+
+for (int i = 0; i < len8; i++)
+    DecodeString(dst + i * 8, src + i * 8, ctx);
+}
+//-----------------------------------------------------------------------------
+inline
+void Encrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8)
+{
+// len8 - ÄÌÉÎÁ × 8-ÍÉ ÂÁÊÔÏ×ÙÈ ÂÌÏËÁÈ
+
+for (int i = 0; i < len8; i++)
+    EncodeString(dst + i * 8, src + i * 8, ctx);
+}