diff --git a/loginserver/database.cpp b/loginserver/database.cpp index debbe37df..09d0431f3 100644 --- a/loginserver/database.cpp +++ b/loginserver/database.cpp @@ -449,7 +449,8 @@ bool Database::CreateWorldRegistration( std::string server_long_name, std::string server_short_name, std::string server_remote_ip, - unsigned int &id + unsigned int &id, + unsigned int &server_admin_id ) { auto results = QueryDatabase("SELECT IFNULL(max(id), 0) + 1 FROM login_world_servers"); @@ -462,11 +463,12 @@ bool Database::CreateWorldRegistration( id = std::stoi(row[0]); auto insert_query = fmt::format( "INSERT INTO login_world_servers SET id = {0}, long_name = '{1}', short_name = '{2}', last_ip_address = '{3}', \n" - "login_server_list_type_id = 3, login_server_admin_id = 0, is_server_trusted = 0, tag_description = ''", + "login_server_list_type_id = 3, login_server_admin_id = {4}, is_server_trusted = 0, tag_description = ''", id, server_long_name, server_short_name, - server_remote_ip + server_remote_ip, + server_admin_id ); auto insert_results = QueryDatabase(insert_query); @@ -655,7 +657,7 @@ bool Database::DoesLoginserverWorldAdminAccountExist( ) { auto query = fmt::format( - "SELECT account_name FROM login_server_admins WHERE account_name = '{0}'", + "SELECT account_name FROM login_server_admins WHERE account_name = '{0}' LIMIT 1", EscapeString(account_name) ); @@ -663,3 +665,34 @@ bool Database::DoesLoginserverWorldAdminAccountExist( return (results.RowCount() == 1); } + +/** + * @param account_name + * @return + */ +Database::DbLoginServerAdmin Database::GetLoginServerAdmin(const std::string &account_name) +{ + auto query = fmt::format( + "SELECT id, account_name, account_password, first_name, last_name, email, registration_date, registration_ip_address" + " FROM login_server_admins WHERE account_name = '{0}' LIMIT 1", + EscapeString(account_name) + ); + + auto results = QueryDatabase(query); + + Database::DbLoginServerAdmin login_server_admin{}; + if (results.RowCount() == 1) { + auto row = results.begin(); + login_server_admin.loaded = true; + login_server_admin.id = std::stoi(row[0]); + login_server_admin.account_name = row[1]; + login_server_admin.account_password = row[2]; + login_server_admin.first_name = row[3]; + login_server_admin.last_name = row[4]; + login_server_admin.email = row[5]; + login_server_admin.registration_date = row[7]; + login_server_admin.registration_ip_address = row[8]; + } + + return login_server_admin; +} diff --git a/loginserver/database.h b/loginserver/database.h index fb48c91a2..d9cafca4a 100644 --- a/loginserver/database.h +++ b/loginserver/database.h @@ -195,7 +195,8 @@ public: std::string server_long_name, std::string server_short_name, std::string server_remote_ip, - unsigned int &id + unsigned int &id, + unsigned int &server_admin_id ); /** @@ -235,6 +236,20 @@ public: */ bool DoesLoginserverWorldAdminAccountExist(const std::string &account_name); + struct DbLoginServerAdmin { + bool loaded = false; + uint32 id; + std::string account_name; + std::string account_password; + std::string first_name; + std::string last_name; + std::string email; + std::string registration_date; + std::string registration_ip_address; + }; + + Database::DbLoginServerAdmin GetLoginServerAdmin(const std::string &account_name); + protected: std::string user, pass, host, port, name; MYSQL *database{}; diff --git a/loginserver/loginserver_command_handler.cpp b/loginserver/loginserver_command_handler.cpp index 1c77eeec5..52b1928fc 100644 --- a/loginserver/loginserver_command_handler.cpp +++ b/loginserver/loginserver_command_handler.cpp @@ -192,7 +192,7 @@ namespace LoginserverCommandHandler { cmd("--password").str().empty() || cmd("--email").str().empty()) { - LogInfo("Command Example: create-loginserver-account --username=user --password=password"); + LogInfo("Command Example: create-loginserver-world-admin-account --username=* --password=* --email=*"); exit(1); } diff --git a/loginserver/world_server.cpp b/loginserver/world_server.cpp index 3b267cd7c..de5477a02 100644 --- a/loginserver/world_server.cpp +++ b/loginserver/world_server.cpp @@ -875,6 +875,23 @@ bool WorldServer::HandleNewLoginserverInfoUnregisteredAllowed( return true; } + Database::DbLoginServerAdmin login_server_admin = + server.db->GetLoginServerAdmin(GetAccountName()); + + uint32 server_admin_id = 0; + + if (login_server_admin.loaded) { + auto mode = server.options.GetEncryptionMode(); + if (eqcrypt_verify_hash( + GetAccountName(), + GetAccountPassword(), + login_server_admin.account_password, + mode + )) { + server_admin_id = login_server_admin.id; + } + } + /** * Auto create a registration */ @@ -882,7 +899,8 @@ bool WorldServer::HandleNewLoginserverInfoUnregisteredAllowed( GetServerLongName(), GetServerShortName(), GetRemoteIp(), - server_id + server_id, + server_admin_id )) { return false; }