]> git.stg.codes - stg.git/blobdiff - stglibs/ia_auth_c.lib/ia_auth_c.cpp
Додано патч від Alexey Osipov <lion-simba@pridelands.ru>
[stg.git] / stglibs / ia_auth_c.lib / ia_auth_c.cpp
index d97692ea87187bbcf85e0de5dc0cd1114072b6de..fb13d5b6623869ffc3549b9e4fcde27d8744e9f7 100644 (file)
 /*
 * Author :
 * Boris Mikhailenko <stg34@stargazer.dp.ua>
 /*
 * Author :
 * Boris Mikhailenko <stg34@stargazer.dp.ua>
-* Andrey Rakhmanov <andrey_rakhmanov@yahoo.com> - èñïðàâëåíèå äâóõ áàãîâ.
+* Maxim Mamontov <faust@stargazer.dp.ua>
+* Andrey Rakhmanov <andrey_rakhmanov@yahoo.com> - bugfixes.
 */
 
 //---------------------------------------------------------------------------
 
 */
 
 //---------------------------------------------------------------------------
 
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <string.h>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
 
 #ifdef WIN32
     #include <winsock2.h>
 
 #ifdef WIN32
     #include <winsock2.h>
@@ -108,19 +109,13 @@ return 0;
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 IA_CLIENT_PROT::IA_CLIENT_PROT(const string & sn, unsigned short p, uint16_t localPort)
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 IA_CLIENT_PROT::IA_CLIENT_PROT(const string & sn, unsigned short p, uint16_t localPort)
-    : stat(),
-      action(IA_NONE),
+    : action(IA_NONE),
       phase(1),
       phaseTime(0),
       phase(1),
       phaseTime(0),
-      messageText(),
-      infoText(),
-      strError(),
       codeError(0),
       codeError(0),
-      nonstop(true),
+      nonstop(false),
       isNetPrepared(false),
       proxyMode(false),
       isNetPrepared(false),
       proxyMode(false),
-      password(),
-      login(),
       serverName(sn),
       port(p),
       ip(0),
       serverName(sn),
       port(p),
       ip(0),
@@ -142,7 +137,6 @@ IA_CLIENT_PROT::IA_CLIENT_PROT(const string & sn, unsigned short p, uint16_t loc
       infoCbData(NULL),
       errorCbData(NULL),
       dirNameCbData(NULL),
       infoCbData(NULL),
       errorCbData(NULL),
       dirNameCbData(NULL),
-      packetTypes(),
       connSyn8(NULL),
       connSynAck8(NULL),
       connAck8(NULL),
       connSyn8(NULL),
       connSynAck8(NULL),
       connAck8(NULL),
@@ -151,7 +145,6 @@ IA_CLIENT_PROT::IA_CLIENT_PROT(const string & sn, unsigned short p, uint16_t loc
       disconnSyn8(NULL),
       disconnSynAck8(NULL),
       disconnAck8(NULL),
       disconnSyn8(NULL),
       disconnSynAck8(NULL),
       disconnAck8(NULL),
-      err(),
       info(NULL)
 {
 memset(&stat, 0, sizeof(stat));
       info(NULL)
 {
 memset(&stat, 0, sizeof(stat));
@@ -175,9 +168,21 @@ packetTypes["INFO_7"] = INFO_7_N;
 packetTypes["INFO_8"] = INFO_8_N;
 
 unsigned char key[IA_PASSWD_LEN];
 packetTypes["INFO_8"] = INFO_8_N;
 
 unsigned char key[IA_PASSWD_LEN];
-memset(key, 0, IA_LOGIN_LEN);
+memset(key, 0, IA_PASSWD_LEN);
 strncpy((char *)key, "pr7Hhen", 8);
 Blowfish_Init(&ctxHdr, key, IA_PASSWD_LEN);
 strncpy((char *)key, "pr7Hhen", 8);
 Blowfish_Init(&ctxHdr, key, IA_PASSWD_LEN);
+
+memset(key, 0, IA_PASSWD_LEN);
+Blowfish_Init(&ctxPass, key, IA_PASSWD_LEN);
+
+for (size_t i = 0; i < DIR_NUM; ++i)
+    {
+    selectedDirs[i] = false;
+    }
+
+servAddr.sin_family = AF_INET;
+servAddr.sin_port = htons(port);
+servAddr.sin_addr.s_addr = ip;
 }
 //---------------------------------------------------------------------------
 void IA_CLIENT_PROT::PrepareNet()
 }
 //---------------------------------------------------------------------------
 void IA_CLIENT_PROT::PrepareNet()
@@ -198,7 +203,7 @@ if (ip == INADDR_NONE)
         strError = string("Unknown host ") + "\'" + serverName + "\'";
         codeError = IA_GETHOSTBYNAME_ERROR;
         if (pErrorCb != NULL)
         strError = string("Unknown host ") + "\'" + serverName + "\'";
         codeError = IA_GETHOSTBYNAME_ERROR;
         if (pErrorCb != NULL)
-            pErrorCb(messageText, IA_GETHOSTBYNAME_ERROR, errorCbData);
+            pErrorCb(strError, IA_GETHOSTBYNAME_ERROR, errorCbData);
         }
     }
 
         }
     }
 
