From c3f6ef5a1daa095d920f37418bff161eb5e72291 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:37:19 -0700 Subject: [PATCH] feat: add admin account creation options from cli (GM level) (#1620) * add admin account creation options from cli * use actual gm levels felt under delivered in previous iteration. * Update dMasterServer/MasterServer.cpp Co-authored-by: Daniel Seiler --------- Co-authored-by: Daniel Seiler --- dDatabase/GameDatabase/ITables/IAccounts.h | 3 ++ dDatabase/GameDatabase/MySQL/MySQLDatabase.h | 1 + .../GameDatabase/MySQL/Tables/Accounts.cpp | 4 ++ dMasterServer/MasterServer.cpp | 39 +++++++++++++++++-- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/dDatabase/GameDatabase/ITables/IAccounts.h b/dDatabase/GameDatabase/ITables/IAccounts.h index 3f27dda6..a0377f4b 100644 --- a/dDatabase/GameDatabase/ITables/IAccounts.h +++ b/dDatabase/GameDatabase/ITables/IAccounts.h @@ -33,6 +33,9 @@ public: // Add a new account to the database. virtual void InsertNewAccount(const std::string_view username, const std::string_view bcryptpassword) = 0; + + // Update the GameMaster level of an account. + virtual void UpdateAccountGmLevel(const uint32_t accountId, const eGameMasterLevel gmLevel) = 0; }; #endif //!__IACCOUNTS__H__ diff --git a/dDatabase/GameDatabase/MySQL/MySQLDatabase.h b/dDatabase/GameDatabase/MySQL/MySQLDatabase.h index 689622d0..a3019bea 100644 --- a/dDatabase/GameDatabase/MySQL/MySQLDatabase.h +++ b/dDatabase/GameDatabase/MySQL/MySQLDatabase.h @@ -111,6 +111,7 @@ public: void AddBehavior(const IBehaviors::Info& info) override; std::string GetBehavior(const int32_t behaviorId) override; void RemoveBehavior(const int32_t characterId) override; + void UpdateAccountGmLevel(const uint32_t accountId, const eGameMasterLevel gmLevel) override; private: // Generic query functions that can be used for any query. diff --git a/dDatabase/GameDatabase/MySQL/Tables/Accounts.cpp b/dDatabase/GameDatabase/MySQL/Tables/Accounts.cpp index 801f444d..9e9812f3 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/Accounts.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/Accounts.cpp @@ -35,3 +35,7 @@ void MySQLDatabase::UpdateAccountPassword(const uint32_t accountId, const std::s void MySQLDatabase::InsertNewAccount(const std::string_view username, const std::string_view bcryptpassword) { ExecuteInsert("INSERT INTO accounts (name, password, gm_level) VALUES (?, ?, ?);", username, bcryptpassword, static_cast(eGameMasterLevel::OPERATOR)); } + +void MySQLDatabase::UpdateAccountGmLevel(const uint32_t accountId, const eGameMasterLevel gmLevel) { + ExecuteUpdate("UPDATE accounts SET gm_level = ? WHERE id = ?;", static_cast(gmLevel), accountId); +} diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index 0f36ee37..05955a85 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -41,6 +41,7 @@ #include "Start.h" #include "Server.h" #include "CDZoneTableTable.h" +#include "eGameMasterLevel.h" namespace Game { Logger* logger = nullptr; @@ -187,15 +188,20 @@ int main(int argc, char** argv) { std::cout << "Enter a username: "; std::cin >> username; + const auto checkIsAdmin = []() { + std::string admin; + std::cout << "What level of privilege should this account have? Please enter a number between 0 (Player) and 9 (Admin) inclusive. No entry will default to 0." << std::endl; + std::cin >> admin; + return admin; + }; + auto accountId = Database::Get()->GetAccountInfo(username); - if (accountId) { + if (accountId && accountId->id != 0) { LOG("Account with name \"%s\" already exists", username.c_str()); std::cout << "Do you want to change the password of that account? [y/n]?"; std::string prompt = ""; std::cin >> prompt; if (prompt == "y" || prompt == "yes") { - if (accountId->id == 0) return EXIT_FAILURE; - //Read the password from the console without echoing it. #ifdef __linux__ //This function is obsolete, but it only meant to be used by the @@ -220,6 +226,20 @@ int main(int argc, char** argv) { } else { LOG("Account \"%s\" was not updated.", username.c_str()); } + + std::cout << "Update admin privileges? [y/n]? "; + std::string admin; + std::cin >> admin; + bool updateAdmin = admin == "y" || admin == "yes"; + if (updateAdmin) { + auto gmLevel = GeneralUtils::TryParse(checkIsAdmin()).value_or(0); + if (gmLevel > 9 || gmLevel < 0) { + LOG("Invalid admin level. Defaulting to 0"); + gmLevel = 0; + } + Database::Get()->UpdateAccountGmLevel(accountId->id, static_cast(gmLevel)); + } + return EXIT_SUCCESS; } @@ -250,6 +270,17 @@ int main(int argc, char** argv) { } LOG("Account created successfully!"); + + accountId = Database::Get()->GetAccountInfo(username); + if (accountId) { + auto gmLevel = GeneralUtils::TryParse(checkIsAdmin()).value_or(0); + if (gmLevel > 9 || gmLevel < 0) { + LOG("Invalid admin level. Defaulting to 0"); + gmLevel = 0; + } + Database::Get()->UpdateAccountGmLevel(accountId->id, static_cast(gmLevel)); + } + return EXIT_SUCCESS; } @@ -558,7 +589,7 @@ void HandlePacket(Packet* packet) { inStream.Read(sessionKey); LUString username; inStream.Read(username); - + for (auto it : activeSessions) { if (it.second == username.string) { activeSessions.erase(it.first);