pmmp / PocketMine-MP

A server software for Minecraft: Bedrock Edition in PHP
https://pmmp.io
GNU Lesser General Public License v3.0
3.26k stars 1.54k forks source link

ModalFormResponse error #3113

Closed alvin0319 closed 5 years ago

alvin0319 commented 5 years ago

Issue description

When I send ModalFormRequestPacket to player, including input option, and sending a message that includes ",,".

Steps to reproduce the issue

  1. Send ModalFormRequestPacket to player, including input option.
  2. And I get this error by sending a message that includes ",, ".

OS and versions

Plugins

use pocketmine\plugin\PluginBase; use pocketmine\event\Listener; use pocketmine\event\player\PlayerJoinEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\network\mcpe\protocol\ModalFormRequestPacket; use pocketmine\network\mcpe\protocol\ModalFormResponsePacket;

class Main extends PluginBase implements Listener{

public function onEnable(){
    $this->getServer()->getPluginManager()->registerEvents($this, $this);
}

public function handlePlayerJoin(PlayerJoinEvent $event){
    $pk = new ModalFormRequestPacket();
    $pk->formId = 4632;
    $pk->formData = json_encode([
        "type" => "custom_form",
        "title" => "form_test",
        "content" => [
            [
                "type" => "input",
                "text" => "input message"
            ]
        ]
    ]);

    $event->getPlayer()->sendDataPacket($pk);
}

public function handleReceivePacket(DataPacketReceiveEvent $event){
    $pk = $event->getPacket();
    $player = $event->getPlayer();
    if($pk instanceof ModalFormResponsePacket){
        if($pk->formId === 4632){
            $player->sendMessage("You input text: " . json_decode($pk->formData, true)[0]);
        }
    }
}

}


### Crashdump, backtrace or other files
<!--- Submit crashdumps at https://crash.pmmp.io and paste a link -->
<!--- Use gist or anything else to add other files and add links here -->

[03:10:31] [Server thread/CRITICAL]: InvalidArgumentException: "Failed to fix JSON: Syntax error(original: ["Hello,, PocketMine"] , modified: ["Hello,"",PocketMine"])" (EXCEPTION) in "src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter" at line 284 [03:10:31] [Server thread/DEBUG]: #0 src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter(260): pocketmine\network\mcpe\PlayerNetworkSessionAdapter::stupid_json_decode(string[23] ["Hello,, PocketMine"]., boolean 1) [03:10:31] [Server thread/DEBUG]: #1 src/pocketmine/network/mcpe/protocol/ModalFormResponsePacket(49): pocketmine\network\mcpe\PlayerNetworkSessionAdapter->handleModalFormResponse(object pocketmine\network\mcpe\protocol\ModalFormResponsePacket) [03:10:31] [Server thread/DEBUG]: #2 src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter(110): pocketmine\network\mcpe\protocol\ModalFormResponsePacket->handle(object pocketmine\network\mcpe\PlayerNetworkSessionAdapter) [03:10:31] [Server thread/DEBUG]: #3 src/pocketmine/network/mcpe/protocol/BatchPacket(123): pocketmine\network\mcpe\PlayerNetworkSessionAdapter->handleDataPacket(object pocketmine\network\mcpe\protocol\ModalFormResponsePacket) [03:10:31] [Server thread/DEBUG]: #4 src/pocketmine/network/mcpe/PlayerNetworkSessionAdapter(110): pocketmine\network\mcpe\protocol\BatchPacket->handle(object pocketmine\network\mcpe\PlayerNetworkSessionAdapter) [03:10:31] [Server thread/DEBUG]: #5 src/pocketmine/Player(3126): pocketmine\network\mcpe\PlayerNetworkSessionAdapter->handleDataPacket(object pocketmine\network\mcpe\protocol\BatchPacket) [03:10:31] [Server thread/DEBUG]: #6 src/pocketmine/network/mcpe/RakLibInterface(169): pocketmine\Player->handleDataPacket(object pocketmine\network\mcpe\protocol\BatchPacket) [03:10:31] [Server thread/DEBUG]: #7 vendor/pocketmine/raklib/src/server/ServerHandler(99): pocketmine\network\mcpe\RakLibInterface->handleEncapsulated(string[19] 1.248.194.194 58601, object raklib\protocol\EncapsulatedPacket, integer 0) [03:10:31] [Server thread/DEBUG]: #8 src/pocketmine/network/mcpe/RakLibInterface(109): raklib\server\ServerHandler->handlePacket() [03:10:31] [Server thread/DEBUG]: #9 src/pocketmine/network/mcpe/RakLibInterface(99): pocketmine\network\mcpe\RakLibInterface->process() [03:10:31] [Server thread/DEBUG]: #10 vendor/pocketmine/snooze/src/SleeperHandler(123): pocketmine\network\mcpe\RakLibInterface->pocketmine\network\mcpe{closure}() [03:10:31] [Server thread/DEBUG]: #11 vendor/pocketmine/snooze/src/SleeperHandler(85): pocketmine\snooze\SleeperHandler->processNotifications() [03:10:31] [Server thread/DEBUG]: #12 src/pocketmine/Server(2348): pocketmine\snooze\SleeperHandler->sleepUntil(double 1567581031.4027) [03:10:31] [Server thread/DEBUG]: #13 src/pocketmine/Server(2205): pocketmine\Server->tickProcessor() [03:10:31] [Server thread/DEBUG]: #14 src/pocketmine/Server(1784): pocketmine\Server->start() [03:10:31] [Server thread/DEBUG]: #15 src/pocketmine/PocketMine(274): pocketmine\Server->__construct(object BaseClassLoader, object pocketmine\utils\MainLogger, string[10] /root/net/, string[18] /root/net/plugins/)

dktapps commented 5 years ago

out of the gate you should not be using packets. PM has an API to allow the necessary preprocessing for bugs like this to be fixed. If you use packets it's not possible for us to introduce workarounds for any client issues you run into.

dktapps commented 5 years ago

The regex used allows an empty leading group unconditionally. This permits double commas inside quotes to be used as split points. I'm unsure how to fix this at the current time.