From 4c044e86e66bf2e87f888be1bcf2f2d06cac5856 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Sat, 22 May 2010 17:21:36 +0000 Subject: [PATCH] Added some basic checks on received TCP packages --- .../class_BaseNetworkPackageHandler.php | 2 + .../tcp/class_TcpNetworkPackageHandler.php | 43 +++++++++++++++++-- .../network/class_NetworkStateResolver.php | 2 +- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/application/hub/main/handler/network/class_BaseNetworkPackageHandler.php b/application/hub/main/handler/network/class_BaseNetworkPackageHandler.php index 8b3e847dd..5416504df 100644 --- a/application/hub/main/handler/network/class_BaseNetworkPackageHandler.php +++ b/application/hub/main/handler/network/class_BaseNetworkPackageHandler.php @@ -28,6 +28,8 @@ class BaseNetworkPackageHandler extends BaseHandler { const SOCKET_ERROR_UNHANDLED = 'unhandled_package'; const SOCKET_ERROR_EMPTY_DATA = 'empty_data'; const PACKAGE_ERROR_INVALID_DATA = 'invalid_data'; + const PACKAGE_ERROR_INCOMPLETE_DATA = 'incomplete_data'; + const PACKAGE_ERROR_INVALID_CONTENT = 'invalid_content'; const PACKAGE_LEVEL_CHECK_OKAY = 'checked_package'; /** diff --git a/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php b/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php index 6e8cef5a1..2d634cc3a 100644 --- a/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php +++ b/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php @@ -51,6 +51,35 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw return $handlerInstance; } + /** + * Verifies the package data itself (only rudymentary check) + * + * @param $rawData Raw package data (as string + * @return $isValid Wether the package data is valid + */ + private function isPackageDataValid ($rawData) { + // Default is not valid + $isValid = false; + + // Convert it back into an array + $packageData = explode(NetworkPackage::PACKAGE_DATA_SEPERATOR, $rawData); + + // This should be at least three entries: sender|recipient|raw data + if (count($packageData) < 3) { + // Not enougth fields in $packageData! + $this->setErrorCode(self::PACKAGE_ERROR_INCOMPLETE_DATA); + } elseif (count(explode(NetworkPackage::PACKAGE_MASK_SEPERATOR, $packageData[2])) < 2) { + // Not entougth fields in content + $this->setErrorCode(self::PACKAGE_ERROR_INVALID_CONTENT); + } else { + // This check went fine... + $isValid = true; + } + + // Return the result + return $isValid; + } + /** * Processes a package from given resource. This is mostly useful for TCP * package handling and is implemented in the TcpListener class @@ -67,6 +96,9 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw throw new InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE); } // END - if + // Init package data array + $packageData = array(); + // Reset error code to unhandled $this->setErrorCode(self::SOCKET_ERROR_UNHANDLED); @@ -85,15 +117,18 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw $this->setErrorCode(self::SOCKET_ERROR_EMPTY_DATA); } elseif (!$this->isPackageDataValid($rawData)) { // Invalid package data - $this->setErrorCode(self::PACKAGE_ERROR_INVALID_DATA); + if ($this->getErrorCode() == self::SOCKET_ERROR_UNHANDLED) { + // Set it to PACKAGE_ERROR_INVALID_DATA, because SOCKET_ERROR_UNHANDLED should not be used + $this->setErrorCode(self::PACKAGE_ERROR_INVALID_DATA); + } // END - if } else { + // Prepare the package data + $packageData = explode(NetworkPackage::PACKAGE_DATA_SEPERATOR, $rawData); + // Low-level checks are all green $this->setErrorCode(self::PACKAGE_LEVEL_CHECK_OKAY); } - // Prepare the package data - $packageData = explode(NetworkPackage::PACKAGE_DATA_SEPERATOR, $rawData); - // Get a state from the resolver for this package $stateInstance = $this->getResolverInstance()->resolveStateByPackage($this, $packageData); die('UNFINISHED:'.$stateInstance->__toString()); diff --git a/application/hub/main/resolver/state/network/class_NetworkStateResolver.php b/application/hub/main/resolver/state/network/class_NetworkStateResolver.php index 60ef2ec3b..cd314f033 100644 --- a/application/hub/main/resolver/state/network/class_NetworkStateResolver.php +++ b/application/hub/main/resolver/state/network/class_NetworkStateResolver.php @@ -88,7 +88,7 @@ class NetworkStateResolver extends BaseStateResolver implements StateResolver { // @TODO We need to somehow detect the state/status of the remote peer and still maintain good speed. // @TODO So maybe some pre-instancing of classes might help here to speedup this I/O intensive process. - $this->partialStub('errorCode=' . $errorCode . ',rawData[] = ' . gettype($rawData) . '(' . count($rawData) . ')'); + $this->partialStub('errorCode=' . $errorCode . ',packageData[] = ' . gettype($packageData) . '(' . count($packageData) . ')'); // Return the prepared instance return $stateInstance; -- 2.39.2