diff --git a/loginserver/account_management.cpp b/loginserver/account_management.cpp index 0377506f6..50c467826 100644 --- a/loginserver/account_management.cpp +++ b/loginserver/account_management.cpp @@ -33,10 +33,11 @@ EQ::Event::TaskScheduler task_runner; * @param email * @return */ -int32 AccountManagement::CreateLocalLoginServerAccount( +int32 AccountManagement::CreateLoginServerAccount( std::string username, std::string password, - std::string email + std::string email, + const std::string &source_loginserver ) { auto mode = server.options.GetEncryptionMode(); @@ -49,19 +50,18 @@ int32 AccountManagement::CreateLocalLoginServerAccount( mode ); - unsigned int db_id = 0; - std::string db_loginserver = server.options.GetDefaultLoginServerName(); - if (server.db->DoesLoginServerAccountExist(username, hash, db_loginserver, 1)) { + unsigned int db_id = 0; + if (server.db->DoesLoginServerAccountExist(username, hash, source_loginserver, 1)) { LogWarning( "Attempting to create local login account for user [{0}] login [{1}] but already exists!", username, - db_loginserver + source_loginserver ); return -1; } - uint32 created_account_id = server.db->CreateLoginAccount(username, hash, db_loginserver, email); + uint32 created_account_id = server.db->CreateLoginAccount(username, hash, source_loginserver, email); if (created_account_id > 0) { LogInfo( "Account creation success for user [{0}] encryption algorithm [{1}] ({2}) id: [{3}]", @@ -323,7 +323,7 @@ uint32 AccountManagement::CheckExternalLoginserverUserCredentials( auto m_dbid = sp.GetUInt32(8); { - ret = (response_error <= 101 ? m_dbid : 0); + ret = (response_error <= 101 ? m_dbid : 0); running = false; } break; diff --git a/loginserver/account_management.h b/loginserver/account_management.h index 009112431..4e13c6993 100644 --- a/loginserver/account_management.h +++ b/loginserver/account_management.h @@ -30,9 +30,15 @@ public: * @param username * @param password * @param email + * @param source_loginserver * @return */ - static int32 CreateLocalLoginServerAccount(std::string username, std::string password, std::string email = ""); + static int32 CreateLoginServerAccount( + std::string username, + std::string password, + std::string email = "", + const std::string &source_loginserver = "local" + ); /** * @param username diff --git a/loginserver/loginserver_command_handler.cpp b/loginserver/loginserver_command_handler.cpp index 75b0dbfcd..d297d519d 100644 --- a/loginserver/loginserver_command_handler.cpp +++ b/loginserver/loginserver_command_handler.cpp @@ -145,7 +145,7 @@ namespace LoginserverCommandHandler { EQEmuCommand::ValidateCmdInput(arguments, options, cmd, argc, argv); - AccountManagement::CreateLocalLoginServerAccount( + AccountManagement::CreateLoginServerAccount( cmd("--username").str(), cmd("--password").str(), cmd("--email").str() diff --git a/loginserver/loginserver_webserver.cpp b/loginserver/loginserver_webserver.cpp index 860a8a1ea..ebb3604da 100644 --- a/loginserver/loginserver_webserver.cpp +++ b/loginserver/loginserver_webserver.cpp @@ -81,7 +81,48 @@ namespace LoginserverWebserver { return; } - int32 account_created_id = AccountManagement::CreateLocalLoginServerAccount(username, password, email); + int32 account_created_id = AccountManagement::CreateLoginServerAccount(username, password, email); + if (account_created_id > 0) { + response["message"] = "Account created successfully!"; + response["data"]["account_id"] = account_created_id; + } + else if (account_created_id == -1) { + response["error"] = "Account already exists!"; + } + else { + response["error"] = "Account failed to create!"; + } + + LoginserverWebserver::SendResponse(response, res); + } + ); + + api.Post( + "/account/create/external", [](const httplib::Request &request, httplib::Response &res) { + if (!LoginserverWebserver::TokenManager::AuthCanWrite(request, res)) { + return; + } + + Json::Value request_body = LoginserverWebserver::ParseRequestBody(request); + std::string username = request_body.get("username", "").asString(); + std::string password = request_body.get("password", "").asString(); + std::string email = request_body.get("email", "").asString(); + + Json::Value response; + if (username.empty() || password.empty()) { + response["error"] = "Username or password not set"; + LoginserverWebserver::SendResponse(response, res); + return; + } + + std::string source_loginserver = "eqemu"; + int32 account_created_id = AccountManagement::CreateLoginServerAccount( + username, + password, + email, + source_loginserver + ); + if (account_created_id > 0) { response["message"] = "Account created successfully!"; response["data"]["account_id"] = account_created_id;