/*-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-*/ #include "CommonInclude.h" #include "GeneralAgentTcpSocketServer.h" #include <string.h> /* memset */ CGeneralAgentTcpSocket::CGeneralAgentTcpSocket(ISocketHandler& h) : TcpSocket(h) { // ��Handle�Լ����� SetDeleteByHandler(); // ��ݲ����� //DisableInputBuffer(); memset(&m_headLastOn, 0, sizeof(remote_header_t)); m_tOnData = 0; }
CGeneralAgentTcpSocketConnector::CGeneralAgentTcpSocketConnector(ISocketHandler& h) :CGeneralAgentTcpSocket(h) ,m_b_connected(false) { m_pWifi = NULL; // initial connection timeout setting SetConnectTimeout(5); SetDeleteByHandler(); }
/*-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-*/ #include "CommonInclude.h" #include "GeneralAgentTcpSocket.h" #include <string.h> /* memset */ #include <str_opr.h> /* dump */ CGeneralAgentTcpSocket::CGeneralAgentTcpSocket(ISocketHandler& h, std::string strSocketName) : TcpSocket(h) { // 由Handle自己管理 SetDeleteByHandler(); // 数据不缓存 #ifdef USE_DATAPARSE_EXAMPLE memset(&m_headLastOn, 0, sizeof(WIFI_AGENT_PROTOCOL_HEAD)); #else DisableInputBuffer(); #endif //USE_DATAPARSE_EXAMPLE m_tOnData = 0; SetSockName(strSocketName); }
/// Read data from the network void RASocket::OnRead() { ///- Read data and check input length TcpSocket::OnRead(); unsigned int sz=ibuf.GetLength(); if (iInputLength+sz>=RA_BUFF_SIZE) { sLog.outRemote("Input buffer overflow, possible DOS attack.\n"); SetCloseAndDelete(); return; } char *inp = new char [sz+1]; ibuf.Read(inp,sz); /// \todo Can somebody explain this 'Linux bugfix'? if (stage==NONE) if (sz>4) //linux remote telnet if (memcmp(inp ,"USER ",5)) { delete [] inp;return; printf("lin bugfix"); } //linux bugfix ///- Discard data after line break or line feed bool gotenter=false; unsigned int y=0; for (; y<sz; y++) if (inp[y]=='\r'||inp[y]=='\n') { gotenter=true; break; } //No buffer overflow (checked above) memcpy(&buff[iInputLength],inp,y); iInputLength+=y; delete [] inp; if (gotenter) { buff[iInputLength]=0; iInputLength=0; switch(stage) { /// <ul> <li> If the input is 'USER <username>' case NONE: if (!memcmp(buff,"USER ",5)) //got "USER" cmd { szLogin=&buff[5]; ///- Get the password from the account table std::string login = szLogin; ///- Convert Account name to Upper Format AccountMgr::normalizeString(login); ///- Escape the Login to allow quotes in names LoginDatabase.escape_string(login); QueryResult result = LoginDatabase.PQuery("SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = '******'",login.c_str ()); ///- If the user is not found, deny access if (!result) { Sendf("-No such user.\r\n"); sLog.outRemote("User %s does not exist.\n",szLogin.c_str()); if (bSecure)SetCloseAndDelete(); } else { Field *fields = result->Fetch(); //szPass=fields[0].GetString(); ///- if gmlevel is too low, deny access if (fields[1].GetUInt32() < iMinLevel) { Sendf("-Not enough privileges.\r\n"); sLog.outRemote("User %s has no privilege.\n",szLogin.c_str()); if (bSecure)SetCloseAndDelete(); } else if (fields[2].GetInt32() != -1) { ///- if RealmID isn't -1, deny access Sendf("-Not enough privileges.\r\n"); sLog.outRemote("User %s has to be assigned on all realms (with RealmID = '-1').\n",szLogin.c_str()); if (bSecure)SetCloseAndDelete(); } else { stage=LG; } } } break; ///<li> If the input is 'PASS <password>' (and the user already gave his username) case LG: if (!memcmp(buff,"PASS ",5)) //got "PASS" cmd { //login+pass ok ///- If password is correct, increment the number of active administrators std::string login = szLogin; std::string pw = &buff[5]; AccountMgr::normalizeString(login); AccountMgr::normalizeString(pw); LoginDatabase.escape_string(login); LoginDatabase.escape_string(pw); QueryResult check = LoginDatabase.PQuery( "SELECT 1 FROM account WHERE username = '******' AND sha_pass_hash=SHA1(CONCAT('%s',':','%s'))", login.c_str(), login.c_str(), pw.c_str()); if (check) { GetSocket(); stage=OK; Sendf("+Logged in.\r\n"); sLog.outRemote("User %s has logged in.\n",szLogin.c_str()); Sendf("TC>"); } else { ///- Else deny access Sendf("-Wrong pass.\r\n"); sLog.outRemote("User %s has failed to log in.\n",szLogin.c_str()); if (bSecure)SetCloseAndDelete(); } } break; ///<li> If user is logged, parse and execute the command case OK: if (strlen(buff)) { sLog.outRemote("Got '%s' cmd.\n",buff); SetDeleteByHandler(false); CliCommandHolder* cmd = new CliCommandHolder(this, buff, &RASocket::zprint, &RASocket::commandFinished); sWorld.QueueCliCommand(cmd); ++pendingCommands; } else Sendf("TC>"); break; ///</ul> }; } }