diff --git a/libs/s25main/network/GameServer.cpp b/libs/s25main/network/GameServer.cpp index 1e4f783643..905968063f 100644 --- a/libs/s25main/network/GameServer.cpp +++ b/libs/s25main/network/GameServer.cpp @@ -938,10 +938,12 @@ bool GameServer::OnGameMessage(const GameMessage_Server_Password& msg) } else playerInfos[msg.senderPlayerID].isHost = false; - player->sendMsgAsync(new GameMessage_Server_Password(passwordok)); - if(passwordok == "false") + { + player->sendMsg(GameMessage_Server_Password(passwordok)); KickPlayer(msg.senderPlayerID, KickReason::WrongPassword, __LINE__); + } else + player->sendMsgAsync(new GameMessage_Server_Password(passwordok)); return true; } diff --git a/tests/s25Main/network/testGameClient.cpp b/tests/s25Main/network/testGameClient.cpp index 6592309a42..59ec43660e 100644 --- a/tests/s25Main/network/testGameClient.cpp +++ b/tests/s25Main/network/testGameClient.cpp @@ -287,6 +287,34 @@ BOOST_AUTO_TEST_CASE(ClientDetectsMapBufferOverflow) BOOST_TEST(client.GetState() == ClientState::Stopped); } +BOOST_AUTO_TEST_CASE(ClientReportsWrongPasswordResponse) +{ + GameClient client; + GameMessageInterface& clientMsgInterface = client; + MockClientInterface callbacks; + client.SetInterface(&callbacks); + TestServer server; + const auto serverPort = server.tryListen(); + BOOST_TEST_REQUIRE(serverPort >= 0); + const auto serverType = rttr::test::randomEnum(); + mock::sequence s; + MOCK_EXPECT(callbacks.CI_NextConnectState).in(s).with(ConnectState::Initiated).once(); + MOCK_EXPECT(callbacks.CI_NextConnectState).in(s).with(ConnectState::VerifyServer).once(); + MOCK_EXPECT(callbacks.CI_NextConnectState).in(s).with(ConnectState::QueryPw).once(); + MOCK_EXPECT(callbacks.CI_Error).in(s).with(ClientError::WrongPassword).once(); + + BOOST_TEST_REQUIRE(client.Connect("localhost", rttr::test::randString(10), serverType, serverPort, false, false)); + clientMsgInterface.OnGameMessage(GameMessage_Player_Id(1)); + clientMsgInterface.OnGameMessage(GameMessage_Server_TypeOK(GameMessage_Server_TypeOK::StatusCode::Ok, "")); + BOOST_TEST_REQUIRE(boost::dynamic_pointer_cast(client.GetMainPlayer().sendQueue.pop())); + BOOST_TEST_REQUIRE( + boost::dynamic_pointer_cast(client.GetMainPlayer().sendQueue.pop())); + + clientMsgInterface.OnGameMessage(GameMessage_Server_Password("false")); + + BOOST_TEST(client.GetState() == ClientState::Stopped); +} + using namespace std::chrono_literals; BOOST_AUTO_TEST_CASE(CanSetNewSpeed)