]> git.mxchange.org Git - hub.git/blobdiff - application/hub/main/nodes/class_BaseHubNode.php
Field answer_status becomes more generic now
[hub.git] / application / hub / main / nodes / class_BaseHubNode.php
index d1f251a7a5fbe07779daa3ec5a195a68cc966c14..1dca6472acb233e396c83f8dd0aaddc78cacae61 100644 (file)
@@ -77,6 +77,12 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                // Call parent constructor
                parent::__construct($className);
 
+               // Get a crypto instance
+               $cryptoInstance = ObjectFactory::createObjectByConfiguredName('crypto_class');
+
+               // Set it here
+               $this->setCryptoInstance($cryptoInstance);
+
                // Init state which sets the state to 'init'
                $this->initState();
        }
@@ -94,6 +100,28 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                NodeStateFactory::createNodeStateInstanceByName('init', $this);
        }
 
+       /**
+        * Generates a random string from various data inluding UUID if PECL
+        * extension uuid is installed.
+        *
+        * @param       $length                 Length of the random part
+        * @return      $randomString   Random string
+        * @todo        Make this code more generic and move it to CryptoHelper or
+        */
+       protected function generateRamdomString ($length) {
+               // Get an RNG instance
+               $rngInstance = ObjectFactory::createObjectByConfiguredName('rng_class');
+
+               // Generate a pseudo-random string
+               $randomString = $rngInstance->randomString($length) . ':' . $this->getBootIpPort() . ':' . $this->getRequestInstance()->getRequestElement('mode');
+
+               // Add UUID for even more entropy for the hasher
+               $randomString .= $this->getCryptoInstance()->createUuid();
+
+               // Return it
+               return $randomString;
+       }
+
        /**
         * Generates a private key and hashes it (for speeding up things)
         *
@@ -101,18 +129,12 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         * @return void
         */
        private function generatePrivateKeyAndHash (LocalSearchCriteria $searchInstance) {
-               // Get an RNG instance (Random Number Generator)
-               $rngInstance = ObjectFactory::createObjectByConfiguredName('rng_class');
-
                // Generate a pseudo-random string
-               $randomString = $rngInstance->randomString(255) . ':' . $this->getBootIpPort()  . ':' . $this->getRequestInstance()->getRequestElement('mode');
-
-               // Get a crypto instance
-               $cryptoInstance = ObjectFactory::createObjectByConfiguredName('crypto_class');
+               $randomString = $this->generateRandomString(255);
 
                // Hash and encrypt the string so we become a node id (also documented as "hub id")
-               $this->setPrivateKey($cryptoInstance->encryptString($randomString));
-               $this->setPrivateKeyHash($cryptoInstance->hashString($this->getPrivateKey()));
+               $this->setPrivateKey($this->getCryptoInstance()->encryptString($randomString));
+               $this->setPrivateKeyHash($this->getCryptoInstance()->hashString($this->getPrivateKey()));
 
                // Get a wrapper instance
                $wrapperInstance = ObjectFactory::createObjectByConfiguredName('node_info_db_wrapper_class');
@@ -277,17 +299,11 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                        // Output message
                        self::createDebugInstance(__CLASS__)->debugOutput('BOOTSTRAP: Re-using found node-id: ' . $this->getNodeId() . '');
                } else {
-                       // Get an RNG instance (Random Number Generator)
-                       $rngInstance = ObjectFactory::createObjectByConfiguredName('rng_class');
-
                        // Generate a pseudo-random string
-                       $randomString = $rngInstance->randomString(255) . ':' . $this->getBootIpPort()  . ':' . $this->getRequestInstance()->getRequestElement('mode');
-
-                       // Get a crypto instance
-                       $cryptoInstance = ObjectFactory::createObjectByConfiguredName('crypto_class');
+                       $randomString = $this->generateRandomString(255);
 
                        // Hash and encrypt the string so we become a node id (also documented as "hub id")
-                       $this->setNodeId($cryptoInstance->hashString($cryptoInstance->encryptString($randomString)));
+                       $this->setNodeId($this->getCryptoInstance()->hashString($this->getCryptoInstance()->encryptString($randomString)));
 
                        // Register the node id with our wrapper
                        $wrapperInstance->registerNodeId($this, $this->getRequestInstance());
@@ -311,17 +327,11 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
                $searchInstance->addCriteria(NodeInformationDatabaseWrapper::DB_COLUMN_NODE_TYPE, $this->getRequestInstance()->getRequestElement('mode'));
                $searchInstance->setLimit(1);
 
-               // Get an RNG instance
-               $rngInstance = ObjectFactory::createObjectByConfiguredName('rng_class');
-
-               // Generate a pseudo-random string
-               $randomString = $rngInstance->randomString(255) . ':' . $this->getBootIpPort() . ':' . $this->getRequestInstance()->getRequestElement('mode');
-
-               // Get a crypto instance
-               $cryptoInstance = ObjectFactory::createObjectByConfiguredName('crypto_class');
+               // Get a random string
+               $randomString = $this->generateRamdomString(255);
 
                // Hash and encrypt the string so we become a "node id" aka Hub-Id
-               $this->setSessionId($cryptoInstance->hashString($cryptoInstance->encryptString($randomString)));
+               $this->setSessionId($this->getCryptoInstance()->hashString($this->getCryptoInstance()->encryptString($randomString)));
 
                // Get a wrapper instance
                $wrapperInstance = ObjectFactory::createObjectByConfiguredName('node_info_db_wrapper_class');
@@ -719,13 +729,39 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         * @todo        Add checking if this node has been announced to the sender node
         */
        public function ifNodeHasAnnounced () {
+               // Debug message
+               /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NODE: ifNodeHasAnnounced(): state=' . $this->getStateInstance()->getStateName());
+
                // Simply check the state of this node
                $hasAnnounced = ($this->getStateInstance() instanceof NodeAnnouncedState);
 
+               // Debug message
+               /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NODE: ifNodeHasAnnounced(): hasAnnounced=' . intval($hasAnnounced));
+
                // Return it
                return $hasAnnounced;
        }
 
+       /**
+        * Checks whether this node has attempted to announce itself and completed it
+        *
+        * @return      $hasAnnouncementCompleted       Whether this node has attempted to announce itself and completed it
+        * @todo        Add checking if this node has been announced to the sender node
+        */
+       public function ifNodeHasAnnouncementCompleted () {
+               // Debug message
+               /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NODE: ifNodeHasAnnouncementCompleted(): state=' . $this->getStateInstance()->getStateName());
+
+               // Simply check the state of this node
+               $hasAnnouncementCompleted = ($this->getStateInstance() instanceof NodeAnnouncementCompletedState);
+
+               // Debug message
+               /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NODE: ifNodeHasAnnouncementCompleted(): hasAnnouncementCompleted=' . intval($hasAnnouncementCompleted));
+
+               // Return it
+               return $hasAnnouncementCompleted;
+       }
+
        /**
         * Enables whether this node accepts announcements
         *
@@ -790,8 +826,11 @@ class BaseHubNode extends BaseHubSystem implements Updateable {
         * @todo        Handle thrown exception
         */
        public function handleAnswerStatusByMessageData (array $messageData, Receivable $packageInstance) {
+               // Is it not empty?
+               assert(!empty($messageData[NetworkPackage::MESSAGE_DATA_ANSWER_STATUS]));
+
                // Construct configuration entry for handling class' name
-               $classConfigEntry = strtolower($messageData[NetworkPackage::MESSAGE_ARRAY_TYPE] . '_status_' . $messageData[XmlAnnouncementAnswerTemplateEngine::ANNOUNCEMENT_DATA_ANSWER_STATUS]) . '_handler_class';
+               $classConfigEntry = strtolower($messageData[NetworkPackage::MESSAGE_ARRAY_TYPE] . '_status_' . $messageData[NetworkPackage::MESSAGE_DATA_ANSWER_STATUS]) . '_handler_class';
 
                // Try to get a class
                $handlerInstance = ObjectFactory::createObjectByConfiguredName($classConfigEntry);