Fixed bug #9852: Feature: Provide a random byte generator in TYPO3 Core
authorDmitry Dulepov <dmitry.dulepov@gmail.com>
Tue, 2 Dec 2008 08:59:21 +0000 (08:59 +0000)
committerDmitry Dulepov <dmitry.dulepov@gmail.com>
Tue, 2 Dec 2008 08:59:21 +0000 (08:59 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@4520 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/class.t3lib_div.php

index 79549b5..c2d28b9 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-12-02  Dmitry Dulepov  <dmitry@typo3.org>
+
+       * Fixed bug #9852: Feature: Provide a random byte generator in TYPO3 Core (thanks to Marcus Crause)
+
 2008-12-01  Dmitry Dulepov  <dmitry@typo3.org>
 
        * Fixed bug #9645: Memcached backend is not working properly
index dc27ce4..a1b336e 100755 (executable)
@@ -1508,7 +1508,33 @@ final class t3lib_div {
                return strtr((string)$str, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
        }
 
+       /**
+        * Returns a string of highly randomized bytes (over the full 8-bit range).
+        *
+        * @copyright  Drupal CMS
+        * @license    GNU General Public License version 2
+        * @param   integer  Number of characters (bytes) to return
+        * @return  string   Random Bytes
+        */
+       public static function generateRandomBytes($count)  {
+                       // /dev/urandom is available on many *nix systems and is considered
+                       // the best commonly available pseudo-random source.
+               if (TYPO3_OS != 'WIN' && ($fh = @fopen('/dev/urandom', 'rb'))) {
+                       $output = fread($fh, $count);
+                       fclose($fh);
+               }
 
+                       // fallback if /dev/urandom is not available
+               if (!isset($output{$count - 1})) {
+                       $randomState = getmypid();
+                       while (!isset($output{$count - 1})) {
+                               $randomState = md5(microtime() . mt_rand() . $randomState);
+                               $output .= md5(mt_rand() . $randomState, true);
+                       }
+                       $output = substr($output, strlen($output) - $count, $count);
+               }
+               return $output;
+       }
 
 
 
@@ -4494,7 +4520,7 @@ final class t3lib_div {
                        }
                } else {        // Function
                        if (function_exists($funcRef))  {
-                               $content = call_user_func_array($funcRef, array(&$params, &$ref));
+                               $content = call_user_func_array($funcRef, array(&$params, &$ref));
                        } else {
                                $errorMsg = "<strong>ERROR:</strong> No function named: ".$funcRef;
                                if ($errorMode == 2) {