Added PlayerInfo, Player is no longer accessible during PlayerPreLoginEvent

This commit is contained in:
Dylan K. Taylor
2019-01-13 19:32:30 +00:00
parent d2082c0383
commit 9c53b41851
6 changed files with 191 additions and 66 deletions

View File

@ -29,8 +29,10 @@ namespace pocketmine\network\mcpe\protocol;
use Particle\Validator\Validator;
use pocketmine\entity\Skin;
use pocketmine\network\mcpe\handler\SessionHandler;
use pocketmine\PlayerInfo;
use pocketmine\utils\BinaryStream;
use pocketmine\utils\Utils;
use pocketmine\utils\UUID;
use function array_filter;
use function base64_decode;
use function count;
@ -44,6 +46,10 @@ class LoginPacket extends DataPacket{
public const EDITION_POCKET = 0;
public const I_USERNAME = 'displayName';
public const I_UUID = 'identity';
public const I_XUID = 'XUID';
public const I_CLIENT_RANDOM_ID = 'ClientRandomId';
public const I_SERVER_ADDRESS = 'ServerAddress';
public const I_LANGUAGE_CODE = 'LanguageCode';
@ -54,27 +60,16 @@ class LoginPacket extends DataPacket{
public const I_GEOMETRY_NAME = 'SkinGeometryName';
public const I_GEOMETRY_DATA = 'SkinGeometry';
/** @var string */
public $username;
/** @var int */
public $protocol;
/** @var string */
public $clientUUID;
/** @var int */
public $clientId;
/** @var string */
public $xuid;
/** @var string */
public $identityPublicKey;
/** @var string */
public $serverAddress;
/** @var string */
public $locale;
/** @var Skin|null */
public $skin;
/** @var PlayerInfo */
public $playerInfo;
/** @var string[] array of encoded JWT */
public $chainDataJwt = [];
/** @var array|null extraData index of whichever JWT has it */
public $extraData = null;
/** @var string */
public $clientDataJwt;
/** @var array decoded payload of the clientData JWT */
@ -138,8 +133,6 @@ class LoginPacket extends DataPacket{
self::validate($vd, "chainData", $chainData);
$this->chainDataJwt = $chainData['chain'];
$hasExtraData = false;
foreach($this->chainDataJwt as $k => $chain){
//validate every chain element
$claims = Utils::getJwtClaims($chain);
@ -147,23 +140,20 @@ class LoginPacket extends DataPacket{
if(!is_array($claims["extraData"])){
throw new \UnexpectedValueException("'extraData' key should be an array");
}
if($hasExtraData){
if($this->extraData !== null){
throw new \UnexpectedValueException("Found 'extraData' more than once in chainData");
}
$hasExtraData = true;
$extraV = new Validator();
$extraV->required('displayName')->string();
$extraV->required('identity')->uuid();
$extraV->required('XUID')->string()->digits()->allowEmpty(true);
$extraV->required(self::I_USERNAME)->string();
$extraV->required(self::I_UUID)->uuid();
$extraV->required(self::I_XUID)->string()->digits()->allowEmpty(true);
self::validate($extraV, "chain.$k.extraData", $claims['extraData']);
$this->username = $claims["extraData"]["displayName"];
$this->clientUUID = $claims["extraData"]["identity"];
$this->xuid = $claims["extraData"]["XUID"];
$this->extraData = $claims['extraData'];
}
}
if(!$hasExtraData){
if($this->extraData === null){
throw new \UnexpectedValueException("'extraData' not found in chain data");
}
@ -184,16 +174,19 @@ class LoginPacket extends DataPacket{
$this->clientData = $clientData;
$this->clientId = $this->clientData[self::I_CLIENT_RANDOM_ID];
$this->serverAddress = $this->clientData[self::I_SERVER_ADDRESS];
$this->locale = $this->clientData[self::I_LANGUAGE_CODE];
$this->skin = 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->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]
);
}