int Read_Handler(char* buf,struct sockaddr_in* cliaddr) { int ret; user_t* user = Sch_Userbysock(cliaddr); int type = *(int*)buf; switch(type) { case REQ_LOGIN: ret = Handle_Login(buf, cliaddr); break; case REQ_LOGOUT: ret = Handle_Logout(user); break; case REQ_JOIN: ret = Handle_join(user, buf,cliaddr); break; case REQ_LEAVE: ret = Handle_Leave(user, buf,cliaddr); break; case REQ_SAY: ret = Handle_Say(user, buf,cliaddr); break; case REQ_LIST: ret = Handle_List(user, cliaddr); break; case REQ_WHO: ret = Handle_Who(user, buf,cliaddr); break; case REQ_KEEP_ALIVE: ret = Handle_Keep_Alive(user, buf,cliaddr); break; case TXT_JOIN_S2S: S2S_Handle_join(user, buf,cliaddr); break; case TXT_LEAVE_S2S: S2S_Handle_Leave(user, buf,cliaddr); break; case TXT_SAY_S2S: S2S_Handle_Say(user, buf,cliaddr); break; default: { char* err = "Unkown command."; int len = strlen(err); if(user) Error_Handler(err,user->cliaddr,len); else Error_Handler(err,cliaddr,len); break; } } return ret; }
// This function checks if chat from irc is a command or not // return true on yes and false on no bool IRCCmd::IsValid(std::string USER, std::string FROM, std::string CHAT, std::string TYPE) { // If the first line of our chat is the command prefix we have a command if(CHAT.substr(0, 1) == sIRC._cmd_prefx && CHAT.size() > 1 ) { _CDATA CDATA; bool cValid = false; bool AuthValid = true; bool dontlog = true; std::string* _PARAMS = getArray(CHAT, 2); CDATA.USER = USER; CDATA.FROM = FROM; CDATA.TYPE = TYPE; CDATA.PCOUNT = 0; CDATA.CMD = MakeUpper(_PARAMS[0].substr(1, _PARAMS[0].size() - 1)); CDATA.PARAMS = _PARAMS[1]; if(CDATA.CMD == "LOGIN") { if (FROM == *(sIRC.GetNick())) { if(ParamsValid(&CDATA, 2)) Handle_Login(&CDATA); else sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"login <Player> <Password> )", true, "ERROR"); } else sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Please Send A PM To Login!", true, "ERROR"); if(GetLevel(USER) >= sIRC.gmlog) dontlog = false; cValid = true; } else if(CDATA.CMD == "LOGOUT") { if (FROM == *(sIRC.GetNick())) Handle_Logout(&CDATA); else sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Please Send A PM To Logout!", true, "ERROR"); cValid = true; } else if(CDATA.CMD == "ACCT") { switch(ParamsValid(&CDATA, 2, sIRC.CACCT)) { case E_OK: Account_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"acct <Player> <(un)lock/mail/pass/rename> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "BAN") { switch(ParamsValid(&CDATA, 2, sIRC.CBAN)) { case E_OK: Ban_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"ban <Player> <acct/ip> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "CHAN") { switch(ParamsValid(&CDATA, 1, sIRC.CCHAN)) { case E_OK: Chan_Control(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"chan <op> <IRC User> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "CHAR") { switch(ParamsValid(&CDATA, 2, sIRC.CCHAR)) { case E_OK: Char_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"char <Player> <mailcheat/taxicheat/maxskill/setskill> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "FUN") { switch(ParamsValid(&CDATA, 2, sIRC.CFUN)) { case E_OK: Fun_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"fun <Player> <Sound/Say> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "HELP") { switch(ParamsValid(&CDATA, 0, sIRC.CHELP)) { case E_OK: Help_IRC(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"help <Command> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "INCHAN") { switch(ParamsValid(&CDATA, 1, sIRC.CINCHAN)) { case E_OK: Inchan_Server(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"inchan <Channel> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "INFO") { switch(ParamsValid(&CDATA, 0, sIRC.CINFO)) { case E_OK: Info_Server(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"info )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "ITEM") { CDATA.PCOUNT = 3; switch(ParamsValid(&CDATA, 2, sIRC.CITEM)) { case E_OK: Item_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"item <Player> <add> <ItemID/[ItemName]> <Amount> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "JAIL") { CDATA.PCOUNT = 3; switch(ParamsValid(&CDATA, 1, sIRC.CJAIL)) { case E_OK: Jail_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"jail <Player> <release/Reason>)", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "KICK") { CDATA.PCOUNT = 2; switch(ParamsValid(&CDATA, 1, sIRC.CKICK)) { case E_OK: Kick_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"kick <Player> <Reason> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "KILL") { CDATA.PCOUNT = 2; switch(ParamsValid(&CDATA, 1, sIRC._KILL)) { case E_OK: Kill_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"kill <Player> <Reason> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "LEVEL") { CDATA.PCOUNT = 2; switch(ParamsValid(&CDATA, 2, sIRC.CLEVEL)) { case E_OK: Level_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"level <Player> <NewLevel> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "LOOKUP") { CDATA.PCOUNT = 2; switch(ParamsValid(&CDATA, 2, sIRC.CLOOKUP)) { case E_OK: Lookup_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"lookup <acct/char/creature/faction/go/item/quest/skill/spell/tele> <ID/Name> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "MONEY") { CDATA.PCOUNT = 2; switch(ParamsValid(&CDATA, 2, sIRC.CMONEY)) { case E_OK: Money_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"money <Player> <(-)Money> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "MUTE") { switch(ParamsValid(&CDATA, 2, sIRC.CMUTE)) { case E_OK: Mute_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"mute <Player> <release/TimeInMins> <Reason> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "ONLINE") { switch(ParamsValid(&CDATA, 0, sIRC.CONLINE)) { case E_OK: Online_Players(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"online )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "PM") { switch(ParamsValid(&CDATA, 2, sIRC.CPM)) { case E_OK: PM_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"pm <Player> <Message> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "RELOAD") { switch(ParamsValid(&CDATA, 0, sIRC.CRESTART)) { case E_OK: sIRC.Send_IRC_Channels("Reloading MangChat Config Options. (Restart recommended)"); sIRC.LoadConfig(); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "RESTART") { switch(ParamsValid(&CDATA, 0, sIRC.CRESTART)) { case E_OK: sIRC.Send_IRC_Channels(sIRC.RstMsg); sIRC.ResetIRC(); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "REVIVE") { CDATA.PCOUNT = 2; switch(ParamsValid(&CDATA, 1, sIRC.CREVIVE)) { case E_OK: Revive_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"revive <Player> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "SAVEALL") { switch(ParamsValid(&CDATA, 0, sIRC.CSAVEALL)) { case E_OK: Saveall_Player(&CDATA); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "SHUTDOWN") { switch(ParamsValid(&CDATA, 1, sIRC.CSHUTDOWN)) { case E_OK: Shutdown_Mangos(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"shutdown <TimeInSeconds/cancel> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "SPELL") { switch(ParamsValid(&CDATA, 2, sIRC.CSPELL)) { case E_OK: Spell_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"spell <Player> <Cast/Learn/UnLearn> <SpellID> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "SYSMSG") { CDATA.PCOUNT = 2; switch(ParamsValid(&CDATA, 2, sIRC.CSYSMSG)) { case E_OK: Sysmsg_Server(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"sysmsg <a/e/n/add/del/list> <Message> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "TELE") { switch(ParamsValid(&CDATA, 2, sIRC.CTELE)) { case E_OK: Tele_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"tele <Player> <l/c/r/to> <Loc.Name/MAPID X Y Z/Recall/Player> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "TOP") { CDATA.PCOUNT = 1; switch(ParamsValid(&CDATA, 1, sIRC.CTOP)) { case E_OK: Top_Player(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"top <accttime/chartime/money> <limit> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } else if(CDATA.CMD == "WHO") { switch(ParamsValid(&CDATA, 0, sIRC.CWHO)) { case E_OK: Who_Logged(&CDATA); break; case E_AUTH: AuthValid = false; break; } cValid = true; } // GM Ticket by bizkut http://github.com/bizkut else if(CDATA.CMD == "TICKET") { CDATA.PCOUNT = 1; switch(ParamsValid(&CDATA, 1, sIRC.CTOP)) { case E_OK: GM_Ticket(&CDATA); break; case E_SIZE: sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Syntax Error! ( "+sIRC._cmd_prefx+"ticket <list/read/respond/delete> <limit/name/all> <message> )", true, "ERROR"); break; case E_AUTH: AuthValid = false; break; } cValid = true; } if(!AuthValid && IsLoggedIn(USER)) sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Access Denied! Your Security Level Is Too Low To Use This Command!", true, "ERROR"); if (cValid == false && (sIRC.BOTMASK & 4)) sIRC.Send_IRC_Channel(USER, "\0034[ERROR] : Unknown Command!", true, "ERROR"); if (cValid && dontlog) sIRC.iLog.WriteLog(" %s : [ %s(%d) ] Used Command: [ %s ] With Parameters: [ %s ]", sIRC.iLog.GetLogDateTimeStr().c_str(), CDATA.USER.c_str(), GetLevel(USER), CDATA.CMD.c_str(), CDATA.PARAMS.c_str()); return cValid; } return false; }
bool Client::Process() { EQApplicationPacket *app = connection->PopPacket(); while(app) { if(server.options.IsTraceOn()) { server_log->Log(log_network, "Application packet recieved from client (size %u)", app->Size()); } if(server.options.IsDumpInPacketsOn()) { DumpPacket(app); } switch(app->GetOpcode()) { case OP_SessionReady: { if(server.options.IsTraceOn()) { server_log->Log(log_network, "Session ready recieved from client."); } Handle_SessionReady((const char*)app->pBuffer, app->Size()); break; } case OP_Login: { if(app->Size() < 20) { server_log->Log(log_network_error, "Login recieved but it is too small, discarding."); break; } if(server.options.IsTraceOn()) { server_log->Log(log_network, "Login recieved from client."); } Handle_Login((const char*)app->pBuffer, app->Size()); break; } case OP_ServerListRequest: { if(server.options.IsTraceOn()) { server_log->Log(log_network, "Server list request recieved from client."); } SendServerListPacket(); break; } case OP_PlayEverquestRequest: { if(app->Size() < sizeof(PlayEverquestRequest_Struct)) { server_log->Log(log_network_error, "Play recieved but it is too small, discarding."); break; } Handle_Play((const char*)app->pBuffer); break; } default: { char dump[64]; app->build_header_dump(dump); server_log->Log(log_network_error, "Recieved unhandled application packet from the client: %s.", dump); } } delete app; app = connection->PopPacket(); } return true; }