gauthd
 
Loading...
Searching...
No Matches
D:/pwsrc2.0/docs/gauthd/gmysqlclient.hpp
Go to the documentation of this file.
1
7
8 #ifndef __GNET_GMYSQLCLIENT_HPP
9 #define __GNET_GMYSQLCLIENT_HPP
10
11 #include <mysql/mysql.h>
12 #include <vector>
13 #include "protocol.h"
14 #include "thread.h"
15 #include "timersender.h"
16 #include "octets.h"
17 #include "base64.h"
18
19 using namespace GNET;
20
27 {
28 private:
29 bool active;
30 int mysql_state;
31 pthread_mutex_t mysql_mutex;
32 pthread_mutex_t online_mutex;
33 pthread_mutex_t cash_mutex;
34 pthread_mutex_t antibrut_mutex;
35
36 MYSQL *DBMysql;
37 MYSQL_RES * result;
38 MYSQL_ROW row;
39 int query_state;
40
41 // Конфигурационные параметры
42 char ip[20];
43 int port;
44 char user[128];
45 char passwd[128];
46 char db[128];
47 int hash;
48
49 char zoneid;
50 char aid;
51
52 bool lkmod;
53 bool loginlog;
54 char logoutshell[1024];
55
60 struct ONLINE_USER
61 {
62 int userid;
63 int zoneid;
64 int ipaddr;
65 char login[64];
66
74 ONLINE_USER(int userid, int zoneid, char * login, int ipaddr)
75 {
76 this->userid = userid;
77 this->zoneid = zoneid;
78 this->ipaddr = ipaddr;
79 memset(this->login,0x00,64);
80 memcpy(this->login,login,strlen(login));
81 }
82 };
83 std::vector <ONLINE_USER> online_user;
84
89 struct CASH_USER
90 {
91 int userid;
92 int zoneid;
93 int sn;
94 int point;
95 int cash;
96 char creatime[20];
97
107 CASH_USER(int userid, int zoneid, int sn, int point, int cash, char * creatime)
108 {
109 this->userid = userid;
110 this->zoneid = zoneid;
111 this->cash = cash;
112 this->sn = sn;
113 this->point = point;
114 memset(this->creatime,0x00,20);
115 memcpy(this->creatime,creatime,19);
116 }
117 };
118 std::vector <CASH_USER> cash_user;
119
124 struct ANTIBRUT_USER
125 {
126 int ip;
127 int count;
128
133 ANTIBRUT_USER(int ip)
134 {
135 this->ip = ip;
136 this->count = 0;
137 }
138 };
139 std::vector <ANTIBRUT_USER> antibrut_user;
140
141 public:
151 void Init(const char * ip, const int port, const char * user, const char * passwd, const char * db, const int h);
152
159 void AlexPatch(const bool lkmod, const bool log, const char * shell);
160
161 bool Connect();
162 void Disconnect();
163 bool IsActive() { return active; }
164 char GetAid() { return aid; }
165 char GetZoneid() { return zoneid; }
166
173 bool MysqlQuery(char * ptr, size_t len);
174
175 // Далее идут методы для работы с базой данных
176 bool DeleteErrorRow(int status, int uid, char * creatime);
177 bool MatrixPasswd(int &uid, char * login, char * passwd, int ipaddr);
178 bool ClearOnlineRecord(char zoneid, char aid);
179 bool OnlineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite);
180 bool OnfflineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite);
181 bool UserCreatime(int uid, int &timestamp);
182 bool UserGMPrivilege(int uid, char zoneid, bool &IsGM);
183 bool QueryGMPrivilege(int uid, char zoneid, unsigned char * gm_auth, int &count);
184 bool GetUseCashNow(int status, int &count);
185 bool SetUseCashNow(int status, int sn, int userid, char * creatime);
186 bool DelUseCashNow(int status, int uid, int sn);
187 bool AddCashLog(int uid, int zoneid, int sn, int aid, int point, int cash, int status, char * creatime);
188 bool AlexAddLogin(int uid, int action);
189 bool AlexShell(int uid);
190
196 inline int GetUser(int userid)
197 {
198 int res = -1;
199 pthread_mutex_lock(&online_mutex);
200 for (unsigned int i = 0; i < online_user.size(); i++)
201 if (online_user.at(i).userid == userid) res = i;
202 pthread_mutex_unlock(&online_mutex);
203 return res;
204 }
205
211 inline int DelUser(int userid)
212 {
213 int idx = GetUser(userid);
214 pthread_mutex_lock(&online_mutex);
215 if( idx >= 0)
216 online_user.erase(online_user.begin() + idx);
217 pthread_mutex_unlock(&online_mutex);
218 return idx;
219 }
220
229 inline int AddUser(int userid, int zoneid, char * login, int ipaddr)
230 {
231 DelUser(userid);
232 pthread_mutex_lock(&online_mutex);
233 online_user.push_back(ONLINE_USER(userid,zoneid,login,ipaddr));
234 pthread_mutex_unlock(&online_mutex);
235 return GetUser(userid);
236 }
237
243 inline ONLINE_USER * GetUserData(int userid)
244 {
245 int idx = GetUser(userid);
246 if( idx >= 0)
247 return &online_user.at(idx);
248 return NULL;
249 }
250
251 // Методы для работы с кэшем
252 inline int ClearCash()
253 {
254 pthread_mutex_lock(&cash_mutex);
255 cash_user.clear();
256 pthread_mutex_unlock(&cash_mutex);
257 }
258
259 inline int GetCashSize()
260 {
261 int size = 0;
262 pthread_mutex_lock(&cash_mutex);
263 size = cash_user.size();
264 pthread_mutex_unlock(&cash_mutex);
265 return size;
266 }
267
268 inline void DelCashUser(int idx)
269 {
270 pthread_mutex_lock(&cash_mutex);
271 if( idx >= 0 && idx < cash_user.size() )
272 {
273 cash_user.erase(cash_user.begin() + idx);
274 }
275 pthread_mutex_unlock(&cash_mutex);
276 }
277
278 inline void AddCashUser(int userid, int zoneid, int sn, int point, int cash, char * creatime)
279 {
280 pthread_mutex_lock(&cash_mutex);
281 if(creatime)
282 cash_user.push_back(CASH_USER( userid,zoneid,sn,point,cash,creatime));
283 pthread_mutex_unlock(&cash_mutex);
284 }
285
286 inline int GetCashUser(int userid)
287 {
288 int res = -1;
289 pthread_mutex_lock(&cash_mutex);
290 for (unsigned int i = 0; i < cash_user.size(); i++)
291 if (cash_user.at(i).userid == userid) res = i;
292 pthread_mutex_unlock(&cash_mutex);
293 return res;
294 }
295
296 inline void GetAllCashUser(int idx, int &userid, int &zoneid)
297 {
298 pthread_mutex_lock(&cash_mutex);
299 if ( idx >= 0 && idx < cash_user.size() )
300 {
301 userid = cash_user.at(idx).userid;
302 zoneid = cash_user.at(idx).zoneid;
303 }
304 pthread_mutex_unlock(&cash_mutex);
305 }
306
307 inline char * GetCashCreaTime(int idx)
308 {
309 char * creatime = NULL;
310 pthread_mutex_lock(&cash_mutex);
311 if( idx >= 0 && idx < cash_user.size() )
312 creatime = cash_user.at(idx).creatime;
313 pthread_mutex_unlock(&cash_mutex);
314 return creatime;
315 }
316
317 inline int GetCashCash(int idx)
318 {
319 int res = 0;
320 pthread_mutex_lock(&cash_mutex);
321 if( idx >= 0 && idx < cash_user.size() )
322 res = cash_user.at(idx).cash;
323 pthread_mutex_unlock(&cash_mutex);
324 return res;
325 }
326
327 inline int GetCashPoint(int idx)
328 {
329 int res = 0;
330 pthread_mutex_lock(&cash_mutex);
331 if( idx >= 0 && idx < cash_user.size() )
332 res = cash_user.at(idx).point;
333 pthread_mutex_unlock(&cash_mutex);
334 return res;
335 }
336
337 // Методы для защиты от brute-force
338 inline void ClearAntibrutUser()
339 {
340 pthread_mutex_lock(&antibrut_mutex);
341 antibrut_user.clear();
342 pthread_mutex_unlock(&antibrut_mutex);
343 }
344
345 inline int SizeAntibrutUser()
346 {
347 int res = 0;
348 pthread_mutex_lock(&antibrut_mutex);
349 res = antibrut_user.size();
350 pthread_mutex_unlock(&antibrut_mutex);
351 return res;
352 }
353
354 inline int GetAntibrutUser(int ip)
355 {
356 int res = -1;
357 pthread_mutex_lock(&antibrut_mutex);
358 for (unsigned int i = 0; i < antibrut_user.size(); i++)
359 if (antibrut_user.at(i).ip == ip) res = i;
360 pthread_mutex_unlock(&antibrut_mutex);
361 return res;
362 }
363
364 inline int DelAntibrutUser(int ip)
365 {
366 int idx = GetAntibrutUser(ip);
367 pthread_mutex_lock(&antibrut_mutex);
368 if( idx >= 0)
369 antibrut_user.erase(antibrut_user.begin() + idx);
370 pthread_mutex_unlock(&antibrut_mutex);
371 return idx;
372 }
373
374 inline int AddAntibrutUser(int ip)
375 {
376 int res = 0;
377 int idx = GetAntibrutUser(ip);
378 pthread_mutex_lock(&antibrut_mutex);
379 if( idx >= 0)
380 res = ++antibrut_user.at(idx).count;
381 else
382 antibrut_user.push_back(ANTIBRUT_USER(ip));
383 pthread_mutex_unlock(&antibrut_mutex);
384 return res;
385 }
386
387 // Вспомогательные методы
388 inline int ATOI(const char * ptr)
389 {
390 if(ptr)
391 return atoi(ptr);
392 return 0;
393 }
394
395 inline void Auth0xMD5(char * out, char * in)
396 {
397 int nt = 0;
398 if(in[0] == '0' && in[1] == 'x') in += 2;
399 for(int i = 0; i < 16; ++i)
400 {
401 sscanf(&in[i*2], "%02x", &nt);
402 out[i] = (char)nt;
403 }
404 }
405
406 inline void AuthBase64(char * passwd, char * auth)
407 {
408 Octets in;
409 Octets out;
410 in.replace(auth, strlen(auth));
411 Base64Decoder::Convert(out, in);
412 memcpy(passwd,out.begin(),16);
413 }
414
425 inline bool AuthPasswd(char * passwd, char * auth)
426 {
427 switch (hash)
428 {
429 case 1: //binary
430 memcpy(passwd,auth,16);
431 return true;
432 case 2: //0xMD5
433 Auth0xMD5(passwd,auth);
434 return true;
435 case 3: //base64
436 AuthBase64(passwd,auth);
437 return true;
438 default:
439 break;
440 }
441 return false;
442 }
443
450 bool ValidLogin(char * login, int size)
451 {
452 for (int i = 0; i < size && i < 32; i++)
453 {
454 if( !(login[i] >= '0' && login[i] <= '9') &&
455 !(login[i] >= 'A' && login[i] <= 'Z') &&
456 !(login[i] >= 'a' && login[i] <= 'z') )
457 return false;
458 }
459 return true;
460 }
461
467 void AddrToStr(unsigned int ip, char * address)
468 {
469 unsigned char bytes[4];
470 bytes[0] = ip & 0xFF;
471 bytes[1] = (ip >> 8) & 0xFF;
472 bytes[2] = (ip >> 16) & 0xFF;
473 bytes[3] = (ip >> 24) & 0xFF;
474 sprintf(address,"%d.%d.%d.%d", bytes[3], bytes[2], bytes[1], bytes[0]);
475 }
476
482 {
483 if (!instance)
484 instance = new GMysqlClient();
485 return instance;
486 }
488 };
489
490 #endif
Основной класс для работы с MySQL базой данных
void DelCashUser(int idx)
bool DelUseCashNow(int status, int uid, int sn)
Удаление записи из usecashnow.
bool AddCashLog(int uid, int zoneid, int sn, int aid, int point, int cash, int status, char *creatime)
Добавление записи в лог операций с наличностью
void Init(const char *ip, const int port, const char *user, const char *passwd, const char *db, const int h)
Инициализация параметров подключения
void AlexPatch(const bool lkmod, const bool log, const char *shell)
Дополнительные настройки
bool GetUseCashNow(int status, int &count)
Получение записей usecashnow по статусу
ONLINE_USER * GetUserData(int userid)
Получить данные пользователя
bool MysqlQuery(char *ptr, size_t len)
Выполнить SQL запрос
void AddrToStr(unsigned int ip, char *address)
Преобразование IP адреса в строку
bool DeleteErrorRow(int status, int uid, char *creatime)
Удаление ошибочных записей из таблицы usecashnow.
bool ClearOnlineRecord(char zoneid, char aid)
Очистка онлайн-записей для указанной зоны и аккаунта
bool AlexShell(int uid)
Выполнение shell-команды при выходе пользователя
bool ValidLogin(char *login, int size)
Проверка валидности логина
bool AuthPasswd(char *passwd, char *auth)
Преобразование аутентификационных данных
static GMysqlClient * instance
Единственный экземпляр класса
bool Connect()
Установить соединение с БД
void Disconnect()
Разорвать соединение с БД
bool IsActive()
Проверить активность соединения
bool OnfflineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite)
Запись информации о выходе пользователя из онлайн
void GetAllCashUser(int idx, int &userid, int &zoneid)
bool SetUseCashNow(int status, int sn, int userid, char *creatime)
Обновление статуса записи в usecashnow.
char GetAid()
Получить ID приложения
bool OnlineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite)
Запись информации о входе пользователя в онлайн
int GetCashPoint(int idx)
static GMysqlClient * GetInstance()
Получить экземпляр класса (Singleton)
int DelAntibrutUser(int ip)
bool AlexAddLogin(int uid, int action)
Логирование действия входа/выхода (специальный функционал)
int ATOI(const char *ptr)
bool UserGMPrivilege(int uid, char zoneid, bool &IsGM)
Получение времени создания пользователя в UNIX-формате
void AuthBase64(char *passwd, char *auth)
int GetAntibrutUser(int ip)
int GetUser(int userid)
Найти пользователя по ID.
int AddUser(int userid, int zoneid, char *login, int ipaddr)
Добавить пользователя в онлайн-список
int AddAntibrutUser(int ip)
void AddCashUser(int userid, int zoneid, int sn, int point, int cash, char *creatime)
bool UserCreatime(int uid, int &timestamp)
Получение времени создания пользователя в UNIX-формате
void ClearAntibrutUser()
int GetCashCash(int idx)
char GetZoneid()
Получить ID зоны
int GetCashUser(int userid)
bool MatrixPasswd(int &uid, char *login, char *passwd, int ipaddr)
Проверка учетных данных пользователя.
bool QueryGMPrivilege(int uid, char zoneid, unsigned char *gm_auth, int &count)
Получение списка GM-привилегий пользователя
void Auth0xMD5(char *out, char *in)
int DelUser(int userid)
Удалить пользователя из онлайн-списка
char * GetCashCreaTime(int idx)
Основное пространство имен для сетевых компонентов системы.