mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-04 17:20:02 +00:00
InGamePacketHandler: removed obsolete workaround
This commit is contained in:
parent
c02bead12b
commit
3baa5ab712
@ -112,7 +112,6 @@ use function array_push;
|
|||||||
use function base64_encode;
|
use function base64_encode;
|
||||||
use function count;
|
use function count;
|
||||||
use function fmod;
|
use function fmod;
|
||||||
use function implode;
|
|
||||||
use function in_array;
|
use function in_array;
|
||||||
use function is_bool;
|
use function is_bool;
|
||||||
use function is_infinite;
|
use function is_infinite;
|
||||||
@ -122,12 +121,9 @@ use function json_encode;
|
|||||||
use function max;
|
use function max;
|
||||||
use function mb_strlen;
|
use function mb_strlen;
|
||||||
use function microtime;
|
use function microtime;
|
||||||
use function preg_match;
|
|
||||||
use function sprintf;
|
use function sprintf;
|
||||||
use function strlen;
|
use function strlen;
|
||||||
use function strpos;
|
use function strpos;
|
||||||
use function substr;
|
|
||||||
use function trim;
|
|
||||||
use const JSON_THROW_ON_ERROR;
|
use const JSON_THROW_ON_ERROR;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -875,60 +871,17 @@ class InGamePacketHandler extends PacketHandler{
|
|||||||
//TODO: make APIs for this to allow plugins to use this information
|
//TODO: make APIs for this to allow plugins to use this information
|
||||||
return $this->player->onFormSubmit($packet->formId, null);
|
return $this->player->onFormSubmit($packet->formId, null);
|
||||||
}elseif($packet->formData !== null){
|
}elseif($packet->formData !== null){
|
||||||
return $this->player->onFormSubmit($packet->formId, self::stupid_json_decode($packet->formData, true));
|
try{
|
||||||
|
$responseData = json_decode($packet->formData, true, self::MAX_FORM_RESPONSE_DEPTH, JSON_THROW_ON_ERROR);
|
||||||
|
}catch(\JsonException $e){
|
||||||
|
throw PacketHandlingException::wrap($e, "Failed to decode form response data");
|
||||||
|
}
|
||||||
|
return $this->player->onFormSubmit($packet->formId, $responseData);
|
||||||
}else{
|
}else{
|
||||||
throw new PacketHandlingException("Expected either formData or cancelReason to be set in ModalFormResponsePacket");
|
throw new PacketHandlingException("Expected either formData or cancelReason to be set in ModalFormResponsePacket");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Hack to work around a stupid bug in Minecraft W10 which causes empty strings to be sent unquoted in form responses.
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
* @throws PacketHandlingException
|
|
||||||
*/
|
|
||||||
private static function stupid_json_decode(string $json, bool $assoc = false){
|
|
||||||
if(preg_match('/^\[(.+)\]$/s', $json, $matches) > 0){
|
|
||||||
$raw = $matches[1];
|
|
||||||
$lastComma = -1;
|
|
||||||
$newParts = [];
|
|
||||||
$inQuotes = false;
|
|
||||||
for($i = 0, $len = strlen($raw); $i <= $len; ++$i){
|
|
||||||
if($i === $len || ($raw[$i] === "," && !$inQuotes)){
|
|
||||||
$part = substr($raw, $lastComma + 1, $i - ($lastComma + 1));
|
|
||||||
if(trim($part) === ""){ //regular parts will have quotes or something else that makes them non-empty
|
|
||||||
$part = '""';
|
|
||||||
}
|
|
||||||
$newParts[] = $part;
|
|
||||||
$lastComma = $i;
|
|
||||||
}elseif($raw[$i] === '"'){
|
|
||||||
if(!$inQuotes){
|
|
||||||
$inQuotes = true;
|
|
||||||
}else{
|
|
||||||
$backslashes = 0;
|
|
||||||
for(; $backslashes < $i && $raw[$i - $backslashes - 1] === "\\"; ++$backslashes){}
|
|
||||||
if(($backslashes % 2) === 0){ //unescaped quote
|
|
||||||
$inQuotes = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$fixed = "[" . implode(",", $newParts) . "]";
|
|
||||||
try{
|
|
||||||
return json_decode($fixed, $assoc, self::MAX_FORM_RESPONSE_DEPTH, JSON_THROW_ON_ERROR);
|
|
||||||
}catch(\JsonException $e){
|
|
||||||
throw PacketHandlingException::wrap($e, "Failed to fix JSON (original: $json, modified: $fixed)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try{
|
|
||||||
return json_decode($json, $assoc, self::MAX_FORM_RESPONSE_DEPTH, JSON_THROW_ON_ERROR);
|
|
||||||
}catch(\JsonException $e){
|
|
||||||
throw PacketHandlingException::wrap($e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function handleServerSettingsRequest(ServerSettingsRequestPacket $packet) : bool{
|
public function handleServerSettingsRequest(ServerSettingsRequestPacket $packet) : bool{
|
||||||
return false; //TODO: GUI stuff
|
return false; //TODO: GUI stuff
|
||||||
}
|
}
|
||||||
|
@ -1,68 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* ____ _ _ __ __ _ __ __ ____
|
|
||||||
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
|
||||||
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
|
||||||
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
|
||||||
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* @author PocketMine Team
|
|
||||||
* @link http://www.pocketmine.net/
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace pocketmine\network\mcpe\handler;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
class StupidJsonDecodeTest extends TestCase{
|
|
||||||
/**
|
|
||||||
* @var \Closure
|
|
||||||
* @phpstan-var \Closure(string $json, bool $assoc=) : mixed
|
|
||||||
*/
|
|
||||||
private $stupidJsonDecodeFunc;
|
|
||||||
|
|
||||||
public function setUp() : void{
|
|
||||||
$this->stupidJsonDecodeFunc = (new \ReflectionMethod(InGamePacketHandler::class, 'stupid_json_decode'))->getClosure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return mixed[][]
|
|
||||||
* @phpstan-return list<array{string,mixed}>
|
|
||||||
*/
|
|
||||||
public function stupidJsonDecodeProvider() : array{
|
|
||||||
return [
|
|
||||||
["[\n \"a\",\"b,c,d,e\\\" \",,0,1,2, false, 0.001]", ['a', 'b,c,d,e" ', '', 0, 1, 2, false, 0.001]],
|
|
||||||
["0", 0],
|
|
||||||
["false", false],
|
|
||||||
["null", null],
|
|
||||||
['["\",,\"word","a\",,\"word2",]', ['",,"word', 'a",,"word2', '']],
|
|
||||||
['["\",,\"word","a\",,\"word2",""]', ['",,"word', 'a",,"word2', '']],
|
|
||||||
['["Hello,, PocketMine"]', ['Hello,, PocketMine']],
|
|
||||||
['[,]', ['', '']],
|
|
||||||
['[]', []]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider stupidJsonDecodeProvider
|
|
||||||
*
|
|
||||||
* @param mixed $expect
|
|
||||||
*
|
|
||||||
* @throws \ReflectionException
|
|
||||||
*/
|
|
||||||
public function testStupidJsonDecode(string $brokenJson, $expect) : void{
|
|
||||||
$decoded = ($this->stupidJsonDecodeFunc)($brokenJson, true);
|
|
||||||
self::assertEquals($expect, $decoded);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user