void ErrorLog::TracePacket(const char *packetlog, size_t size, ...) { std::string trace = db.LoadServerSettings("options", "trace").c_str(); std::transform(trace.begin(), trace.end(), trace.begin(), ::toupper); if (trace == "TRUE") { LogPacket(log_network_trace, packetlog, size); } }
void ErrorLog::Trace(const char *message, ...) { std::string trace = db.LoadServerSettings("options", "trace").c_str(); std::transform(trace.begin(), trace.end(), trace.begin(), ::toupper); if (trace == "TRUE") { Log(log_network_trace, message); } }
bool ErrorLog::DumpOut() { std::string dumpout = db.LoadServerSettings("options", "dump_packets_in").c_str(); std::transform(dumpout.begin(), dumpout.end(), dumpout.begin(), ::toupper); if (dumpout == "TRUE") { return true; } return false; }
void WorldServer::SendClientAuth(unsigned int ip, string account, string key, unsigned int account_id, uint8 version) { ServerPacket *outapp = new ServerPacket(ServerOP_LSClientAuth, sizeof(ServerLSClientAuth)); ServerLSClientAuth* slsca = (ServerLSClientAuth*)outapp->pBuffer; slsca->lsaccount_id = account_id; strncpy(slsca->name, account.c_str(), account.size() > 30 ? 30 : account.size()); strncpy(slsca->key, key.c_str(), 10); slsca->lsadmin = 0; slsca->worldadmin = 0; slsca->ip = ip; slsca->version = version; in_addr in; in.s_addr = ip;connection->GetrIP(); string client_address(inet_ntoa(in)); in.s_addr = connection->GetrIP(); string world_address(inet_ntoa(in)); if(client_address.compare(world_address) == 0) { slsca->local = 1; } else if (client_address.find(db.LoadServerSettings("options", "local_network").c_str()) != string::npos) { slsca->local = 1; } else { slsca->local = 0; } connection->SendPacket(outapp); if (server_log->DumpIn()) { DumpPacket(outapp); } delete outapp; }
std::string Saltme::Salt(std::string password) { std::string salt; std::string presalt; // for database value of salt. #ifdef DBSALT if (db.CheckExtraSettings("salt")) { presalt += db.LoadServerSettings("options", "salt").c_str(); } #endif // for ini based salt. #ifdef INISALT bool saltini = std::ifstream("salt.ini").good(); bool loginini = std::ifstream("login.ini").good(); std::string loadINIvalue = "12345678"; if (!saltini) { if (loginini) { loadINIvalue = cfg.LoadOption("options", "salt", "login.ini"); } std::ofstream dbini("salt.ini"); dbini << "[Salt]\n"; dbini << "salt = " + loadINIvalue + "\n"; dbini.close(); } if (saltini) { presalt += cfg.LoadOption("Salt", "salt", "salt.ini"); } #endif // if you want to hard code a salt in code. #ifdef HARDSALT presalt += "12345678"; #endif salt = password + presalt; return salt; }
void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i) { if(logged_in) { server_log->Log(log_network_error, "WorldServer::Handle_NewLSInfo called but the login server was already marked as logged in, aborting."); return; } if(strlen(i->account) <= 30) { account_name = i->account; } else { server_log->Log(log_network_error, "Handle_NewLSInfo error, account name was too long."); return; } if(strlen(i->password) <= 30) { account_password = i->password; } else { server_log->Log(log_network_error, "Handle_NewLSInfo error, account password was too long."); return; } if(strlen(i->name) <= 200) { long_name = i->name; } else { server_log->Log(log_network_error, "Handle_NewLSInfo error, long name was too long."); return; } if(strlen(i->shortname) <= 50) { short_name = i->shortname; } else { server_log->Log(log_network_error, "Handle_NewLSInfo error, short name was too long."); return; } if(strlen(i->local_address) <= 125) { if(strlen(i->local_address) == 0) { server_log->Log(log_network_error, "Handle_NewLSInfo error, local address was null, defaulting to localhost"); local_ip = "127.0.0.1"; } else { local_ip = i->local_address; } } else { server_log->Log(log_network_error, "Handle_NewLSInfo error, local address was too long."); return; } if(strlen(i->remote_address) <= 125) { if(strlen(i->remote_address) == 0) { in_addr in; in.s_addr = GetConnection()->GetrIP(); remote_ip = inet_ntoa(in); server_log->Log(log_network_error, "Handle_NewLSInfo error, remote address was null, defaulting to stream address %s.", remote_ip.c_str()); } else { remote_ip = i->remote_address; } } else { in_addr in; in.s_addr = GetConnection()->GetrIP(); remote_ip = inet_ntoa(in); server_log->Log(log_network_error, "Handle_NewLSInfo error, remote address was too long, defaulting to stream address %s.", remote_ip.c_str()); } if(strlen(i->serverversion) <= 64) { version = i->serverversion; } else { server_log->Log(log_network_error, "Handle_NewLSInfo error, server version was too long."); return; } if(strlen(i->protocolversion) <= 25) { protocol = i->protocolversion; } else { server_log->Log(log_network_error, "Handle_NewLSInfo error, protocol version was too long."); return; } server_type = i->servertype; logged_in = true; if (db.LoadServerSettings("options", "reject_duplicate_servers") == "TRUE") { if(server.SM->ServerExists(long_name, short_name, this)) { server_log->Log(log_world_error, "World tried to login but there already exists a server that has that name."); return; } } else { if(server.SM->ServerExists(long_name, short_name, this)) { server_log->Log(log_world_error, "World tried to login but there already exists a server that has that name."); server.SM->DestroyServerByName(long_name, short_name, this); } } if (db.LoadServerSettings("options", "unregistered_allowed") == "FALSE") { if(account_name.size() > 0 && account_password.size() > 0) { unsigned int s_id = 0; unsigned int s_list_type = 0; unsigned int s_trusted = 0; string s_desc; string s_list_desc; string s_acct_name; string s_acct_pass; if(db.GetWorldRegistration(s_id, s_desc, s_trusted, s_list_type, s_acct_name, s_acct_pass, long_name, short_name)) { if(s_acct_name.size() == 0 || s_acct_pass.size() == 0) { server_log->Log(log_world, "Server %s(%s) successfully logged into account that had no user/password requirement.", long_name.c_str(), short_name.c_str()); authorized = true; SetRuntimeID(s_id); server_list_type = s_list_type; desc = s_desc; } else if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0) { server_log->Log(log_world, "Server %s(%s) successfully logged in.", long_name.c_str(), short_name.c_str()); authorized = true; SetRuntimeID(s_id); server_list_type = s_list_type; desc = s_desc; if(s_trusted) { server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate sent to world"); trusted = true; ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0); connection->SendPacket(outapp); } } else { server_log->Log(log_world, "Server %s(%s) attempted to log in but account and password did not match the entry in the database, and only" " registered servers are allowed.", long_name.c_str(), short_name.c_str()); return; } } else { server_log->Log(log_world, "Server %s(%s) attempted to log in but database couldn't find an entry and only registered servers are allowed.", long_name.c_str(), short_name.c_str()); return; } } else { server_log->Log(log_world, "Server %s(%s) did not attempt to log in but only registered servers are allowed.", long_name.c_str(), short_name.c_str()); return; } } else { unsigned int s_id = 0; unsigned int s_list_type = 0; unsigned int s_trusted = 0; string s_desc; string s_list_desc; string s_acct_name; string s_acct_pass; if (db.GetWorldRegistration(s_id, s_desc, s_trusted, s_list_type, s_acct_name, s_acct_pass, long_name, short_name)) { if(account_name.size() > 0 && account_password.size() > 0) { if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0) { server_log->Log(log_world, "Server %s(%s) successfully logged in.", long_name.c_str(), short_name.c_str()); authorized = true; SetRuntimeID(s_id); server_list_type = s_list_type; desc = s_desc; if(s_trusted) { server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate sent to world"); trusted = true; ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0); connection->SendPacket(outapp); } } else { // this is the first of two cases where we should deny access even if unregistered is allowed server_log->Log(log_world, "Server %s(%s) attempted to log in but account and password did not match the entry in the database.", long_name.c_str(), short_name.c_str()); } } else { if(s_acct_name.size() > 0 || s_acct_pass.size() > 0) { // this is the second of two cases where we should deny access even if unregistered is allowed server_log->Log(log_world, "Server %s(%s) did not attempt to log in but this server requires a password.", long_name.c_str(), short_name.c_str()); } else { server_log->Log(log_world, "Server %s(%s) did not attempt to log in but unregistered servers are allowed.", long_name.c_str(), short_name.c_str()); authorized = true; SetRuntimeID(s_id); server_list_type = 0; } } } else { s_id = 0; server_log->Log(log_world, "Server %s(%s) attempted to log in but database couldn't find an entry but unregistered servers are allowed.", long_name.c_str(), short_name.c_str()); if(db.CreateWorldRegistration(long_name, short_name, s_id)) { authorized = true; SetRuntimeID(s_id); server_list_type = 0; } } } in_addr in; in.s_addr = connection->GetrIP(); db.UpdateWorldRegistration(GetRuntimeID(), long_name, string(inet_ntoa(in))); if(authorized) { server.CM->UpdateServerList(); } }