Clean up Skin error handling, close #2926

Skin->__construct() now does all the validation.
This commit is contained in:
Dylan K. Taylor
2019-05-27 16:20:46 +01:00
parent 0a891f5408
commit 89242543b9
7 changed files with 47 additions and 73 deletions

View File

@ -75,14 +75,16 @@ class LoginSessionHandler extends SessionHandler{
return true;
}
$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()){
try{
$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])
);
}catch(\InvalidArgumentException $e){
$this->session->getLogger()->debug("Invalid skin: " . $e->getMessage());
$this->session->disconnect("disconnectionScreen.invalidSkin");
return true;

View File

@ -27,6 +27,7 @@ namespace pocketmine\network\mcpe\protocol;
use pocketmine\entity\Skin;
use pocketmine\network\BadPacketException;
use pocketmine\network\mcpe\handler\SessionHandler;
use pocketmine\network\mcpe\protocol\types\PlayerListEntry;
use function count;
@ -59,13 +60,17 @@ class PlayerListPacket extends DataPacket implements ClientboundPacket{
$geometryName = $this->getString();
$geometryData = $this->getString();
$entry->skin = new Skin(
$skinId,
$skinData,
$capeData,
$geometryName,
$geometryData
);
try{
$entry->skin = new Skin(
$skinId,
$skinData,
$capeData,
$geometryName,
$geometryData
);
}catch(\InvalidArgumentException $e){
throw new BadPacketException($e->getMessage(), 0, $e);
}
$entry->xboxUserId = $this->getString();
$entry->platformChatId = $this->getString();
}else{

View File

@ -26,6 +26,7 @@ namespace pocketmine\network\mcpe\protocol;
#include <rules/DataPacket.h>
use pocketmine\entity\Skin;
use pocketmine\network\BadPacketException;
use pocketmine\network\mcpe\handler\SessionHandler;
use pocketmine\utils\UUID;
@ -54,7 +55,11 @@ class PlayerSkinPacket extends DataPacket implements ClientboundPacket, Serverbo
$geometryModel = $this->getString();
$geometryData = $this->getString();
$this->skin = new Skin($skinId, $skinData, $capeData, $geometryModel, $geometryData);
try{
$this->skin = new Skin($skinId, $skinData, $capeData, $geometryModel, $geometryData);
}catch(\InvalidArgumentException $e){
throw new BadPacketException($e->getMessage(), 0, $e);
}
$this->premiumSkin = $this->getBool();
}