@@ -208,12 +213,9 @@ close(sockr);
 closesocket(sockr);
 #endif
 
 closesocket(sockr);
 #endif
 
-sockr = socket(AF_INET, SOCK_DGRAM, 0);  // Cîêåò ÷åðåç êîòîðûé øëåì è ïðèíèìàåì
-
-localAddrS.sin_family = AF_INET;
-localAddrS.sin_port = htons(port);
-localAddrS.sin_addr.s_addr = inet_addr("0.0.0.0");
+sockr = socket(AF_INET, SOCK_DGRAM, 0);
 
 
+struct sockaddr_in  localAddrR;
 localAddrR.sin_family = AF_INET;
 
 if (localPort)
 localAddrR.sin_family = AF_INET;
 
 if (localPort)
@@ -232,7 +234,7 @@ if (res == -1)
     strError = "bind error";
     codeError = IA_BIND_ERROR;
     if (pErrorCb != NULL)
     strError = "bind error";
     codeError = IA_BIND_ERROR;
     if (pErrorCb != NULL)
-        pErrorCb(messageText, IA_BIND_ERROR, errorCbData);
+        pErrorCb(strError, IA_BIND_ERROR, errorCbData);
     return;
     }
 
     return;
     }
 
@@ -245,7 +247,7 @@ if (0 != fcntl(sockr, F_SETFL, O_NONBLOCK))
     strError = "fcntl error";
     codeError = IA_FCNTL_ERROR;
     if (pErrorCb != NULL)
     strError = "fcntl error";
     codeError = IA_FCNTL_ERROR;
     if (pErrorCb != NULL)
-        pErrorCb(messageText, IA_FCNTL_ERROR, errorCbData);
+        pErrorCb(strError, IA_FCNTL_ERROR, errorCbData);
     }
 #endif
 
     }
 #endif
 
@@ -291,14 +293,12 @@ if (!isNetPrepared)
     isNetPrepared = true;
     }
 
     isNetPrepared = true;
     }
 
-// Øèôðóåì LoginS
 int db = sizeof(HDR_8);
 for (int i = 0; i < IA_LOGIN_LEN/8; i++)
     {
     Blowfish_Encrypt(&ctxHdr, (uint32_t*)(buffer + db + i*8), (uint32_t*)(buffer + db + i*8 + 4));
     }
 
 int db = sizeof(HDR_8);
 for (int i = 0; i < IA_LOGIN_LEN/8; i++)
     {
     Blowfish_Encrypt(&ctxHdr, (uint32_t*)(buffer + db + i*8), (uint32_t*)(buffer + db + i*8 + 4));
     }
 
-// Øèôðóåì âñ¸ îñòàëüíîå
 db += IA_LOGIN_LEN;
 int encLen = (len - sizeof(HDR_8) - IA_LOGIN_LEN)/8;
 for (int i = 0; i < encLen; i++)
 db += IA_LOGIN_LEN;
 int encLen = (len - sizeof(HDR_8) - IA_LOGIN_LEN)/8;
 for (int i = 0; i < encLen; i++)
