diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 3e2f2b27a..ddc8d2fdd 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -33,6 +33,7 @@ use pocketmine\entity\Effect; use pocketmine\entity\EffectInstance; use pocketmine\entity\Entity; use pocketmine\entity\Human; +use pocketmine\entity\InvalidSkinException; use pocketmine\entity\object\ItemEntity; use pocketmine\entity\projectile\Arrow; use pocketmine\entity\Skin; @@ -1957,9 +1958,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ true ); - $skin = SkinAdapterSingleton::get()->fromSkinData($skinData); - - if(!$skin->isValid()){ + try{ + $skin = SkinAdapterSingleton::get()->fromSkinData($skinData); + $skin->validate(); + }catch(InvalidSkinException $e){ + $this->server->getLogger()->debug("$this->username: Invalid skin: " . $e->getMessage()); $this->close("", "disconnectionScreen.invalidSkin"); return true; diff --git a/src/pocketmine/network/mcpe/protocol/types/LegacySkinAdapter.php b/src/pocketmine/network/mcpe/protocol/types/LegacySkinAdapter.php index 3b81144cd..e4e7435b6 100644 --- a/src/pocketmine/network/mcpe/protocol/types/LegacySkinAdapter.php +++ b/src/pocketmine/network/mcpe/protocol/types/LegacySkinAdapter.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\protocol\types; +use pocketmine\entity\InvalidSkinException; use pocketmine\entity\Skin; use function is_string; @@ -56,12 +57,11 @@ class LegacySkinAdapter implements SkinAdapter{ $capeData = $data->isPersonaCapeOnClassic() ? "" : $data->getCapeImage()->getData(); - $geometryName = ""; $resourcePatch = json_decode($data->getResourcePatch(), true); if(isset($resourcePatch["geometry"]["default"]) && is_string($resourcePatch["geometry"]["default"])){ $geometryName = $resourcePatch["geometry"]["default"]; }else{ - //TODO: Kick for invalid skin + throw new InvalidSkinException("Missing geometry name field"); } return new Skin($data->getSkinId(), $data->getSkinImage()->getData(), $capeData, $geometryName, $data->getGeometryData()); diff --git a/src/pocketmine/network/mcpe/protocol/types/SkinAdapter.php b/src/pocketmine/network/mcpe/protocol/types/SkinAdapter.php index 357d7c2ab..5ab4b9761 100644 --- a/src/pocketmine/network/mcpe/protocol/types/SkinAdapter.php +++ b/src/pocketmine/network/mcpe/protocol/types/SkinAdapter.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\protocol\types; +use pocketmine\entity\InvalidSkinException; use pocketmine\entity\Skin; /** @@ -37,6 +38,7 @@ interface SkinAdapter{ /** * Allows you to convert skin data to a skin entity. + * @throws InvalidSkinException */ public function fromSkinData(SkinData $data) : Skin; }