From ea15e9bc5fdae9341b79a0ac89b90fc81572c8eb Mon Sep 17 00:00:00 2001 From: Akkadius Date: Fri, 9 Aug 2019 00:43:25 -0500 Subject: [PATCH] Fix bug with command length --- common/cli/eqemu_command_handler.cpp | 8 +- loginserver/account_management.cpp | 171 +++++++++++--------- loginserver/loginserver_command_handler.cpp | 14 +- loginserver/loginserver_webserver.cpp | 46 +++--- 4 files changed, 126 insertions(+), 113 deletions(-) diff --git a/common/cli/eqemu_command_handler.cpp b/common/cli/eqemu_command_handler.cpp index 6c08edeff..ef46e0d9f 100644 --- a/common/cli/eqemu_command_handler.cpp +++ b/common/cli/eqemu_command_handler.cpp @@ -148,10 +148,10 @@ namespace EQEmuCommand { int max_command_length = 0; for (auto &it: in_function_map) { - if (it.first.length() > max_command_length) { - std::stringstream command; - command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset; - max_command_length = command.str().length() + 5; + std::stringstream command; + command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset; + if (command.str().length() > max_command_length) { + max_command_length = command.str().length() + 1; } } diff --git a/loginserver/account_management.cpp b/loginserver/account_management.cpp index 139fe9690..cca68a150 100644 --- a/loginserver/account_management.cpp +++ b/loginserver/account_management.cpp @@ -24,7 +24,7 @@ #include "../common/event/event_loop.h" #include "../common/net/dns.h" -extern LoginServer server; +extern LoginServer server; EQ::Event::TaskScheduler task_runner; /** @@ -243,99 +243,112 @@ bool AccountManagement::UpdateLoginserverUserCredentials( return true; } -bool AccountManagement::CheckExternalLoginserverUserCredentials(const std::string &in_account_username, const std::string &in_account_password) +bool AccountManagement::CheckExternalLoginserverUserCredentials( + const std::string &in_account_username, + const std::string &in_account_password +) { - auto res = task_runner.Enqueue([&]() -> bool { - bool running = true; - bool ret = false; - EQ::Net::DaybreakConnectionManager mgr; - std::shared_ptr c; + auto res = task_runner.Enqueue( + [&]() -> bool { + bool running = true; + bool ret = false; + EQ::Net::DaybreakConnectionManager mgr; + std::shared_ptr c; - mgr.OnNewConnection([&](std::shared_ptr connection) { - c = connection; - }); - - mgr.OnConnectionStateChange([&](std::shared_ptr conn, EQ::Net::DbProtocolStatus from, EQ::Net::DbProtocolStatus to) { - if (EQ::Net::StatusConnected == to) { - EQ::Net::DynamicPacket p; - p.PutUInt16(0, 1); //OP_SessionReady - p.PutUInt32(2, 2); - c->QueuePacket(p); - } - else if (EQ::Net::StatusDisconnected == to) { - running = false; - } - }); - - mgr.OnPacketRecv([&](std::shared_ptr conn, const EQ::Net::Packet &p) { - auto opcode = p.GetUInt16(0); - switch (opcode) { - case 0x0017: //OP_ChatMessage - { - size_t buffer_len = in_account_username.length() + in_account_password.length() + 2; - std::unique_ptr buffer(new char[buffer_len]); - - strcpy(&buffer[0], in_account_username.c_str()); - strcpy(&buffer[in_account_username.length() + 1], in_account_password.c_str()); - - size_t encrypted_len = buffer_len; - - if (encrypted_len % 8 > 0) { - encrypted_len = ((encrypted_len / 8) + 1) * 8; + mgr.OnNewConnection( + [&](std::shared_ptr connection) { + c = connection; } + ); - EQ::Net::DynamicPacket p; - p.Resize(12 + encrypted_len); - p.PutUInt16(0, 2); //OP_Login - p.PutUInt32(2, 3); - - eqcrypt_block(&buffer[0], buffer_len, (char*)p.Data() + 12, true); - c->QueuePacket(p); - break; - } - case 0x0018: - { - auto encrypt_size = p.Length() - 12; - if (encrypt_size % 8 > 0) { - encrypt_size = (encrypt_size / 8) * 8; + mgr.OnConnectionStateChange( + [&]( + std::shared_ptr conn, + EQ::Net::DbProtocolStatus from, + EQ::Net::DbProtocolStatus to + ) { + if (EQ::Net::StatusConnected == to) { + EQ::Net::DynamicPacket p; + p.PutUInt16(0, 1); //OP_SessionReady + p.PutUInt32(2, 2); + c->QueuePacket(p); + } + else if (EQ::Net::StatusDisconnected == to) { + running = false; + } } + ); - std::unique_ptr decrypted(new char[encrypt_size]); + mgr.OnPacketRecv( + [&](std::shared_ptr conn, const EQ::Net::Packet &p) { + auto opcode = p.GetUInt16(0); + switch (opcode) { + case 0x0017: //OP_ChatMessage + { + size_t buffer_len = + in_account_username.length() + in_account_password.length() + 2; + std::unique_ptr buffer(new char[buffer_len]); - eqcrypt_block((char*)p.Data() + 12, encrypt_size, &decrypted[0], false); + strcpy(&buffer[0], in_account_username.c_str()); + strcpy(&buffer[in_account_username.length() + 1], in_account_password.c_str()); - EQ::Net::StaticPacket sp(&decrypted[0], encrypt_size); - auto response_error = sp.GetUInt16(1); + size_t encrypted_len = buffer_len; - if (response_error > 101) { - ret = false; - running = false; + if (encrypted_len % 8 > 0) { + encrypted_len = ((encrypted_len / 8) + 1) * 8; + } + + EQ::Net::DynamicPacket p; + p.Resize(12 + encrypted_len); + p.PutUInt16(0, 2); //OP_Login + p.PutUInt32(2, 3); + + eqcrypt_block(&buffer[0], buffer_len, (char *) p.Data() + 12, true); + c->QueuePacket(p); + break; + } + case 0x0018: { + auto encrypt_size = p.Length() - 12; + if (encrypt_size % 8 > 0) { + encrypt_size = (encrypt_size / 8) * 8; + } + + std::unique_ptr decrypted(new char[encrypt_size]); + + eqcrypt_block((char *) p.Data() + 12, encrypt_size, &decrypted[0], false); + + EQ::Net::StaticPacket sp(&decrypted[0], encrypt_size); + auto response_error = sp.GetUInt16(1); + + { + ret = response_error <= 101; + running = false; + } + break; + } + } } - else { - ret = true; - running = false; + ); + + EQ::Net::DNSLookup( + "login.eqemulator.net", 5999, false, [&](const std::string &addr) { + if (addr.empty()) { + ret = false; + running = false; + } + + mgr.Connect(addr, 5999); } - break; - } - } - }); + ); - EQ::Net::DNSLookup("login.eqemulator.net", 5999, false, [&](const std::string &addr) { - if (addr == "") { - ret = false; - running = false; + auto &loop = EQ::EventLoop::Get(); + while (running) { + loop.Process(); } - mgr.Connect(addr, 5999); - }); - - auto &loop = EQ::EventLoop::Get(); - while (true == running) { - loop.Process(); + return ret; } - - return ret; - }); + ); return res.get(); } diff --git a/loginserver/loginserver_command_handler.cpp b/loginserver/loginserver_command_handler.cpp index 81647d60d..59398d495 100644 --- a/loginserver/loginserver_command_handler.cpp +++ b/loginserver/loginserver_command_handler.cpp @@ -50,13 +50,13 @@ namespace LoginserverCommandHandler { /** * Register commands */ - function_map["login-user:check-credentials"] = &LoginserverCommandHandler::CheckLoginserverUserCredentials; - function_map["login-user:check-external-credentials"] = &LoginserverCommandHandler::CheckExternalLoginserverUserCredentials; - function_map["login-user:create"] = &LoginserverCommandHandler::CreateLocalLoginserverAccount; - function_map["login-user:update-credentials"] = &LoginserverCommandHandler::UpdateLoginserverUserCredentials; - function_map["web-api-token:create"] = &LoginserverCommandHandler::CreateLoginserverApiToken; - function_map["web-api-token:list"] = &LoginserverCommandHandler::ListLoginserverApiTokens; - function_map["world-admin:create"] = &LoginserverCommandHandler::CreateLoginserverWorldAdminAccount; + function_map["login-user:check-credentials"] = &LoginserverCommandHandler::CheckLoginserverUserCredentials; + function_map["login-user:check-external-credentials"] = &LoginserverCommandHandler::CheckExternalLoginserverUserCredentials; + function_map["login-user:create"] = &LoginserverCommandHandler::CreateLocalLoginserverAccount; + function_map["login-user:update-credentials"] = &LoginserverCommandHandler::UpdateLoginserverUserCredentials; + function_map["web-api-token:create"] = &LoginserverCommandHandler::CreateLoginserverApiToken; + function_map["web-api-token:list"] = &LoginserverCommandHandler::ListLoginserverApiTokens; + function_map["world-admin:create"] = &LoginserverCommandHandler::CreateLoginserverWorldAdminAccount; EQEmuCommand::HandleMenu(function_map, cmd, argc, argv); } diff --git a/loginserver/loginserver_webserver.cpp b/loginserver/loginserver_webserver.cpp index a26115075..3a26cfb97 100644 --- a/loginserver/loginserver_webserver.cpp +++ b/loginserver/loginserver_webserver.cpp @@ -161,32 +161,32 @@ namespace LoginserverWebserver { api.Post( "/account/credentials/validate/external", [](const httplib::Request &request, httplib::Response &res) { - LoginserverWebserver::TokenManager::AuthCanRead(request, res); - Json::Value request_body = LoginserverWebserver::ParseRequestBody(request); - std::string username = request_body.get("username", "").asString(); - std::string password = request_body.get("password", "").asString(); + LoginserverWebserver::TokenManager::AuthCanRead(request, res); + Json::Value request_body = LoginserverWebserver::ParseRequestBody(request); + std::string username = request_body.get("username", "").asString(); + std::string password = request_body.get("password", "").asString(); + + Json::Value response; + if (username.empty() || password.empty()) { + response["error"] = "Username or password not set"; + LoginserverWebserver::SendResponse(response, res); + return; + } + + bool credentials_valid = AccountManagement::CheckExternalLoginserverUserCredentials( + username, + password + ); + + if (credentials_valid) { + response["message"] = "Credentials valid!"; + } + else { + response["error"] = "Credentials invalid!"; + } - Json::Value response; - if (username.empty() || password.empty()) { - response["error"] = "Username or password not set"; LoginserverWebserver::SendResponse(response, res); - return; } - - bool credentials_valid = AccountManagement::CheckExternalLoginserverUserCredentials( - username, - password - ); - - if (credentials_valid) { - response["message"] = "Credentials valid!"; - } - else { - response["error"] = "Credentials invalid!"; - } - - LoginserverWebserver::SendResponse(response, res); - } ); }