Move some things out of LoginPacket and into the handler

This commit is contained in:
Dylan K. Taylor 2019-05-27 16:06:30 +01:00
parent 3902a3c28c
commit 0a891f5408
2 changed files with 25 additions and 29 deletions

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\network\mcpe\handler;
use pocketmine\entity\Skin;
use pocketmine\event\player\PlayerPreLoginEvent;
use pocketmine\network\mcpe\NetworkCipher;
use pocketmine\network\mcpe\NetworkSession;
@ -31,7 +32,10 @@ use pocketmine\network\mcpe\protocol\LoginPacket;
use pocketmine\network\mcpe\protocol\PlayStatusPacket;
use pocketmine\network\mcpe\protocol\ProtocolInfo;
use pocketmine\Player;
use pocketmine\PlayerInfo;
use pocketmine\Server;
use pocketmine\utils\UUID;
use function base64_decode;
/**
* Handles the initial login phase of the session. This handler is used as the initial state.
@ -50,8 +54,6 @@ class LoginSessionHandler extends SessionHandler{
}
public function handleLogin(LoginPacket $packet) : bool{
$this->session->setPlayerInfo($packet->playerInfo);
if(!$this->isCompatibleProtocol($packet->protocol)){
$pk = new PlayStatusPacket();
$pk->status = $packet->protocol < ProtocolInfo::CURRENT_PROTOCOL ?
@ -67,20 +69,36 @@ class LoginSessionHandler extends SessionHandler{
return true;
}
if(!Player::isValidUserName($packet->playerInfo->getUsername())){
if(!Player::isValidUserName($packet->extraData[LoginPacket::I_USERNAME])){
$this->session->disconnect("disconnectionScreen.invalidName");
return true;
}
if(!$packet->playerInfo->getSkin()->isValid()){
$skin = new Skin(
$packet->clientData[LoginPacket::I_SKIN_ID],
base64_decode($packet->clientData[LoginPacket::I_SKIN_DATA]),
base64_decode($packet->clientData[LoginPacket::I_CAPE_DATA]),
$packet->clientData[LoginPacket::I_GEOMETRY_NAME],
base64_decode($packet->clientData[LoginPacket::I_GEOMETRY_DATA])
);
if(!$skin->isValid()){
$this->session->disconnect("disconnectionScreen.invalidSkin");
return true;
}
$this->session->setPlayerInfo(new PlayerInfo(
$packet->extraData[LoginPacket::I_USERNAME],
UUID::fromString($packet->extraData[LoginPacket::I_UUID]),
$skin,
$packet->clientData[LoginPacket::I_LANGUAGE_CODE],
$packet->extraData[LoginPacket::I_XUID],
$packet->clientData[LoginPacket::I_CLIENT_RANDOM_ID]
));
$ev = new PlayerPreLoginEvent(
$packet->playerInfo,
$this->session->getPlayerInfo(),
$this->session->getIp(),
$this->session->getPort(),
$this->server->requiresAuthentication()
@ -88,10 +106,10 @@ class LoginSessionHandler extends SessionHandler{
if($this->server->getNetwork()->getConnectionCount() > $this->server->getMaxPlayers()){
$ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, "disconnectionScreen.serverFull");
}
if(!$this->server->isWhitelisted($packet->playerInfo->getUsername())){
if(!$this->server->isWhitelisted($this->session->getPlayerInfo()->getUsername())){
$ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED, "Server is whitelisted");
}
if($this->server->getNameBans()->isBanned($packet->playerInfo->getUsername()) or $this->server->getIPBans()->isBanned($this->session->getIp())){
if($this->server->getNameBans()->isBanned($this->session->getPlayerInfo()->getUsername()) or $this->server->getIPBans()->isBanned($this->session->getIp())){
$ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_BANNED, "You are banned");
}

View File

@ -27,16 +27,12 @@ namespace pocketmine\network\mcpe\protocol;
use Particle\Validator\Validator;
use pocketmine\entity\Skin;
use pocketmine\network\BadPacketException;
use pocketmine\network\mcpe\handler\SessionHandler;
use pocketmine\PlayerInfo;
use pocketmine\utils\BinaryDataException;
use pocketmine\utils\BinaryStream;
use pocketmine\utils\Utils;
use pocketmine\utils\UUID;
use function array_filter;
use function base64_decode;
use function count;
use function implode;
use function is_array;
@ -65,9 +61,6 @@ class LoginPacket extends DataPacket implements ServerboundPacket{
/** @var int */
public $protocol;
/** @var PlayerInfo */
public $playerInfo;
/** @var string[] array of encoded JWT */
public $chainDataJwt = [];
/** @var array|null extraData index of whichever JWT has it */
@ -183,21 +176,6 @@ class LoginPacket extends DataPacket implements ServerboundPacket{
self::validate($v, 'clientData', $clientData);
$this->clientData = $clientData;
$this->playerInfo = new PlayerInfo(
$this->extraData[self::I_USERNAME],
UUID::fromString($this->extraData[self::I_UUID]),
new Skin(
$this->clientData[self::I_SKIN_ID],
base64_decode($this->clientData[self::I_SKIN_DATA]),
base64_decode($this->clientData[self::I_CAPE_DATA]),
$this->clientData[self::I_GEOMETRY_NAME],
base64_decode($this->clientData[self::I_GEOMETRY_DATA])
),
$this->clientData[self::I_LANGUAGE_CODE],
$this->extraData[self::I_XUID],
$this->clientData[self::I_CLIENT_RANDOM_ID]
);
}
protected function encodePayload() : void{