Merge branch '3.2' into 3.3
* 3.2: [DI] Handle root namespace in service definitions Use rawurlencode() to transform the Cookie into a string [Security] Fix authentication.failure event not dispatched on AccountStatusException
This commit is contained in:
commit
6b5d35f058
@ -62,7 +62,7 @@ class Cookie
|
||||
$this->rawValue = $value;
|
||||
} else {
|
||||
$this->value = $value;
|
||||
$this->rawValue = urlencode($value);
|
||||
$this->rawValue = rawurlencode($value);
|
||||
}
|
||||
$this->name = $name;
|
||||
$this->path = empty($path) ? '/' : $path;
|
||||
|
@ -16,6 +16,21 @@ use Symfony\Component\BrowserKit\Cookie;
|
||||
|
||||
class CookieTest extends TestCase
|
||||
{
|
||||
public function testToString()
|
||||
{
|
||||
$cookie = new Cookie('foo', 'bar', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
|
||||
$this->assertEquals('foo=bar; expires=Fri, 20 May 2011 15:25:52 GMT; domain=.myfoodomain.com; path=/; secure; httponly', (string) $cookie, '->__toString() returns string representation of the cookie');
|
||||
|
||||
$cookie = new Cookie('foo', 'bar with white spaces', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
|
||||
$this->assertEquals('foo=bar%20with%20white%20spaces; expires=Fri, 20 May 2011 15:25:52 GMT; domain=.myfoodomain.com; path=/; secure; httponly', (string) $cookie, '->__toString() encodes the value of the cookie according to RFC 3986 (white space = %20)');
|
||||
|
||||
$cookie = new Cookie('foo', null, 1, '/admin/', '.myfoodomain.com');
|
||||
$this->assertEquals('foo=; expires=Thu, 01 Jan 1970 00:00:01 GMT; domain=.myfoodomain.com; path=/admin/; httponly', (string) $cookie, '->__toString() returns string representation of a cleared cookie if value is NULL');
|
||||
|
||||
$cookie = new Cookie('foo', 'bar', 0, '/', '');
|
||||
$this->assertEquals('foo=bar; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; httponly', (string) $cookie);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getTestsForToFromString
|
||||
*/
|
||||
|
@ -397,15 +397,9 @@ class PhpDumper extends Dumper
|
||||
*/
|
||||
private function addServiceInstance($id, Definition $definition, $isSimpleInstance)
|
||||
{
|
||||
$class = $definition->getClass();
|
||||
$class = $this->dumpValue($definition->getClass());
|
||||
|
||||
if ('\\' === substr($class, 0, 1)) {
|
||||
$class = substr($class, 1);
|
||||
}
|
||||
|
||||
$class = $this->dumpValue($class);
|
||||
|
||||
if (0 === strpos($class, "'") && false === strpos($class, '$') && !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
|
||||
if (0 === strpos($class, "'") && false === strpos($class, '$') && !preg_match('/^\'(?:\\\{2})?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
|
||||
throw new InvalidArgumentException(sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id));
|
||||
}
|
||||
|
||||
@ -1564,11 +1558,13 @@ EOF;
|
||||
if (false !== strpos($class, '$')) {
|
||||
return sprintf('${($_ = %s) && false ?: "_"}', $class);
|
||||
}
|
||||
if (0 !== strpos($class, "'") || !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
|
||||
if (0 !== strpos($class, "'") || !preg_match('/^\'(?:\\\{2})?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
|
||||
throw new RuntimeException(sprintf('Cannot dump definition because of invalid class name (%s)', $class ?: 'n/a'));
|
||||
}
|
||||
|
||||
return '\\'.substr(str_replace('\\\\', '\\', $class), 1, -1);
|
||||
$class = substr(str_replace('\\\\', '\\', $class), 1, -1);
|
||||
|
||||
return 0 === strpos($class, '\\') ? $class : '\\'.$class;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -584,4 +584,17 @@ class PhpDumperTest extends TestCase
|
||||
$container = new \Symfony_DI_PhpDumper_Test_Private_With_Ignore_On_Invalid_Reference();
|
||||
$this->assertInstanceOf('BazClass', $container->get('bar')->getBaz());
|
||||
}
|
||||
|
||||
public function testDumpHandlesLiteralClassWithRootNamespace()
|
||||
{
|
||||
$container = new ContainerBuilder();
|
||||
$container->register('foo', '\\stdClass');
|
||||
|
||||
$dumper = new PhpDumper($container);
|
||||
eval('?>'.$dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_Literal_Class_With_Root_Namespace')));
|
||||
|
||||
$container = new \Symfony_DI_PhpDumper_Test_Literal_Class_With_Root_Namespace();
|
||||
|
||||
$this->assertInstanceOf('stdClass', $container->get('foo'));
|
||||
}
|
||||
}
|
||||
|
@ -145,7 +145,7 @@ class Cookie
|
||||
if ('' === (string) $this->getValue()) {
|
||||
$str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; max-age=-31536001';
|
||||
} else {
|
||||
$str .= $this->isRaw() ? $this->getValue() : urlencode($this->getValue());
|
||||
$str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue());
|
||||
|
||||
if (0 !== $this->getExpiresTime()) {
|
||||
$str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime()).'; max-age='.$this->getMaxAge();
|
||||
|
@ -164,6 +164,9 @@ class CookieTest extends TestCase
|
||||
$cookie = new Cookie('foo', 'bar', $expire = strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
|
||||
$this->assertEquals('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; max-age='.($expire - time()).'; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() returns string representation of the cookie');
|
||||
|
||||
$cookie = new Cookie('foo', 'bar with white spaces', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
|
||||
$this->assertEquals('foo=bar%20with%20white%20spaces; expires=Fri, 20-May-2011 15:25:52 GMT; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() encodes the value of the cookie according to RFC 3986 (white space = %20)');
|
||||
|
||||
$cookie = new Cookie('foo', null, 1, '/admin/', '.myfoodomain.com');
|
||||
$this->assertEquals('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', $expire = time() - 31536001).'; max-age='.($expire - time()).'; path=/admin/; domain=.myfoodomain.com; httponly', (string) $cookie, '->__toString() returns string representation of a cleared cookie if value is NULL');
|
||||
|
||||
|
@ -81,9 +81,9 @@ class AuthenticationProviderManager implements AuthenticationManagerInterface
|
||||
break;
|
||||
}
|
||||
} catch (AccountStatusException $e) {
|
||||
$e->setToken($token);
|
||||
$lastException = $e;
|
||||
|
||||
throw $e;
|
||||
break;
|
||||
} catch (AuthenticationException $e) {
|
||||
$lastException = $e;
|
||||
}
|
||||
|
@ -13,6 +13,9 @@ namespace Symfony\Component\Security\Core\Tests\Authentication;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Security\Core\Authentication\AuthenticationProviderManager;
|
||||
use Symfony\Component\Security\Core\AuthenticationEvents;
|
||||
use Symfony\Component\Security\Core\Event\AuthenticationEvent;
|
||||
use Symfony\Component\Security\Core\Event\AuthenticationFailureEvent;
|
||||
use Symfony\Component\Security\Core\Exception\ProviderNotFoundException;
|
||||
use Symfony\Component\Security\Core\Exception\AuthenticationException;
|
||||
use Symfony\Component\Security\Core\Exception\AccountStatusException;
|
||||
@ -125,6 +128,50 @@ class AuthenticationProviderManagerTest extends TestCase
|
||||
$this->assertEquals('bar', $token->getCredentials());
|
||||
}
|
||||
|
||||
public function testAuthenticateDispatchesAuthenticationFailureEvent()
|
||||
{
|
||||
$token = new UsernamePasswordToken('foo', 'bar', 'key');
|
||||
$provider = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface')->getMock();
|
||||
$provider->expects($this->once())->method('supports')->willReturn(true);
|
||||
$provider->expects($this->once())->method('authenticate')->willThrowException($exception = new AuthenticationException());
|
||||
|
||||
$dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
|
||||
$dispatcher
|
||||
->expects($this->once())
|
||||
->method('dispatch')
|
||||
->with(AuthenticationEvents::AUTHENTICATION_FAILURE, $this->equalTo(new AuthenticationFailureEvent($token, $exception)));
|
||||
|
||||
$manager = new AuthenticationProviderManager(array($provider));
|
||||
$manager->setEventDispatcher($dispatcher);
|
||||
|
||||
try {
|
||||
$manager->authenticate($token);
|
||||
$this->fail('->authenticate() should rethrow exceptions');
|
||||
} catch (AuthenticationException $e) {
|
||||
$this->assertSame($token, $exception->getToken());
|
||||
}
|
||||
}
|
||||
|
||||
public function testAuthenticateDispatchesAuthenticationSuccessEvent()
|
||||
{
|
||||
$token = new UsernamePasswordToken('foo', 'bar', 'key');
|
||||
|
||||
$provider = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface')->getMock();
|
||||
$provider->expects($this->once())->method('supports')->willReturn(true);
|
||||
$provider->expects($this->once())->method('authenticate')->willReturn($token);
|
||||
|
||||
$dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
|
||||
$dispatcher
|
||||
->expects($this->once())
|
||||
->method('dispatch')
|
||||
->with(AuthenticationEvents::AUTHENTICATION_SUCCESS, $this->equalTo(new AuthenticationEvent($token)));
|
||||
|
||||
$manager = new AuthenticationProviderManager(array($provider));
|
||||
$manager->setEventDispatcher($dispatcher);
|
||||
|
||||
$this->assertSame($token, $manager->authenticate($token));
|
||||
}
|
||||
|
||||
protected function getAuthenticationProvider($supports, $token = null, $exception = null)
|
||||
{
|
||||
$provider = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface')->getMock();
|
||||
|
Reference in New Issue
Block a user