From 59be901efe6b7833e69e638e0e1497051ce96fa7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 28 Dec 2022 20:42:33 +0000 Subject: [PATCH] Fixed unauthenticated sessions taking up player slots --- src/network/Network.php | 4 ++++ src/network/NetworkSessionManager.php | 24 ++++++++++++++++++- src/network/mcpe/NetworkSession.php | 1 + .../mcpe/handler/LoginPacketHandler.php | 2 +- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/network/Network.php b/src/network/Network.php index 04a84e91f..8e60d416c 100644 --- a/src/network/Network.php +++ b/src/network/Network.php @@ -80,6 +80,10 @@ class Network{ return $this->sessionManager->getSessionCount(); } + public function getValidConnectionCount() : int{ + return $this->sessionManager->getValidSessionCount(); + } + public function tick() : void{ foreach($this->interfaces as $interface){ $interface->tick(); diff --git a/src/network/NetworkSessionManager.php b/src/network/NetworkSessionManager.php index de1b7bfe3..1336b53cc 100644 --- a/src/network/NetworkSessionManager.php +++ b/src/network/NetworkSessionManager.php @@ -32,12 +32,25 @@ class NetworkSessionManager{ /** @var NetworkSession[] */ private array $sessions = []; + /** @var NetworkSession[] */ + private array $pendingLoginSessions = []; + /** * Adds a network session to the manager. This should only be called on session creation. */ public function add(NetworkSession $session) : void{ $idx = spl_object_id($session); $this->sessions[$idx] = $session; + $this->pendingLoginSessions[$idx] = $session; + } + + /** + * Marks the session as having sent a login request. After this point, they are counted towards the total player + * count. + */ + public function markLoginReceived(NetworkSession $session) : void{ + $idx = spl_object_id($session); + unset($this->pendingLoginSessions[$idx]); } /** @@ -47,15 +60,24 @@ class NetworkSessionManager{ public function remove(NetworkSession $session) : void{ $idx = spl_object_id($session); unset($this->sessions[$idx]); + unset($this->pendingLoginSessions[$idx]); } /** - * Returns the number of known connected sessions. + * Returns the number of known connected sessions, including sessions which have not yet sent a login request. */ public function getSessionCount() : int{ return count($this->sessions); } + /** + * Returns the number of connected sessions which have either sent a login request, or have already completed the + * login sequence. + */ + public function getValidSessionCount() : int{ + return count($this->sessions) - count($this->pendingLoginSessions); + } + /** @return NetworkSession[] */ public function getSessions() : array{ return $this->sessions; } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 8e76bced5..8bef42c36 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -229,6 +229,7 @@ class NetworkSession{ $this->info = $info; $this->logger->info("Player: " . TextFormat::AQUA . $info->getUsername() . TextFormat::RESET); $this->logger->setPrefix($this->getLogPrefix()); + $this->manager->markLoginReceived($this); }, function(bool $isAuthenticated, bool $authRequired, ?string $error, ?string $clientPubKey) : void{ $this->setAuthenticationStatus($isAuthenticated, $authRequired, $error, $clientPubKey); diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 11e5b4af4..80f162697 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -123,7 +123,7 @@ class LoginPacketHandler extends PacketHandler{ $this->session->getPort(), $this->server->requiresAuthentication() ); - if($this->server->getNetwork()->getConnectionCount() > $this->server->getMaxPlayers()){ + if($this->server->getNetwork()->getValidConnectionCount() > $this->server->getMaxPlayers()){ $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, KnownTranslationKeys::DISCONNECTIONSCREEN_SERVERFULL); } if(!$this->server->isWhitelisted($playerInfo->getUsername())){