From cdfd473476b065402c09ee84bc06c834d199215f Mon Sep 17 00:00:00 2001 From: Akkadius Date: Wed, 3 Jul 2019 16:01:44 -0500 Subject: [PATCH] Add more logging --- loginserver/client.cpp | 79 ++++++++++++++++++++++++++++------ loginserver/database_mysql.cpp | 52 ++++++++++++---------- loginserver/main.cpp | 19 ++++++-- 3 files changed, 112 insertions(+), 38 deletions(-) diff --git a/loginserver/client.cpp b/loginserver/client.cpp index d526d85d4..5953471ec 100644 --- a/loginserver/client.cpp +++ b/loginserver/client.cpp @@ -180,24 +180,38 @@ void Client::Handle_SessionReady(const char *data, unsigned int size) */ void Client::Handle_Login(const char *data, unsigned int size) { + std::string logging_function_prefix = "[Client::Handle_Login]"; + if (status != cs_waiting_for_login) { - Log(Logs::General, Logs::Error, "Login received after already having logged in."); + LogF( + Logs::General, + Logs::Error, + "{0} Login received after already having logged in", + logging_function_prefix + ); return; } if ((size - 12) % 8 != 0) { - Log(Logs::General, + LogF( + Logs::General, Logs::Error, - "Login received packet of size: %u, this would cause a block corruption, discarding.", - size); + "{0} Login received packet of size: {1}, this would cause a block corruption, discarding.", + logging_function_prefix, + size + ); return; } if (size < sizeof(LoginLoginRequest_Struct)) { - Log(Logs::General, + LogF( + Logs::General, Logs::Error, - "Login received packet of size: %u, this would cause a buffer overflow, discarding.", - size); + "{0} Login received packet of size: %u, this would cause a buffer overflow, discarding.", + logging_function_prefix, + size + ); + return; } @@ -224,7 +238,12 @@ void Client::Handle_Login(const char *data, unsigned int size) std::string user(&outbuffer[0]); if (user.length() >= outbuffer.length()) { - LogF(Logs::General, Logs::Debug, "Corrupt buffer sent to server, preventing buffer overflow."); + LogF( + Logs::General, + Logs::Debug, + "{0} Corrupt buffer sent to server, preventing buffer overflow.", + logging_function_prefix + ); return; } @@ -245,7 +264,7 @@ void Client::Handle_Login(const char *data, unsigned int size) } else { if (server.options.IsPasswordLoginAllowed()) { - cred = (&outbuffer[1 + user.length()]); + cred = (&outbuffer[1 + user.length()]); auto components = SplitString(user, '.'); if (components.size() == 2) { db_loginserver = components[0]; @@ -255,7 +274,8 @@ void Client::Handle_Login(const char *data, unsigned int size) LogF( Logs::General, Logs::Login_Server, - "Attempting password based login [{0}] login [{1}] user [{2}]", + "{0} Attempting password based login [{1}] login [{2}] user [{3}]", + logging_function_prefix, user, db_loginserver, user @@ -265,10 +285,19 @@ void Client::Handle_Login(const char *data, unsigned int size) if (server.db->GetLoginDataFromAccountInfo(user, db_loginserver, db_account_password_hash, db_account_id)) { result = VerifyLoginHash(user, db_loginserver, cred, db_account_password_hash); + + LogF( + Logs::Detail, + Logs::Login_Server, + "{0} [VerifyLoginHash] Success [{1}]", + logging_function_prefix, + (result ? "true" : "false") + ); } else { status = cs_creating_account; AttemptLoginAccountCreation(user, cred, db_loginserver); + return; } } @@ -278,9 +307,25 @@ void Client::Handle_Login(const char *data, unsigned int size) * Login accepted */ if (result) { + LogF( + Logs::Detail, Logs::Login_Server, "{0} [{1}] login [{2}] user [{3}] Login succeeded", + logging_function_prefix, + user, + db_loginserver, + user + ); + DoSuccessfulLogin(user, db_account_id, db_loginserver); } else { + LogF( + Logs::Detail, Logs::Login_Server, "{0} [{1}] login [{2}] user [{3}] Login failed", + logging_function_prefix, + user, + db_loginserver, + user + ); + DoFailedLogin(); } } @@ -358,6 +403,11 @@ void Client::GenerateKey() } } +/** + * @param user + * @param pass + * @param loginserver + */ void Client::AttemptLoginAccountCreation( const std::string &user, const std::string &pass, @@ -403,7 +453,8 @@ void Client::AttemptLoginAccountCreation( &Client::LoginOnNewConnection, this, std::placeholders::_1 - )); + ) + ); login_connection_manager->OnConnectionStateChange( std::bind( &Client::LoginOnStatusChange, @@ -411,14 +462,16 @@ void Client::AttemptLoginAccountCreation( std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 - )); + ) + ); login_connection_manager->OnPacketRecv( std::bind( &Client::LoginOnPacketRecv, this, std::placeholders::_1, std::placeholders::_2 - )); + ) + ); login_connection_manager->Connect(addr, port); } diff --git a/loginserver/database_mysql.cpp b/loginserver/database_mysql.cpp index 445f048ec..d42f46d9c 100644 --- a/loginserver/database_mysql.cpp +++ b/loginserver/database_mysql.cpp @@ -121,37 +121,45 @@ bool DatabaseMySQL::GetLoginDataFromAccountInfo( unsigned int &id ) { - if (!database) { + auto query = fmt::format( + "SELECT LoginServerID, AccountPassword FROM {0} WHERE AccountName = '{1}' AND AccountLoginserver = '{2}' LIMIT 1", + server.options.GetAccountTable(), + EscapeString(name), + EscapeString(loginserver) + ); + + auto results = QueryDatabase(query); + + if (results.RowCount() != 1) { + LogF( + Logs::Detail, + Logs::Login_Server, + "Database::GetLoginDataFromAccountInfo could not find account for name [{0}] login [{1}]", + name, + loginserver + ); + return false; } - MYSQL_RES *res; - MYSQL_ROW row; - std::stringstream query(std::stringstream::in | std::stringstream::out); query << "SELECT LoginServerID, AccountPassword FROM " << server.options.GetAccountTable() - << " WHERE AccountName = '"; - query << EscapeString(name); - query << "' AND AccountLoginserver='"; - query << EscapeString(loginserver); - query << "'"; - - if (mysql_query(database, query.str().c_str()) != 0) { - LogF(Logs::General, Logs::Error, "Mysql query failed: {0}", query.str()); + if (!results.Success()) { return false; } - res = mysql_use_result(database); + auto row = results.begin(); - if (res) { - while ((row = mysql_fetch_row(res)) != nullptr) { - id = atoi(row[0]); - password = row[1]; - mysql_free_result(res); - return true; - } - } + id = atoi(row[0]); + password = row[1]; + + LogF( + Logs::Detail, + Logs::Login_Server, + "Database::GetLoginDataFromAccountInfo found account for name [{0}] login [{1}]", + name, + loginserver + ); - Log(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str()); return false; } diff --git a/loginserver/main.cpp b/loginserver/main.cpp index 391ec48d4..04d61d702 100644 --- a/loginserver/main.cpp +++ b/loginserver/main.cpp @@ -48,11 +48,15 @@ int main() LogSys.LoadLogSettingsDefaults(); LogSys.log_settings[Logs::Error].log_to_console = Logs::General; - LogSys.log_settings[Logs::Error].is_category_enabled = Logs::General; - LogSys.log_settings[Logs::MySQLError].is_category_enabled = Logs::General; + LogSys.log_settings[Logs::Error].is_category_enabled = 1; LogSys.log_settings[Logs::MySQLError].log_to_console = Logs::General; - LogSys.log_settings[Logs::Netcode].is_category_enabled = Logs::General; + LogSys.log_settings[Logs::MySQLError].is_category_enabled = 1; + LogSys.log_settings[Logs::MySQLQuery].log_to_console = Logs::General; + LogSys.log_settings[Logs::MySQLQuery].is_category_enabled = 1; LogSys.log_settings[Logs::Netcode].log_to_console = Logs::General; + LogSys.log_settings[Logs::Netcode].is_category_enabled = Logs::General; + + LogSys.log_settings[Logs::Login_Server].log_to_console = Logs::Detail; Log(Logs::General, Logs::Login_Server, "Logging System Init."); @@ -182,6 +186,15 @@ int main() #endif Log(Logs::General, Logs::Login_Server, "Server Started."); + + if (LogSys.log_settings[Logs::Login_Server].log_to_console == 1) { + Log( + Logs::General, + Logs::Login_Server, + "Loginserver logging set to level [1] for more debugging, enable detail [3]" + ); + } + while (run_server) { Timer::SetCurrentTime(); server.client_manager->Process();