]> git.mxchange.org Git - hub.git/commitdiff
Added isValidFinalChunk()
authorRoland Häder <roland@mxchange.org>
Wed, 15 Feb 2012 22:06:57 +0000 (22:06 +0000)
committerRoland Häder <roland@mxchange.org>
Wed, 15 Feb 2012 22:06:57 +0000 (22:06 +0000)
application/hub/main/class_BaseHubSystem.php
application/hub/main/handler/chunks/class_ChunkHandler.php
application/hub/main/listener/class_BaseListener.php
application/hub/main/package/assembler/class_PackageAssembler.php

index ca002ebda6a727b153d792e9cfd32fed54f771f5..10f5cc3dff109e91f31ff7dc144b7383583238b8 100644 (file)
@@ -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.
index 1c753a32bb6a37f290dfbb7a739130dd6057a59b..100fab1a446ed9a892f0fb10009808e795950a01 100644 (file)
@@ -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
index e7de4c07a6794c1247afc2818630cb719e0dde8f..6b582191965c4e8d24dc158f1713339cef3e2449 100644 (file)
@@ -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...)
index 430ed71090ac35b22d74b6b03f05eaa2970faadc..f90f81c7a88fc311a109fb88082788640d84afb4 100644 (file)
@@ -22,7 +22,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-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