From: Roland Häder <roland@mxchange.org>
Date: Sat, 22 May 2010 17:21:36 +0000 (+0000)
Subject: Added some basic checks on received TCP packages
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=4c044e86e66bf2e87f888be1bcf2f2d06cac5856;p=hub.git

Added some basic checks on received TCP packages
---

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;