From 13b224d037dcadc6dbb3f583638fecb4a29d378e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Wed, 15 Feb 2012 22:06:57 +0000 Subject: [PATCH] Added isValidFinalChunk() --- application/hub/main/class_BaseHubSystem.php | 23 +++++++++++++++++++ .../handler/chunks/class_ChunkHandler.php | 2 +- .../hub/main/listener/class_BaseListener.php | 1 + .../assembler/class_PackageAssembler.php | 4 ++-- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/application/hub/main/class_BaseHubSystem.php b/application/hub/main/class_BaseHubSystem.php index ca002ebda..10f5cc3df 100644 --- a/application/hub/main/class_BaseHubSystem.php +++ b/application/hub/main/class_BaseHubSystem.php @@ -275,6 +275,29 @@ class BaseHubSystem extends BaseFrameworkSystem { socket_clear_error($socketResource); } + /** + * Checks whether the final (last) chunk is valid + * + * @param $chunks An array with chunks and (hopefully) a valid final chunk + * @return $isValid Whether the final (last) chunk is valid + */ + protected function isValidFinalChunk (array $chunks) { + // Default is all fine + $isValid = true; + + // Validate final chunk + if (substr($chunks[count($chunks) - 1], 0, strlen(PackageFragmenter::END_OF_PACKAGE_IDENTIFIER)) != PackageFragmenter::END_OF_PACKAGE_IDENTIFIER) { + // Not fine + $isValid = false; + } elseif (substr_count($chunks[count($chunks) - 1], PackageFragmenter::CHUNK_HASH_SEPARATOR) != 1) { + // CHUNK_HASH_SEPARATOR shall only be found once + $isValid = false; + } + + // Return status + return $isValid; + } + /** * Translates socket error codes into our own internal names which can be * used for call-backs. diff --git a/application/hub/main/handler/chunks/class_ChunkHandler.php b/application/hub/main/handler/chunks/class_ChunkHandler.php index 1c753a32b..100fab1a4 100644 --- a/application/hub/main/handler/chunks/class_ChunkHandler.php +++ b/application/hub/main/handler/chunks/class_ChunkHandler.php @@ -57,7 +57,7 @@ class ChunkHandler extends BaseHandler implements Registerable { */ public function addAllChunksWithFinal (array $chunks) { // Validate final chunk - if (substr($chunks[count($chunks) - 1], 0, strlen(PackageFragmenter::END_OF_PACKAGE_IDENTIFIER)) != PackageFragmenter::END_OF_PACKAGE_IDENTIFIER) { + if (!$this->isValidFinalChunk($chunks)) { // Last chunk is not valid throw new FinalChunkVerificationException(array($this, $chunks), BaseListener::EXCEPTION_FINAL_CHUNK_VERIFICATION); } // END - if diff --git a/application/hub/main/listener/class_BaseListener.php b/application/hub/main/listener/class_BaseListener.php index e7de4c07a..6b5821919 100644 --- a/application/hub/main/listener/class_BaseListener.php +++ b/application/hub/main/listener/class_BaseListener.php @@ -30,6 +30,7 @@ class BaseListener extends BaseHubSystem implements Visitable { const EXCEPTION_CONNECTION_ALREADY_REGISTERED = 0xa04; const EXCEPTION_UNEXPECTED_PACKAGE_STATUS = 0xa05; const EXCEPTION_UNSUPPORTED_PACKAGE_CODE_HANDLER = 0xa06; + const EXCEPTION_FINAL_CHUNK_VERIFICATION = 0xa07; /** * Used protocol (Default: invalid, which is indeed invalid...) diff --git a/application/hub/main/package/assembler/class_PackageAssembler.php b/application/hub/main/package/assembler/class_PackageAssembler.php index 430ed7109..f90f81c7a 100644 --- a/application/hub/main/package/assembler/class_PackageAssembler.php +++ b/application/hub/main/package/assembler/class_PackageAssembler.php @@ -22,7 +22,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class PackageAssembler extends BaseFrameworkSystem implements Assembler, Registerable { +class PackageAssembler extends BaseHubSystem implements Assembler, Registerable { /** * Protected constructor * @@ -99,7 +99,7 @@ class PackageAssembler extends BaseFrameworkSystem implements Assembler, Registe $chunks = explode(PackageFragmenter::CHUNK_SEPARATOR, $packageContent[BaseRawDataHandler::PACKAGE_DECODED_DATA]); // Validate final chunk - if (substr($chunks[count($chunks) - 1], 0, strlen(PackageFragmenter::END_OF_PACKAGE_IDENTIFIER)) != PackageFragmenter::END_OF_PACKAGE_IDENTIFIER) { + if (!$this->isValidFinalChunk($chunks)) { // Last chunk is not valid throw new FinalChunkVerificationException(array($this, $chunks), BaseListener::EXCEPTION_FINAL_CHUNK_VERIFICATION); } // END - if -- 2.39.5