diff --git a/MainServer/include/Classes/Room.h b/MainServer/include/Classes/Room.h index bfd4f033..d20342ba 100644 --- a/MainServer/include/Classes/Room.h +++ b/MainServer/include/Classes/Room.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "../Structures/Room/ClientRoomCreationInfo.h" #include "../Structures/Room/RoomPlayerInfo.h" #include "../Structures/Room/RoomsList.h" @@ -41,6 +42,7 @@ namespace Main std::vector> m_kickedPlayerAccountIds{}; std::vector m_votekickStarters{}; // each player has only 1 votekick per match + std::unordered_set m_pendingInviteAccountIds{}; // Points std::uint32_t m_bluePoints{}; @@ -290,6 +292,9 @@ namespace Main bool wasPreviouslyKicked(std::uint32_t accountId) const; bool removeKickedPlayerByNickname(const std::string& nickname); std::vector getKickedPlayerNicknames() const; + void addPendingInvite(std::uint32_t accountId); + bool hasPendingInvite(std::uint32_t accountId) const; + void removePendingInvite(std::uint32_t accountId); Main::Structures::RoomSettingsUpdateTitlePassword getRoomSettingsUpdate() const; Main::Network::Session::AccountInfo getAccountInfoFor(const Main::Structures::UniqueId& uniqueId) const; diff --git a/MainServer/include/Handlers/Room/RoomInviteJoin.h b/MainServer/include/Handlers/Room/RoomInviteJoin.h index db809595..b31bf495 100644 --- a/MainServer/include/Handlers/Room/RoomInviteJoin.h +++ b/MainServer/include/Handlers/Room/RoomInviteJoin.h @@ -138,6 +138,7 @@ namespace Main } response.setData(reinterpret_cast(&roomFollow), sizeof(roomFollow)); targetSession->asyncWrite(response); + room->addPendingInvite(targetSession->getAccountInfo().accountID); } else { diff --git a/MainServer/include/Handlers/Room/RoomJoinHandler.h b/MainServer/include/Handlers/Room/RoomJoinHandler.h index 47a6ae39..5bbb7600 100644 --- a/MainServer/include/Handlers/Room/RoomJoinHandler.h +++ b/MainServer/include/Handlers/Room/RoomJoinHandler.h @@ -93,7 +93,8 @@ namespace Main std::memcpy(roomInfo.password, room->getPassword().c_str(), Common::Constants::maxPassword); } // Fix: Check if room has password and player did not input any password, deny access - else if (roomSettings.hasPassword && !hasInputtedPassword) + // Exception: players who were explicitly invited already have server-side authorization + else if (roomSettings.hasPassword && !hasInputtedPassword && !room->hasPendingInvite(accountInfo.accountID)) { response.setExtra(RoomJoinExtra::JOIN_INVALID_PASSWORD); session->asyncWrite(response); @@ -289,6 +290,7 @@ namespace Main room->addObserverPlayer(session); else room->addPlayer(session, latestEnteredPlayerInfo.team); + room->removePendingInvite(accountInfo.accountID); if (room->isAssassinMode()) { diff --git a/MainServer/src/Classes/Room.cpp b/MainServer/src/Classes/Room.cpp index 3ca9f516..590c2282 100644 --- a/MainServer/src/Classes/Room.cpp +++ b/MainServer/src/Classes/Room.cpp @@ -1228,6 +1228,21 @@ namespace Main != m_kickedPlayerAccountIds.end(); } + void Room::addPendingInvite(std::uint32_t accountId) + { + m_pendingInviteAccountIds.insert(accountId); + } + + bool Room::hasPendingInvite(std::uint32_t accountId) const + { + return m_pendingInviteAccountIds.contains(accountId); + } + + void Room::removePendingInvite(std::uint32_t accountId) + { + m_pendingInviteAccountIds.erase(accountId); + } + bool Room::removeKickedPlayerByNickname(const std::string& nickname) { auto initialSize = m_kickedPlayerAccountIds.size();