Network: Added RawPacketHandler interface, query handler is now a component

This commit is contained in:
Dylan K. Taylor
2019-03-24 18:02:19 +00:00
parent a753c1342d
commit 6990d6239e
5 changed files with 108 additions and 28 deletions

View File

@ -29,7 +29,9 @@ namespace pocketmine\network;
use pocketmine\event\server\NetworkInterfaceRegisterEvent;
use pocketmine\event\server\NetworkInterfaceUnregisterEvent;
use pocketmine\network\mcpe\protocol\PacketPool;
use function bin2hex;
use function get_class;
use function preg_match;
use function spl_object_id;
class Network{
@ -39,6 +41,9 @@ class Network{
/** @var AdvancedNetworkInterface[] */
private $advancedInterfaces = [];
/** @var RawPacketHandler[] */
private $rawPacketHandlers = [];
private $upload = 0;
private $download = 0;
@ -48,9 +53,13 @@ class Network{
/** @var NetworkSessionManager */
private $sessionManager;
public function __construct(){
/** @var \Logger */
private $logger;
public function __construct(\Logger $logger){
PacketPool::init();
$this->sessionManager = new NetworkSessionManager();
$this->logger = $logger;
}
public function addStatistics(float $upload, float $download) : void{
@ -181,9 +190,51 @@ class Network{
}
}
public function addRawPacketFilter(string $regex) : void{
/**
* Registers a raw packet handler on the network.
*
* @param RawPacketHandler $handler
*/
public function registerRawPacketHandler(RawPacketHandler $handler) : void{
$this->rawPacketHandlers[spl_object_id($handler)] = $handler;
$regex = $handler->getPattern();
foreach($this->advancedInterfaces as $interface){
$interface->addRawPacketFilter($regex);
}
}
/**
* Unregisters a previously-registered raw packet handler.
*
* @param RawPacketHandler $handler
*/
public function unregisterRawPacketHandler(RawPacketHandler $handler) : void{
unset($this->rawPacketHandlers[spl_object_id($handler)]);
}
/**
* @param AdvancedNetworkInterface $interface
* @param string $address
* @param int $port
* @param string $packet
*/
public function processRawPacket(AdvancedNetworkInterface $interface, string $address, int $port, string $packet) : void{
$handled = false;
foreach($this->rawPacketHandlers as $handler){
if(preg_match($handler->getPattern(), $packet) === 1){
$handled = true;
try{
$handler->handle($interface, $address, $port, $packet);
}catch(BadPacketException $e){
$this->logger->error("Bad raw packet from /$address:$port: " . $e->getMessage());
$this->blockAddress($address, 600);
break;
}
}
}
if(!$handled){
$this->logger->debug("Unhandled raw packet from /$address:$port: " . bin2hex($packet));
}
}
}