tightening things up as i consider the best way to nuke non correlated

people from orbit
This commit is contained in:
DarthArgus
2016-10-04 17:22:58 -05:00
parent 2d76f8ec0e
commit 8cf8c37c2a
3 changed files with 48 additions and 39 deletions
@@ -59,23 +59,23 @@ ClientConnection::~ClientConnection()
void ClientConnection::onConnectionClosed()
{
// client has disconnected
if (m_clientId)
if (m_stationId)
{
if (m_stationId)
{
DEBUG_REPORT_LOG(true, ("Client %lu disconnected\n", m_stationId));
LOG("LoginClientConnection",
("onConnectionClosed() for stationId (%lu) at IP (%s)", m_stationId, getRemoteAddress().c_str()));
}
LoginServer::getInstance().removeClient(m_clientId);
DEBUG_REPORT_LOG(true, ("Client %lu disconnected\n", m_stationId));
LOG("LoginClientConnection", ("onConnectionClosed() for stationId (%lu) at IP (%s)", m_stationId, getRemoteAddress().c_str()));
}
if (!m_isValidated) {
LoginServer::getInstance().removeClient(m_clientId);
if ((ConfigLoginServer::getValidateStationKey() || ConfigLoginServer::getDoSessionLogin()) && !m_isValidated)
{
SessionApiClient *session = LoginServer::getInstance().getSessionApiClient();
if (session)
{
session->dropClient(this);
}
}
}
//-----------------------------------------------------------------------
@@ -194,7 +194,7 @@ void ClientConnection::validateClient(const std::string & id, const std::string
if (!authURL.empty())
{
// create the object
webAPI api(authURL);
webAPI api(authURL); // TODO: is loginserver single threaded? if so then let's make this static, and clear/reset it each run
// add our data
api.addJsonData<std::string>("user_name", id);
@@ -239,7 +239,8 @@ void ClientConnection::validateClient(const std::string & id, const std::string
{
if (suid == 0)
{
if (uname.length() > MAX_ACCOUNT_NAME_LENGTH) {
if (uname.length() > MAX_ACCOUNT_NAME_LENGTH)
{
uname.resize(MAX_ACCOUNT_NAME_LENGTH);
}
@@ -288,6 +289,8 @@ void ClientConnection::onCharacterDeletedFromCluster(const NetworkId & character
if(f != m_charactersPendingDeletion.end())
{
m_charactersPendingDeletion.erase(f);
// TODO: send api request and decrement # characters on this account/subaccount
}
DeleteCharacterReplyMessage reply(DeleteCharacterReplyMessage::rc_OK);
@@ -94,7 +94,7 @@ void ConfigLoginServer::install(void)
KEY_BOOL (developmentMode, true);
KEY_INT (databaseThreads, 1);
KEY_BOOL (compressClientNetworkTraffic, true);
KEY_INT (metricsListenerPort, 2201);
KEY_INT (metricsListenerPort, 0); // defaults to 2201 but we don't use it
KEY_FLOAT (defaultDBQueueUpdateTimeLimit, 0.25f);
KEY_INT (disconnectSleepTime, 30000);
KEY_INT (clusterGroup,1);
@@ -160,7 +160,6 @@ LoginServer::LoginServer() :
if (ConfigLoginServer::getDevelopmentMode())
{
setup.port = ConfigLoginServer::getCentralServicePort();
//setup.maxConnections = 1000;
m_centralService = new Service(ConnectionAllocator<CentralServerConnection>(), setup);
}
@@ -219,6 +218,7 @@ int LoginServer::addClient(ClientConnection & client)
{
DEBUG_FATAL(client.getIsValidated(), ("Tried to add an already validated client?!"));
//Perhaps add a debug only check to make sure a client connection isn't in twice...I'm not sure how that could happen.
static int nextClientId = 0;
int tmp = ++nextClientId;
m_clientMap[tmp] = &client;
@@ -250,7 +250,7 @@ ClientConnection* LoginServer::getUnvalidatedClient(int clientId)
void LoginServer::removeClient(int clientId)
{
if (clientId) // yeah why bother if it's 0 or null? i realize 0 is a valid int but since previously the warning below fired if it was 0....yeah, no
if (clientId) // yeah why bother if it's null?
{
std::map<int, ClientConnection*>::iterator i = m_clientMap.find(clientId);
if (i != m_clientMap.end())
@@ -264,7 +264,7 @@ void LoginServer::removeClient(int clientId)
}
else
{
WARNING_STRICT_FATAL(true, ("Tried to remove a client with client id == 0"));
DEBUG_WARNING(true, ("Tried to remove a client with client id == 0 (possibly DoS attack?)"));
}
}
@@ -903,6 +903,7 @@ void LoginServer::receiveMessage(const MessageDispatch::Emitter & source, const
if (conn)
{
// current restriction is that once per account event or item cannot require a "consuming" account feature id
// TODO: looks like this is where vet rewards are consumed...the one per account thing, here - session auth may be enough?
uint32 const requiredAccountFeatureId = msg->getAccountFeatureId();
bool const consumeAccountFeatureId = msg->getConsumeAccountFeatureId();
if ((msg->getConsumeEvent() || msg->getConsumeItem()) && (requiredAccountFeatureId > 0) && consumeAccountFeatureId)
@@ -1172,21 +1173,25 @@ void LoginServer::run(void)
unsigned long totalTime = 0;
// load authentication data and bind the monitor to the port
CMonitorAPI * mon = new CMonitorAPI("metricsAuthentication.cfg", ConfigLoginServer::getMetricsListenerPort());
getInstance().m_soeMonitor = mon;
const char *masterChannel = "Population";
mon->add(masterChannel, WORLD_COUNT_CHANNEL);
std::string host = NetworkHandler::getHostName().c_str();
size_t dotPos = host.find(".");
if (dotPos != host.npos)
{
host = host.substr(0, dotPos - 1);
}
char tmpBuf[1024];
IGNORE_RETURN(snprintf(tmpBuf, sizeof(tmpBuf), "LoginServer version %s on %s", ApplicationVersion::getInternalVersion(), host.c_str()));
mon->setDescription(WORLD_COUNT_CHANNEL, tmpBuf);
const int port = ConfigLoginServer::getMetricsListenerPort();
mon->add("Galaxies", CLUSTER_COUNT_CHANNEL);
if (port) {
CMonitorAPI *mon = new CMonitorAPI("metricsAuthentication.cfg", ConfigLoginServer::getMetricsListenerPort());
getInstance().m_soeMonitor = mon;
const char *masterChannel = "Population";
mon->add(masterChannel, WORLD_COUNT_CHANNEL);
std::string host = NetworkHandler::getHostName().c_str();
size_t dotPos = host.find(".");
if (dotPos != host.npos) {
host = host.substr(0, dotPos - 1);
}
char tmpBuf[1024];
IGNORE_RETURN(snprintf(tmpBuf, sizeof(tmpBuf), "LoginServer version %s on %s", ApplicationVersion::getInternalVersion(), host
.c_str()));
mon->setDescription(WORLD_COUNT_CHANNEL, tmpBuf);
mon->add("Galaxies", CLUSTER_COUNT_CHANNEL);
}
while (!getInstance().done)
{
@@ -1224,16 +1229,17 @@ void LoginServer::run(void)
NetworkHandler::clearBytesThisFrame();
mon->set(WORLD_COUNT_CHANNEL, static_cast<int>(getInstance().m_clientMap.size()));
int count = 0;
ClusterListType::const_iterator i;
for (i = getInstance().m_clusterList.begin(); i != getInstance().m_clusterList.end(); ++i)
{
if ((*i)->m_connected)
++count;
if (port) {
mon->set(WORLD_COUNT_CHANNEL, static_cast<int>(getInstance().m_clientMap.size()));
int count = 0;
ClusterListType::const_iterator i;
for (i = getInstance().m_clusterList.begin(); i != getInstance().m_clusterList.end(); ++i) {
if ((*i)->m_connected)
++count;
}
mon->set(CLUSTER_COUNT_CHANNEL, count);
mon->Update();
}
mon->set(CLUSTER_COUNT_CHANNEL, count);
mon->Update();
}
NetworkHandler::update();