From dc9ec3db8ff81913af09993ec6b463aa7b839257 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Roland=20H=C3=A4der?= <roland@mxchange.org>
Date: Sun, 26 Aug 2012 21:46:00 +0000
Subject: [PATCH] Refactured random string generation to introduced method
 generateRamdomString()

---
 .../hub/main/nodes/class_BaseHubNode.php      | 62 +++++++++++--------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/application/hub/main/nodes/class_BaseHubNode.php b/application/hub/main/nodes/class_BaseHubNode.php
index d1f251a7a..a89050de7 100644
--- a/application/hub/main/nodes/class_BaseHubNode.php
+++ b/application/hub/main/nodes/class_BaseHubNode.php
@@ -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');
-- 
2.39.5