diff --git a/loginserver/account_management.cpp b/loginserver/account_management.cpp index d5a2fabdb..8100ff467 100644 --- a/loginserver/account_management.cpp +++ b/loginserver/account_management.cpp @@ -70,3 +70,59 @@ bool AccountManagement::CreateLocalLoginServerAccount( return false; } + +/** + * @param username + * @param password + * @param email + * @return + */ +bool AccountManagement::CreateLoginserverWorldAdminAccount( + const std::string &username, + const std::string &password, + const std::string &email, + const std::string &first_name, + const std::string &last_name, + const std::string &ip_address +) +{ + auto mode = server.options.GetEncryptionMode(); + auto hash = eqcrypt_hash(username, password, mode); + + LogInfo( + "Attempting to create world admin account | username [{0}] encryption algorithm [{1}] ({2})", + username, + GetEncryptionByModeId(mode), + mode + ); + + if (server.db->DoesLoginserverWorldAdminAccountExist(username)) { + LogInfo( + "Attempting to create world admin account for user [{0}] but already exists!", + username + ); + + return false; + } + + if (server.db->CreateLoginserverWorldAdminAccount( + username, + hash, + first_name, + last_name, + email, + ip_address + )) { + LogInfo( + "Account creation success for user [{0}] encryption algorithm [{1}] ({2})", + username, + GetEncryptionByModeId(mode), + mode + ); + return true; + } + + LogError("Failed to create world admin account account for user [{0}]!", username); + + return false; +} diff --git a/loginserver/account_management.h b/loginserver/account_management.h index 907aaf509..360ecb4b0 100644 --- a/loginserver/account_management.h +++ b/loginserver/account_management.h @@ -24,7 +24,28 @@ class AccountManagement { public: + + /** + * @param username + * @param password + * @return + */ static bool CreateLocalLoginServerAccount(std::string username, std::string password); + + /** + * @param username + * @param password + * @param email + * @return + */ + static bool CreateLoginserverWorldAdminAccount( + const std::string &username, + const std::string &password, + const std::string &email, + const std::string &first_name = "", + const std::string &last_name = "", + const std::string &ip_address = "" + ); }; diff --git a/loginserver/database.cpp b/loginserver/database.cpp index 06cfbeb31..debbe37df 100644 --- a/loginserver/database.cpp +++ b/loginserver/database.cpp @@ -57,7 +57,7 @@ Database::Database( user.c_str(), pass.c_str(), name.c_str(), - atoi(port.c_str()), + std::stoi(port), &errnum, errbuf ) @@ -66,7 +66,7 @@ Database::Database( exit(1); } else { - Log(Logs::General, Logs::Status, "Using database '%s' at %s:%d", database, host, port); + LogStatus("Using database [{0}] at [{1}:{2}]", name, host, port); } } @@ -477,6 +477,7 @@ bool Database::CreateWorldRegistration( server_short_name ); + return false; } @@ -608,4 +609,57 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings *log_settings) } delete[] categories_in_database; -} \ No newline at end of file +} + +/** + * @param account_name + * @param account_password + * @param first_name + * @param last_name + * @param email + * @param ip_address + * @return + */ +bool Database::CreateLoginserverWorldAdminAccount( + const std::string &account_name, + const std::string &account_password, + const std::string &first_name, + const std::string &last_name, + const std::string &email, + const std::string &ip_address +) +{ + auto query = fmt::format( + "INSERT INTO login_server_admins (account_name, account_password, first_name, last_name, email, registration_date, " + "registration_ip_address) " + "VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', NOW(), '{5}')", + EscapeString(account_name), + EscapeString(account_password), + EscapeString(first_name), + EscapeString(last_name), + EscapeString(email), + ip_address + ); + + auto results = QueryDatabase(query); + + return results.Success(); +} + +/** + * @param account_name + * @return + */ +bool Database::DoesLoginserverWorldAdminAccountExist( + const std::string &account_name +) +{ + auto query = fmt::format( + "SELECT account_name FROM login_server_admins WHERE account_name = '{0}'", + EscapeString(account_name) + ); + + auto results = QueryDatabase(query); + + return (results.RowCount() == 1); +} diff --git a/loginserver/database.h b/loginserver/database.h index cda677bb0..fb48c91a2 100644 --- a/loginserver/database.h +++ b/loginserver/database.h @@ -159,9 +159,9 @@ public: * @return */ Database::DbWorldRegistration GetWorldRegistration( - const std::string& short_name, - const std::string& remote_ip, - const std::string& local_ip + const std::string &short_name, + const std::string &remote_ip, + const std::string &local_ip ); /** @@ -211,9 +211,33 @@ public: std::string CreateLoginserverApiToken(bool write_mode, bool read_mode); MySQLRequestResult GetLoginserverApiTokens(); + /** + * @param account_name + * @param account_password + * @param first_name + * @param last_name + * @param email + * @param ip_address + * @return + */ + bool CreateLoginserverWorldAdminAccount( + const std::string &account_name, + const std::string &account_password, + const std::string &first_name, + const std::string &last_name, + const std::string &email, + const std::string &ip_address + ); + + /** + * @param account_name + * @return + */ + bool DoesLoginserverWorldAdminAccountExist(const std::string &account_name); + protected: std::string user, pass, host, port, name; - MYSQL *database; + MYSQL *database{}; }; #endif diff --git a/loginserver/login_util/login_schema.sql b/loginserver/login_util/login_schema.sql index d38b5358c..b07362830 100644 --- a/loginserver/login_util/login_schema.sql +++ b/loginserver/login_util/login_schema.sql @@ -17,7 +17,7 @@ DROP TABLE IF EXISTS `login_server_admins`; CREATE TABLE `login_server_admins` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `account_name` varchar(30) NOT NULL, - `account_password` varchar(100) NOT NULL, + `account_password` varchar(255) NOT NULL, `first_name` varchar(50) NOT NULL, `last_name` varchar(50) NOT NULL, `email` varchar(100) NOT NULL, diff --git a/loginserver/loginserver_command_handler.cpp b/loginserver/loginserver_command_handler.cpp index cebf23746..1c77eeec5 100644 --- a/loginserver/loginserver_command_handler.cpp +++ b/loginserver/loginserver_command_handler.cpp @@ -64,19 +64,29 @@ namespace LoginserverCommandHandler { argh::parser cmd; cmd.parse(argc, argv, argh::parser::PREFER_PARAM_FOR_UNREG_OPTION); - LoginserverCommandHandler::DisplayDebug(cmd); /** * Declare command mapping */ std::map function_map; - function_map["create-loginserver-api-token"] = &LoginserverCommandHandler::CreateLoginserverApiToken; - function_map["list-loginserver-api-tokens"] = &LoginserverCommandHandler::ListLoginserverApiTokens; - function_map["create-loginserver-account"] = &LoginserverCommandHandler::CreateLocalLoginserverAccount; - std::map::const_iterator it = function_map.begin(); - std::map::const_iterator end = function_map.end(); + function_map["create-loginserver-api-token"] = &LoginserverCommandHandler::CreateLoginserverApiToken; + function_map["list-loginserver-api-tokens"] = &LoginserverCommandHandler::ListLoginserverApiTokens; + function_map["create-loginserver-account"] = &LoginserverCommandHandler::CreateLocalLoginserverAccount; + function_map["create-loginserver-world-admin-account"] = &LoginserverCommandHandler::CreateLoginserverWorldAdminAccount; + + std::map::const_iterator it = function_map.begin(); + + std::map::const_iterator end = function_map.end(); bool ran_command = false; while (it != end) { @@ -103,9 +113,12 @@ namespace LoginserverCommandHandler { std::cout << "> create-loginserver-api-token --write --read" << std::endl; std::cout << "> list-loginserver-api-tokens" << std::endl; std::cout << std::endl; - std::cout << "# Accounts" << std::endl; + std::cout << "# User Accounts" << std::endl; std::cout << "> create-loginserver-account --username=* --password=*" << std::endl; std::cout << std::endl; + std::cout << "# World Accounts" << std::endl; + std::cout << "> create-loginserver-world-admin-account --username=* --password=* --email=*" << std::endl; + std::cout << std::endl; std::cout << std::endl; } @@ -159,7 +172,7 @@ namespace LoginserverCommandHandler { */ void CreateLocalLoginserverAccount(int argc, char **argv, argh::parser &cmd) { - if (cmd("--username").str().empty() || cmd("--username").str().empty()) { + if (cmd("--username").str().empty() || cmd("--password").str().empty()) { LogInfo("Command Example: create-loginserver-account --username=user --password=password"); exit(1); } @@ -167,4 +180,27 @@ namespace LoginserverCommandHandler { AccountManagement::CreateLocalLoginServerAccount(cmd("--username").str(), cmd("--password").str()); } + /** + * @param argc + * @param argv + * @param cmd + */ + void CreateLoginserverWorldAdminAccount(int argc, char **argv, argh::parser &cmd) + { + if ( + cmd("--username").str().empty() || + cmd("--password").str().empty() || + cmd("--email").str().empty()) { + + LogInfo("Command Example: create-loginserver-account --username=user --password=password"); + exit(1); + } + + AccountManagement::CreateLoginserverWorldAdminAccount( + cmd("--username").str(), + cmd("--password").str(), + cmd("--email").str() + ); + } + } diff --git a/loginserver/loginserver_command_handler.h b/loginserver/loginserver_command_handler.h index 25c9e050b..e37432807 100644 --- a/loginserver/loginserver_command_handler.h +++ b/loginserver/loginserver_command_handler.h @@ -29,6 +29,7 @@ namespace LoginserverCommandHandler { void CreateLoginserverApiToken(int argc, char **argv, argh::parser &cmd); void ListLoginserverApiTokens(int argc, char **argv, argh::parser &cmd); void CreateLocalLoginserverAccount(int argc, char **argv, argh::parser &cmd); + void CreateLoginserverWorldAdminAccount(int argc, char **argv, argh::parser &cmd); };