Beispiel #1
0
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);
	}
}
Beispiel #2
0
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);
	}
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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();
	}
}