[Loginserver] Add some resiliency to LS requests (#1663)

This commit is contained in:
Chris Miles 2021-11-02 00:19:13 -05:00 committed by GitHub
parent 9af7122b1d
commit 05782433b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 60 deletions

View File

@ -280,6 +280,8 @@ bool AccountManagement::UpdateLoginserverWorldAdminAccountPasswordById(
return updated_account; return updated_account;
} }
constexpr int REQUEST_TIMEOUT_MS = 1500;
/** /**
* @param in_account_username * @param in_account_username
* @param in_account_password * @param in_account_password
@ -386,8 +388,16 @@ uint32 AccountManagement::CheckExternalLoginserverUserCredentials(
} }
); );
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
auto &loop = EQ::EventLoop::Get(); auto &loop = EQ::EventLoop::Get();
while (running) { while (running) {
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
if (std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() > REQUEST_TIMEOUT_MS) {
LogInfo("[CheckExternalLoginserverUserCredentials] Deadline exceeded [{}]", REQUEST_TIMEOUT_MS);
running = false;
}
loop.Process(); loop.Process();
} }

View File

@ -4,6 +4,7 @@
#include "../common/eqemu_logsys.h" #include "../common/eqemu_logsys.h"
#include "../common/string_util.h" #include "../common/string_util.h"
#include "encryption.h" #include "encryption.h"
#include "account_management.h"
extern LoginServer server; extern LoginServer server;
@ -375,61 +376,20 @@ void Client::AttemptLoginAccountCreation(
return; return;
} }
if (server.options.GetEQEmuLoginServerAddress().length() == 0) { uint32 account_id = AccountManagement::CheckExternalLoginserverUserCredentials(
DoFailedLogin(); user,
pass
);
if (account_id > 0) {
LogInfo("[AttemptLoginAccountCreation] Found and creating eqemu account [{}]", account_id);
CreateEQEmuAccount(user, pass, account_id);
return; return;
} }
auto addr_components = SplitString(server.options.GetEQEmuLoginServerAddress(), ':');
if (addr_components.size() != 2) {
DoFailedLogin(); DoFailedLogin();
return; return;
} }
m_stored_user = user;
m_stored_pass = pass;
auto address = addr_components[0];
auto port = std::stoi(addr_components[1]);
EQ::Net::DNSLookup(
address, port, false, [=](const std::string &addr) {
if (addr.empty()) {
DoFailedLogin();
return;
}
m_login_connection_manager.reset(new EQ::Net::DaybreakConnectionManager());
m_login_connection_manager->OnNewConnection(
std::bind(
&Client::LoginOnNewConnection,
this,
std::placeholders::_1
)
);
m_login_connection_manager->OnConnectionStateChange(
std::bind(
&Client::LoginOnStatusChange,
this,
std::placeholders::_1,
std::placeholders::_2,
std::placeholders::_3
)
);
m_login_connection_manager->OnPacketRecv(
std::bind(
&Client::LoginOnPacketRecv,
this,
std::placeholders::_1,
std::placeholders::_2
)
);
m_login_connection_manager->Connect(addr, port);
}
);
return;
}
#endif #endif
if (server.options.CanAutoCreateAccounts() && loginserver == "local") { if (server.options.CanAutoCreateAccounts() && loginserver == "local") {