]> git.stg.codes - stg.git/blobdiff - projects/sgauthstress/user.cpp
Handle short string correctly in blowfish encription.
[stg.git] / projects / sgauthstress / user.cpp
index bea1c6b7126b47c3b650f2ad79b69f40a316a673..944907fe8abf74221dd12e2b3acd076a71e0abf5 100644 (file)
@@ -1,26 +1,98 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <unistd.h> // close
+
+#include <cstring>
+#include <cerrno>
+#include <stdexcept>
+
 #include "user.h"
+#include "stg/ia_packets.h"
+#include "stg/common.h"
 
 USER::USER(const std::string & l,
-           const std::string & pwd)
+           const std::string & pwd,
+           uint32_t i)
     : login(l),
+      password(pwd),
+      ip(i),
+      aliveTimeout(5),
+      userTimeout(60),
+      phase(1),
+      phaseChangeTime(0),
+      rnd(0),
+      sock(-1)
+{
+unsigned char key[IA_PASSWD_LEN];
+memset(key, 0, IA_PASSWD_LEN);
+strncpy((char *)key, password.c_str(), IA_PASSWD_LEN);
+Blowfish_Init(&ctx, key, IA_PASSWD_LEN);
+}
+
+USER::USER(const USER & rvalue)
+    : login(rvalue.login),
+      password(rvalue.password),
+      ip(rvalue.ip),
+      aliveTimeout(rvalue.aliveTimeout),
+      userTimeout(rvalue.userTimeout),
       phase(1),
+      phaseChangeTime(0),
       rnd(0),
-      sock(0)
+      sock(-1)
 {
-char key[IA_PASSWD_LEN];
+unsigned char key[IA_PASSWD_LEN];
 memset(key, 0, IA_PASSWD_LEN);
-strncpy(key, password.c_str(), IA_PASSWD_LEN);
+strncpy((char *)key, password.c_str(), IA_PASSWD_LEN);
 Blowfish_Init(&ctx, key, IA_PASSWD_LEN);
 }
 
 USER::~USER()
 {
+if (sock > 0)
+    close(sock);
 }
 
-void USER::Connect()
+USER & USER::operator=(const USER & rvalue)
 {
+login = rvalue.login;
+password = rvalue.password;
+ip = rvalue.ip;
+aliveTimeout = rvalue.aliveTimeout;
+userTimeout = rvalue.userTimeout;
+phase = 1;
+phaseChangeTime = 0;
+rnd = 0;
+sock = -1;
+
+unsigned char key[IA_PASSWD_LEN];
+memset(key, 0, IA_PASSWD_LEN);
+strncpy((char *)key, password.c_str(), IA_PASSWD_LEN);
+Blowfish_Init(&ctx, key, IA_PASSWD_LEN);
+
+return *this;
 }
 
-void USER::Disconnect()
+bool USER::InitNetwork()
 {
+sock = socket(AF_INET, SOCK_DGRAM, 0);
+
+if (sock < 0)
+    {
+    throw std::runtime_error(std::string("USER::USER() - socket creation error: '") + strerror(errno) + "', ip: " + inet_ntostring(ip) + ", login: " + login);
+    }
+
+struct sockaddr_in addr;
+
+addr.sin_family = AF_INET;
+addr.sin_addr.s_addr = ip;
+addr.sin_port = htons(5554); // :(
+
+int res = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
+if (res == -1)
+    {
+    throw std::runtime_error(std::string("USER::USER() - bind error: '") + strerror(errno) + "', ip: " + inet_ntostring(ip) + ", login: " + login);
+    }
+
+return true;
 }