/*
* 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>
#include <unistd.h>
#endif
-#include "common.h"
+#include "stg/common.h"
#include "ia_auth_c.h"
#define IA_NONE (0)
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
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),
- messageText(),
- infoText(),
- strError(),
codeError(0),
- nonstop(true),
+ nonstop(false),
isNetPrepared(false),
proxyMode(false),
- password(),
- login(),
serverName(sn),
port(p),
ip(0),
infoCbData(NULL),
errorCbData(NULL),
dirNameCbData(NULL),
- packetTypes(),
connSyn8(NULL),
connSynAck8(NULL),
connAck8(NULL),
disconnSyn8(NULL),
disconnSynAck8(NULL),
disconnAck8(NULL),
- err(),
info(NULL)
{
memset(&stat, 0, sizeof(stat));
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);
+
+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()
strError = string("Unknown host ") + "\'" + serverName + "\'";
codeError = IA_GETHOSTBYNAME_ERROR;
if (pErrorCb != NULL)
- pErrorCb(messageText, IA_GETHOSTBYNAME_ERROR, errorCbData);
+ pErrorCb(strError, IA_GETHOSTBYNAME_ERROR, errorCbData);
}
}
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)
strError = "bind error";
codeError = IA_BIND_ERROR;
if (pErrorCb != NULL)
- pErrorCb(messageText, IA_BIND_ERROR, errorCbData);
+ pErrorCb(strError, IA_BIND_ERROR, errorCbData);
return;
}
strError = "fcntl error";
codeError = IA_FCNTL_ERROR;
if (pErrorCb != NULL)
- pErrorCb(messageText, IA_FCNTL_ERROR, errorCbData);
+ pErrorCb(strError, IA_FCNTL_ERROR, errorCbData);
}
#endif
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));
}
-// Øèôðóåì âñ¸ îñòàëüíîå
db += IA_LOGIN_LEN;
int encLen = (len - sizeof(HDR_8) - IA_LOGIN_LEN)/8;
for (int i = 0; i < encLen; i++)
//---------------------------------------------------------------------------
void IA_CLIENT_PROT::Start()
{
+nonstop = true;
#ifdef WIN32
unsigned long pt;
CreateThread(NULL, 16384, RunW, this, 0, &pt);
//---------------------------------------------------------------------------
int IA_CLIENT_PROT::Process_ERROR(const char * buffer)
{
+ERR_8 err;
memcpy(&err, buffer, sizeof(err));
#ifdef ARCH_BE
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;
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);
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);
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);
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;