@@ -420,6 +420,7 @@ return ret;
 //---------------------------------------------------------------------------
 void IA_CLIENT_PROT::Start()
 {
 //---------------------------------------------------------------------------
 void IA_CLIENT_PROT::Start()
 {
+nonstop = true;
 #ifdef WIN32
 unsigned long pt;
 CreateThread(NULL, 16384, RunW, this, 0, &pt);
 #ifdef WIN32
 unsigned long pt;
 CreateThread(NULL, 16384, RunW, this, 0, &pt);
@@ -719,15 +720,9 @@ connSyn8 = (CONN_SYN_8*)buffer;
 SwapBytes(connSyn8->len);
 #endif
 
 SwapBytes(connSyn8->len);
 #endif
 
-connSyn8->len = sizeof(CONN_SYN_8);
-#ifdef IA_DEBUGPROTO
-if (sizeof(CONN_SYN_8) != Min8(sizeof(CONN_SYN_8)))
-    {
-    int * a = NULL;
-    *a = 0;
-    }
-#endif
+assert(sizeof(CONN_SYN_8) == Min8(sizeof(CONN_SYN_8)) && "CONN_SYN_8 is not aligned to 8 bytes");
 
 
+connSyn8->len = sizeof(CONN_SYN_8);
 strncpy((char*)connSyn8->type, "CONN_SYN", IA_MAX_TYPE_LEN);
 strncpy((char*)connSyn8->login, login.c_str(), IA_LOGIN_LEN);
 connSyn8->dirs = 0;
 strncpy((char*)connSyn8->type, "CONN_SYN", IA_MAX_TYPE_LEN);
 strncpy((char*)connSyn8->login, login.c_str(), IA_LOGIN_LEN);
 connSyn8->dirs = 0;
@@ -747,13 +742,7 @@ SwapBytes(connAck8->len);
 SwapBytes(connAck8->rnd);
 #endif
 
 SwapBytes(connAck8->rnd);
 #endif
 
-#ifdef IA_DEBUGPROTO
-if (sizeof(CONN_ACK_8) != Min8(sizeof(CONN_ACK_8)))
-    {
-    int * a = NULL;
-    *a = 0;
-    }
-#endif
+assert(sizeof(CONN_ACK_8) == Min8(sizeof(CONN_ACK_8)) && "CONN_ACK_8 is not aligned to 8 bytes");
 
 connAck8->len = sizeof(CONN_ACK_8);
 strncpy((char*)connAck8->loginS, login.c_str(), IA_LOGIN_LEN);
 
 connAck8->len = sizeof(CONN_ACK_8);
 strncpy((char*)connAck8->loginS, login.c_str(), IA_LOGIN_LEN);
@@ -773,13 +762,7 @@ SwapBytes(aliveAck8->len);
 SwapBytes(aliveAck8->rnd);
 #endif
 
 SwapBytes(aliveAck8->rnd);
 #endif
 
-#ifdef IA_DEBUGPROTO
-if (Min8(sizeof(ALIVE_ACK_8)) != sizeof(ALIVE_ACK_8))
-    {
-    int * a = NULL;
-    *a = 0;
-    }
-#endif
+assert(Min8(sizeof(ALIVE_ACK_8)) == sizeof(ALIVE_ACK_8) && "ALIVE_ACK_8 is not aligned to 8 bytes");
 
 aliveAck8 = (ALIVE_ACK_8*)buffer;
 aliveAck8->len = sizeof(ALIVE_ACK_8);
 
 aliveAck8 = (ALIVE_ACK_8*)buffer;
 aliveAck8->len = sizeof(ALIVE_ACK_8);
@@ -797,13 +780,7 @@ disconnSyn8 = (DISCONN_SYN_8*)buffer;
 SwapBytes(disconnSyn8->len);
 #endif
 
 SwapBytes(disconnSyn8->len);
 #endif
 
-#ifdef IA_DEBUGPROTO
-if (Min8(sizeof(DISCONN_SYN_8)) != sizeof(DISCONN_SYN_8))
-    {
-    int * a = NULL;
-    *a = 0;
-    }
-#endif
+assert(Min8(sizeof(DISCONN_SYN_8)) == sizeof(DISCONN_SYN_8) && "DISCONN_SYN_8 is not aligned to 8 bytes");
 
 disconnSyn8->len = sizeof(DISCONN_SYN_8);
 strncpy((char*)disconnSyn8->loginS, login.c_str(), IA_LOGIN_LEN);
 
 disconnSyn8->len = sizeof(DISCONN_SYN_8);
 strncpy((char*)disconnSyn8->loginS, login.c_str(), IA_LOGIN_LEN);
@@ -821,13 +798,7 @@ SwapBytes(disconnAck8->len);
 SwapBytes(disconnAck8->rnd);
 #endif
 
 SwapBytes(disconnAck8->rnd);
 #endif
 
-#ifdef IA_DEBUGPROTO
-if (Min8(sizeof(DISCONN_ACK_8)) != sizeof(DISCONN_ACK_8))
-    {
-    int * a = NULL;
-    *a = 0;
-    }
-#endif
+assert(Min8(sizeof(DISCONN_ACK_8)) == sizeof(DISCONN_ACK_8) && "DISCONN_ACK_8 is not aligned to 8 bytes");
 
 disconnAck8->len = Min8(sizeof(DISCONN_ACK_8));
 disconnAck8->rnd = rnd + 1;
 
 disconnAck8->len = Min8(sizeof(DISCONN_ACK_8));
 disconnAck8->rnd = rnd + 1;