123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- <?php
-
- /*
- * This file is part of the FOSUserBundle package.
- *
- * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
- namespace FOS\UserBundle\Util;
-
- use Symfony\Component\HttpKernel\Log\LoggerInterface;
-
- class TokenGenerator implements TokenGeneratorInterface
- {
- private $logger;
- private $useOpenSsl;
-
- public function __construct(LoggerInterface $logger = null)
- {
- $this->logger = $logger;
-
- // determine whether to use OpenSSL
- if (defined('PHP_WINDOWS_VERSION_BUILD') && version_compare(PHP_VERSION, '5.3.4', '<')) {
- $this->useOpenSsl = false;
- } elseif (!function_exists('openssl_random_pseudo_bytes')) {
- if (null !== $this->logger) {
- $this->logger->notice('It is recommended that you enable the "openssl" extension for random number generation.');
- }
- $this->useOpenSsl = false;
- } else {
- $this->useOpenSsl = true;
- }
- }
-
- public function generateToken()
- {
- return base_convert(bin2hex($this->getRandomNumber()), 16, 36);
- }
-
- private function getRandomNumber()
- {
- $nbBytes = 32;
-
- // try OpenSSL
- if ($this->useOpenSsl) {
- $bytes = openssl_random_pseudo_bytes($nbBytes, $strong);
-
- if (false !== $bytes && true === $strong) {
- return $bytes;
- }
-
- if (null !== $this->logger) {
- $this->logger->info('OpenSSL did not produce a secure random number.');
- }
- }
-
- return hash('sha256', uniqid(mt_rand(), true), true);
- }
- }
|