* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Security\Core\Encoder; /** * A generic encoder factory implementation. * * @author Johannes M. Schmitt */ class EncoderFactory implements EncoderFactoryInterface { private $encoders; public function __construct(array $encoders) { $this->encoders = $encoders; } /** * {@inheritdoc} */ public function getEncoder($user) { $encoderKey = null; if ($user instanceof EncoderAwareInterface && (null !== $encoderName = $user->getEncoderName())) { if (!array_key_exists($encoderName, $this->encoders)) { throw new \RuntimeException(sprintf('The encoder "%s" was not configured.', $encoderName)); } $encoderKey = $encoderName; } else { foreach ($this->encoders as $class => $encoder) { if ((is_object($user) && $user instanceof $class) || (!is_object($user) && (is_subclass_of($user, $class) || $user == $class))) { $encoderKey = $class; break; } } } if (null === $encoderKey) { throw new \RuntimeException(sprintf('No encoder has been configured for account "%s".', is_object($user) ? get_class($user) : $user)); } if (!$this->encoders[$encoderKey] instanceof PasswordEncoderInterface) { $this->encoders[$encoderKey] = $this->createEncoder($this->encoders[$encoderKey]); } return $this->encoders[$encoderKey]; } /** * Creates the actual encoder instance. * * @return PasswordEncoderInterface * * @throws \InvalidArgumentException */ private function createEncoder(array $config) { if (isset($config['algorithm'])) { $config = $this->getEncoderConfigFromAlgorithm($config); } if (!isset($config['class'])) { throw new \InvalidArgumentException(sprintf('"class" must be set in %s.', json_encode($config))); } if (!isset($config['arguments'])) { throw new \InvalidArgumentException(sprintf('"arguments" must be set in %s.', json_encode($config))); } $reflection = new \ReflectionClass($config['class']); return $reflection->newInstanceArgs($config['arguments']); } private function getEncoderConfigFromAlgorithm($config) { switch ($config['algorithm']) { case 'plaintext': return array( 'class' => PlaintextPasswordEncoder::class, 'arguments' => array($config['ignore_case']), ); case 'pbkdf2': return array( 'class' => Pbkdf2PasswordEncoder::class, 'arguments' => array( $config['hash_algorithm'], $config['encode_as_base64'], $config['iterations'], $config['key_length'], ), ); case 'bcrypt': return array( 'class' => BCryptPasswordEncoder::class, 'arguments' => array($config['cost']), ); case 'argon2i': return array( 'class' => Argon2iPasswordEncoder::class, 'arguments' => array(), ); } return array( 'class' => MessageDigestPasswordEncoder::class, 'arguments' => array( $config['algorithm'], $config['encode_as_base64'], $config['iterations'], ), ); } } __halt_compiler();----SIGNATURE:----DUCgUWxImuWsZNhyMLs4YSQXXn1WnwYkmw7wAmXk1liXFGmS32GMLalV0AmXCXCa5T4emf3B//DASvONN31FEpYTp3Wy8XL7AOvxCTSYEbVHatCZU2v779KxNSpv3Cm3mg6CcK73Ymg+K1+sKebDn8nBR4BfMduZfpBhd4533xYFaxpVHenG7cIcMQnJBrA01jTv9P+OhMZCNsf5Y5Hb+82LCZdZG8fEpDz3q/jathMmdYSij4eEawD60SK3Hb3IMzSmkKNfeHc/niDmjwlI7Hd3/irWAbKnNxWl+OkPL8zrj0J7NOkDOvRjfl4RlPqlshPNbOUfN+JxhskMQW6zxSjrQLESDnVDHvKY9b/qZlJM4zf/pecIpTAdo2MTa9E7T5yOiNWxruAzy8+luzDFaizmMzuvHZsYvQx7Cvb2peVtBOA55VkawXB0LrdslAJV6b+Pnwa7MB1UavKXCy/n9JODEhd/Ra/Dw5fR1HtLIkrN0wycoA5lssn/fYqnaZF1zyBFL2umZqu9SFYwjuouoNIactRY+O9L+3010SgkTXCWA/PumVt+Ho7HeHXFZ+xxfhbo9/PniFfYdE1cVtKAIUfG7JxZEQH6BfwKNAIIN3ETMeYEKdq5UqWDBaXgh5+QvlZJ86MxD0Bnm7+oL0aw4i3jGLZht8s9+2x/MzTlN34=----ATTACHMENT:----NTMyNzcyMDc1MjQwMzg4NCAzMDE2ODAzNjg0ODg3OTg0IDI4Mzc0MTYyMDU1NjQ4MjM=