From eb161f8e1c3b07434f39a65e6befb7e6631120c7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 6 Jun 2019 14:43:20 +0100 Subject: [PATCH 1/3] Use base64 instead of hex to display binary in some places base64 takes less space than hex, which is beneficial for logging larger payloads. --- src/pocketmine/Server.php | 3 +-- src/pocketmine/item/Item.php | 3 +-- src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter.php | 3 ++- src/pocketmine/network/mcpe/RakLibInterface.php | 4 ++-- src/pocketmine/network/query/QueryHandler.php | 4 ++-- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 09084ddb1..600eec22d 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -112,7 +112,6 @@ use function array_sum; use function asort; use function assert; use function base64_encode; -use function bin2hex; use function class_exists; use function count; use function define; @@ -2528,7 +2527,7 @@ class Server{ if(strlen($payload) > 2 and substr($payload, 0, 2) === "\xfe\xfd" and $this->queryHandler instanceof QueryHandler){ $this->queryHandler->handle($interface, $address, $port, $payload); }else{ - $this->logger->debug("Unhandled raw packet from $address $port: " . bin2hex($payload)); + $this->logger->debug("Unhandled raw packet from $address $port: " . base64_encode($payload)); } }catch(\Throwable $e){ $this->logger->logException($e); diff --git a/src/pocketmine/item/Item.php b/src/pocketmine/item/Item.php index 547785c56..5b4ae890a 100644 --- a/src/pocketmine/item/Item.php +++ b/src/pocketmine/item/Item.php @@ -46,7 +46,6 @@ use pocketmine\utils\Binary; use function array_map; use function base64_decode; use function base64_encode; -use function bin2hex; use function file_get_contents; use function get_class; use function hex2bin; @@ -874,7 +873,7 @@ class Item implements ItemIds, \JsonSerializable{ * @return string */ final public function __toString() : string{ - return "Item " . $this->name . " (" . $this->id . ":" . ($this->hasAnyDamageValue() ? "?" : $this->meta) . ")x" . $this->count . ($this->hasCompoundTag() ? " tags:0x" . bin2hex($this->getCompoundTag()) : ""); + return "Item " . $this->name . " (" . $this->id . ":" . ($this->hasAnyDamageValue() ? "?" : $this->meta) . ")x" . $this->count . ($this->hasCompoundTag() ? " tags:" . base64_encode($this->getCompoundTag()) : ""); } /** diff --git a/src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter.php b/src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter.php index f9d8ece15..53afe17be 100644 --- a/src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter.php +++ b/src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter.php @@ -68,6 +68,7 @@ use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\Player; use pocketmine\Server; use pocketmine\timings\Timings; +use function base64_encode; use function bin2hex; use function implode; use function json_decode; @@ -107,7 +108,7 @@ class PlayerNetworkSessionAdapter extends NetworkSession{ $ev = new DataPacketReceiveEvent($this->player, $packet); $ev->call(); if(!$ev->isCancelled() and !$packet->handle($this)){ - $this->server->getLogger()->debug("Unhandled " . $packet->getName() . " received from " . $this->player->getName() . ": 0x" . bin2hex($packet->buffer)); + $this->server->getLogger()->debug("Unhandled " . $packet->getName() . " received from " . $this->player->getName() . ": " . base64_encode($packet->buffer)); } $timings->stopTiming(); diff --git a/src/pocketmine/network/mcpe/RakLibInterface.php b/src/pocketmine/network/mcpe/RakLibInterface.php index 9bffb4338..1877b0a13 100644 --- a/src/pocketmine/network/mcpe/RakLibInterface.php +++ b/src/pocketmine/network/mcpe/RakLibInterface.php @@ -40,7 +40,7 @@ use raklib\server\ServerHandler; use raklib\server\ServerInstance; use raklib\utils\InternetAddress; use function addcslashes; -use function bin2hex; +use function base64_encode; use function get_class; use function implode; use function rtrim; @@ -170,7 +170,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ } }catch(\Throwable $e){ $logger = $this->server->getLogger(); - $logger->debug("Packet " . (isset($pk) ? get_class($pk) : "unknown") . " 0x" . bin2hex($packet->buffer)); + $logger->debug("Packet " . (isset($pk) ? get_class($pk) : "unknown") . ": " . base64_encode($packet->buffer)); $logger->logException($e); $player->close($player->getLeaveMessage(), "Internal server error"); diff --git a/src/pocketmine/network/query/QueryHandler.php b/src/pocketmine/network/query/QueryHandler.php index 7dfb7c46a..2788d7907 100644 --- a/src/pocketmine/network/query/QueryHandler.php +++ b/src/pocketmine/network/query/QueryHandler.php @@ -30,7 +30,7 @@ namespace pocketmine\network\query; use pocketmine\network\AdvancedSourceInterface; use pocketmine\Server; use pocketmine\utils\Binary; -use function bin2hex; +use function base64_encode; use function chr; use function hash; use function microtime; @@ -134,7 +134,7 @@ class QueryHandler{ $interface->sendRawPacket($address, $port, $reply); break; default: - $this->debug("Unhandled packet from $address $port: 0x" . bin2hex($packet)); + $this->debug("Unhandled packet from $address $port: " . base64_encode($packet)); break; } } From 9f31b479e117487d1c2f61755a094a99de993197 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 6 Jun 2019 14:53:50 +0100 Subject: [PATCH 2/3] Improve stack trace rendering, show array and string lengths --- src/pocketmine/utils/Utils.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/utils/Utils.php b/src/pocketmine/utils/Utils.php index 5577c415a..6005c9f00 100644 --- a/src/pocketmine/utils/Utils.php +++ b/src/pocketmine/utils/Utils.php @@ -47,7 +47,6 @@ use function file; use function file_exists; use function file_get_contents; use function function_exists; -use function get_class; use function get_current_user; use function get_loaded_extensions; use function getenv; @@ -83,7 +82,6 @@ use function stripos; use function strlen; use function strpos; use function strtolower; -use function strval; use function substr; use function sys_get_temp_dir; use function trim; @@ -606,7 +604,16 @@ class Utils{ } $params = implode(", ", array_map(function($value){ - return (is_object($value) ? get_class($value) . " object" : gettype($value) . " " . (is_array($value) ? "Array()" : Utils::printable(@strval($value)))); + if(is_object($value)){ + return "object " . self::getNiceClassName($value); + } + if(is_array($value)){ + return "array[" . count($value) . "]"; + } + if(is_string($value)){ + return "string[" . strlen($value) . "] " . Utils::printable($value); + } + return gettype($value) . " " . Utils::printable((string) $value); }, $args)); } $messages[] = "#$i " . (isset($trace[$i]["file"]) ? self::cleanPath($trace[$i]["file"]) : "") . "(" . (isset($trace[$i]["line"]) ? $trace[$i]["line"] : "") . "): " . (isset($trace[$i]["class"]) ? $trace[$i]["class"] . (($trace[$i]["type"] === "dynamic" or $trace[$i]["type"] === "->") ? "->" : "::") : "") . $trace[$i]["function"] . "(" . Utils::printable($params) . ")"; From 0058bfcd2325d8a4384c1e8637fa7c37fafebd8e Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 6 Jun 2019 14:56:19 +0100 Subject: [PATCH 3/3] Utils: Limit length of printed stack trace strings to 80 characters --- src/pocketmine/utils/Utils.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/utils/Utils.php b/src/pocketmine/utils/Utils.php index 6005c9f00..ef2fb0d34 100644 --- a/src/pocketmine/utils/Utils.php +++ b/src/pocketmine/utils/Utils.php @@ -589,10 +589,11 @@ class Utils{ /** * @param array $trace + * @param int $maxStringLength * * @return array */ - public static function printableTrace(array $trace) : array{ + public static function printableTrace(array $trace, int $maxStringLength = 80) : array{ $messages = []; for($i = 0; isset($trace[$i]); ++$i){ $params = ""; @@ -603,7 +604,7 @@ class Utils{ $args = $trace[$i]["params"]; } - $params = implode(", ", array_map(function($value){ + $params = implode(", ", array_map(function($value) use($maxStringLength){ if(is_object($value)){ return "object " . self::getNiceClassName($value); } @@ -611,7 +612,7 @@ class Utils{ return "array[" . count($value) . "]"; } if(is_string($value)){ - return "string[" . strlen($value) . "] " . Utils::printable($value); + return "string[" . strlen($value) . "] " . substr(Utils::printable($value), 0, $maxStringLength); } return gettype($value) . " " . Utils::printable((string) $value); }, $args));