wesnothd: Fix server crash if client is autokicked by registered login
This commit is contained in:
parent
71422ead8e
commit
8cdf83393e
2 changed files with 7 additions and 3 deletions
|
@ -754,7 +754,7 @@ void server::login_client(boost::asio::yield_context yield, SocketPtr socket)
|
|||
if(const simple_wml::node* const login = login_response->child("login")) {
|
||||
username = (*login)["username"].to_string();
|
||||
|
||||
if(is_login_allowed(socket, login, username, registered, is_moderator)) {
|
||||
if(is_login_allowed(yield, socket, login, username, registered, is_moderator)) {
|
||||
break;
|
||||
} else continue;
|
||||
}
|
||||
|
@ -813,7 +813,7 @@ void server::login_client(boost::asio::yield_context yield, SocketPtr socket)
|
|||
}
|
||||
}
|
||||
|
||||
template<class SocketPtr> bool server::is_login_allowed(SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator)
|
||||
template<class SocketPtr> bool server::is_login_allowed(boost::asio::yield_context yield, SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator)
|
||||
{
|
||||
// Check if the username is valid (all alpha-numeric plus underscore and hyphen)
|
||||
if(!utils::isvalid_username(username)) {
|
||||
|
@ -920,6 +920,10 @@ template<class SocketPtr> bool server::is_login_allowed(SocketPtr socket, const
|
|||
if(registered) {
|
||||
// If there is already a client using this username kick it
|
||||
process_command("kick " + p->info().name() + " autokick by registered user", username);
|
||||
// need to wait for it to process
|
||||
while(player_connections_.get<name_t>().count(p->info().name()) > 0) {
|
||||
boost::asio::post(yield);
|
||||
}
|
||||
} else {
|
||||
async_send_error(socket, "The nickname '" + username + "' is already taken.", MP_NAME_TAKEN_ERROR);
|
||||
return false;
|
||||
|
|
|
@ -49,7 +49,7 @@ private:
|
|||
void handle_new_client(tls_socket_ptr socket);
|
||||
|
||||
template<class SocketPtr> void login_client(boost::asio::yield_context yield, SocketPtr socket);
|
||||
template<class SocketPtr> bool is_login_allowed(SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator);
|
||||
template<class SocketPtr> bool is_login_allowed(boost::asio::yield_context yield, SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator);
|
||||
template<class SocketPtr> bool authenticate(SocketPtr socket, const std::string& username, const std::string& password, bool name_taken, bool& registered);
|
||||
template<class SocketPtr> void send_password_request(SocketPtr socket, const std::string& msg, const char* error_code = "", bool force_confirmation = false);
|
||||
bool accepting_connections() const { return !graceful_restart; }
|
||||
|
|
Loading…
Add table
Reference in a new issue