merged branch asm89/fix-security-encoder-factory (PR #4604)

Commits
-------

0be11f4 [Security] Fix retrieval of encoder when configured for concrete classes
024cb91 [Security] Add failing testcases for EncoderFactory

Discussion
----------

Fix security encoder factory

Bug fix: yes
Feature addition: no
Backwards compatibility break: no
Symfony2 tests pass: [![Build Status](https://secure.travis-ci.org/asm89/symfony.png?branch=fix-security-encoder-factory)](http://travis-ci.org/asm89/symfony)
License of the code: MIT

This PR adds two testcases + a fix for the retrieval of an encoder from the `EncoderFactory`.

---------------------------------------------------------------------------

by travisbot at 2012-06-18T10:22:40Z

This pull request [fails](http://travis-ci.org/symfony/symfony/builds/1645765) (merged 0be11f4d into 0b8b76bf).

---------------------------------------------------------------------------

by asm89 at 2012-06-18T10:42:58Z

@fabpot One testcase fails on PHP 5.3.3, but I'm not sure why. Any clues?
This commit is contained in:
Fabien Potencier 2012-06-18 13:58:48 +02:00
commit 817aa5721f
2 changed files with 24 additions and 1 deletions

View File

@ -33,7 +33,7 @@ class EncoderFactory implements EncoderFactoryInterface
public function getEncoder($user)
{
foreach ($this->encoders as $class => $encoder) {
if ((is_object($user) && !$user instanceof $class) || (!is_subclass_of($user, $class) && $user != $class)) {
if ((is_object($user) && !$user instanceof $class) || (!is_object($user) && !is_subclass_of($user, $class) && $user != $class)) {
continue;
}

View File

@ -55,6 +55,29 @@ class EncoderFactoryTest extends \PHPUnit_Framework_TestCase
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
$encoder = $factory->getEncoder('Symfony\Component\Security\Core\User\User');
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
}
public function testGetEncoderConfiguredForConcreteClassWithService()
{
$factory = new EncoderFactory(array(
'Symfony\Component\Security\Core\User\User' => new MessageDigestPasswordEncoder('sha1'),
));
$encoder = $factory->getEncoder(new User('user', 'pass'));
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
}
public function testGetEncoderConfiguredForConcreteClassWithClassName()
{
$factory = new EncoderFactory(array(
'Symfony\Component\Security\Core\User\User' => new MessageDigestPasswordEncoder('sha1'),
));
$encoder = $factory->getEncoder('Symfony\Component\Security\Core\User\User');
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));