Merge branch '2.7' into 2.8
* 2.7: [Config] Handle nullable node name + fix inheritdocs [Security] added userChecker to SimpleAuthenticationProvider [Debug] fix test Fix typo in test method name Fixes #26563 (open_basedir restriction in effect) [Debug] Reset previous exception handler ealier to prevent infinite loop add hint in Github pull request template [Validator] Fix docblock of ClassMetadata#members [BrowserKit] Fix cookie path handling when $domain is null [DoctrineBridge] Don't rely on ClassMetadataInfo->hasField in DoctrineOrmTypeGuesser anymore [BrowserKit] Improves CookieJar::get [BrowserKit] Fix Cookie's PHPDoc [DomCrawler] Change bad wording in ChoiceFormField::untick [DomCrawler] Fix the PHPDoc of ChoiceFormField::setValue [DomCrawler] Avoid a useless call to strtolower [FrameworkBundle] HttpCache is not longer abstract [DomCrawler] extract(): fix a bug when the attribute list is empty [Config] Backport string|null api for node names
This commit is contained in:
commit
af6be350e6
|
@ -4,7 +4,7 @@
|
|||
| Bug fix? | yes/no
|
||||
| New feature? | yes/no <!-- don't forget to update src/**/CHANGELOG.md files -->
|
||||
| BC breaks? | no <!-- see https://symfony.com/bc -->
|
||||
| Deprecations? | yes/no <!-- don't forget to update UPGRADE-*.md files -->
|
||||
| Deprecations? | yes/no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files -->
|
||||
| Tests pass? | yes <!-- please add some, will be required by reviewers -->
|
||||
| Fixed tickets | #... <!-- #-prefixed issue number(s), if any -->
|
||||
| License | MIT
|
||||
|
|
|
@ -95,7 +95,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
|
|||
$classMetadata = $classMetadatas[0];
|
||||
|
||||
// Check whether the field exists and is nullable or not
|
||||
if ($classMetadata->hasField($property)) {
|
||||
if (isset($classMetadata->fieldMappings[$property])) {
|
||||
if (!$classMetadata->isNullable($property) && Type::BOOLEAN !== $classMetadata->getTypeOfField($property)) {
|
||||
return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
|
||||
}
|
||||
|
@ -124,7 +124,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
|
|||
public function guessMaxLength($class, $property)
|
||||
{
|
||||
$ret = $this->getMetadata($class);
|
||||
if ($ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
|
||||
if ($ret && isset($ret[0]->fieldMappings[$property]) && !$ret[0]->hasAssociation($property)) {
|
||||
$mapping = $ret[0]->getFieldMapping($property);
|
||||
|
||||
if (isset($mapping['length'])) {
|
||||
|
@ -143,7 +143,7 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
|
|||
public function guessPattern($class, $property)
|
||||
{
|
||||
$ret = $this->getMetadata($class);
|
||||
if ($ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
|
||||
if ($ret && isset($ret[0]->fieldMappings[$property]) && !$ret[0]->hasAssociation($property)) {
|
||||
if (in_array($ret[0]->getTypeOfField($property), array(Type::DECIMAL, Type::FLOAT))) {
|
||||
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
|
||||
}
|
||||
|
|
|
@ -33,21 +33,20 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||
|
||||
// Simple field, not nullable
|
||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(true));
|
||||
$classMetadata->fieldMappings['field'] = true;
|
||||
$classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(false));
|
||||
|
||||
$return[] = array($classMetadata, new ValueGuess(true, Guess::HIGH_CONFIDENCE));
|
||||
|
||||
// Simple field, nullable
|
||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(true));
|
||||
$classMetadata->fieldMappings['field'] = true;
|
||||
$classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(true));
|
||||
|
||||
$return[] = array($classMetadata, new ValueGuess(false, Guess::MEDIUM_CONFIDENCE));
|
||||
|
||||
// One-to-one, nullable (by default)
|
||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
||||
|
||||
$mapping = array('joinColumns' => array(array()));
|
||||
|
@ -57,7 +56,6 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||
|
||||
// One-to-one, nullable (explicit)
|
||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
||||
|
||||
$mapping = array('joinColumns' => array(array('nullable' => true)));
|
||||
|
@ -67,7 +65,6 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||
|
||||
// One-to-one, not nullable
|
||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));
|
||||
|
||||
$mapping = array('joinColumns' => array(array('nullable' => false)));
|
||||
|
@ -77,7 +74,6 @@ class DoctrineOrmTypeGuesserTest extends TestCase
|
|||
|
||||
// One-to-many, no clue
|
||||
$classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
|
||||
$classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
|
||||
$classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(false));
|
||||
|
||||
$return[] = array($classMetadata, null);
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
namespace Symfony\Bundle\FrameworkBundle\HttpCache;
|
||||
|
||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||
use Symfony\Component\HttpKernel\KernelInterface;
|
||||
use Symfony\Component\HttpKernel\HttpCache\HttpCache as BaseHttpCache;
|
||||
use Symfony\Component\HttpKernel\HttpCache\Esi;
|
||||
use Symfony\Component\HttpKernel\HttpCache\Store;
|
||||
|
@ -23,16 +23,16 @@ use Symfony\Component\HttpFoundation\Response;
|
|||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
abstract class HttpCache extends BaseHttpCache
|
||||
class HttpCache extends BaseHttpCache
|
||||
{
|
||||
protected $cacheDir;
|
||||
protected $kernel;
|
||||
|
||||
/**
|
||||
* @param HttpKernelInterface $kernel An HttpKernelInterface instance
|
||||
* @param string $cacheDir The cache directory (default used if null)
|
||||
* @param KernelInterface $kernel A KernelInterface instance
|
||||
* @param string $cacheDir The cache directory (default used if null)
|
||||
*/
|
||||
public function __construct(HttpKernelInterface $kernel, $cacheDir = null)
|
||||
public function __construct(KernelInterface $kernel, $cacheDir = null)
|
||||
{
|
||||
$this->kernel = $kernel;
|
||||
$this->cacheDir = $cacheDir;
|
||||
|
|
|
@ -55,6 +55,7 @@ class SimpleFormFactory extends FormLoginFactory
|
|||
->replaceArgument(0, new Reference($config['authenticator']))
|
||||
->replaceArgument(1, new Reference($userProviderId))
|
||||
->replaceArgument(2, $id)
|
||||
->replaceArgument(3, new Reference('security.user_checker.'.$id))
|
||||
;
|
||||
|
||||
return $provider;
|
||||
|
|
|
@ -44,14 +44,14 @@ class Cookie
|
|||
/**
|
||||
* Sets a cookie.
|
||||
*
|
||||
* @param string $name The cookie name
|
||||
* @param string $value The value of the cookie
|
||||
* @param string $expires The time the cookie expires
|
||||
* @param string $path The path on the server in which the cookie will be available on
|
||||
* @param string $domain The domain that the cookie is available
|
||||
* @param bool $secure Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client
|
||||
* @param bool $httponly The cookie httponly flag
|
||||
* @param bool $encodedValue Whether the value is encoded or not
|
||||
* @param string $name The cookie name
|
||||
* @param string $value The value of the cookie
|
||||
* @param string|null $expires The time the cookie expires
|
||||
* @param string|null $path The path on the server in which the cookie will be available on
|
||||
* @param string $domain The domain that the cookie is available
|
||||
* @param bool $secure Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client
|
||||
* @param bool $httponly The cookie httponly flag
|
||||
* @param bool $encodedValue Whether the value is encoded or not
|
||||
*/
|
||||
public function __construct($name, $value, $expires = null, $path = null, $domain = '', $secure = false, $httponly = true, $encodedValue = false)
|
||||
{
|
||||
|
@ -112,8 +112,8 @@ class Cookie
|
|||
/**
|
||||
* Creates a Cookie instance from a Set-Cookie header value.
|
||||
*
|
||||
* @param string $cookie A Set-Cookie header value
|
||||
* @param string $url The base URL
|
||||
* @param string $cookie A Set-Cookie header value
|
||||
* @param string|null $url The base URL
|
||||
*
|
||||
* @return static
|
||||
*
|
||||
|
@ -242,7 +242,7 @@ class Cookie
|
|||
/**
|
||||
* Gets the expires time of the cookie.
|
||||
*
|
||||
* @return string The cookie expires time
|
||||
* @return string|null The cookie expires time
|
||||
*/
|
||||
public function getExpiresTime()
|
||||
{
|
||||
|
|
|
@ -43,32 +43,21 @@ class CookieJar
|
|||
{
|
||||
$this->flushExpiredCookies();
|
||||
|
||||
if (!empty($domain)) {
|
||||
foreach ($this->cookieJar as $cookieDomain => $pathCookies) {
|
||||
if ($cookieDomain) {
|
||||
$cookieDomain = '.'.ltrim($cookieDomain, '.');
|
||||
if ($cookieDomain != substr('.'.$domain, -strlen($cookieDomain))) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($pathCookies as $cookiePath => $namedCookies) {
|
||||
if ($cookiePath != substr($path, 0, strlen($cookiePath))) {
|
||||
continue;
|
||||
}
|
||||
if (isset($namedCookies[$name])) {
|
||||
return $namedCookies[$name];
|
||||
}
|
||||
foreach ($this->cookieJar as $cookieDomain => $pathCookies) {
|
||||
if ($cookieDomain && $domain) {
|
||||
$cookieDomain = '.'.ltrim($cookieDomain, '.');
|
||||
if ($cookieDomain !== substr('.'.$domain, -\strlen($cookieDomain))) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// avoid relying on this behavior that is mainly here for BC reasons
|
||||
foreach ($this->cookieJar as $cookies) {
|
||||
if (isset($cookies[$path][$name])) {
|
||||
return $cookies[$path][$name];
|
||||
foreach ($pathCookies as $cookiePath => $namedCookies) {
|
||||
if (0 !== strpos($path, $cookiePath)) {
|
||||
continue;
|
||||
}
|
||||
if (isset($namedCookies[$name])) {
|
||||
return $namedCookies[$name];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -237,6 +237,8 @@ class CookieJarTest extends TestCase
|
|||
$this->assertEquals($cookie1, $cookieJar->get('foo', '/test', 'example.com'));
|
||||
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/', 'example.com'));
|
||||
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/bar', 'example.com'));
|
||||
|
||||
$this->assertEquals($cookie2, $cookieJar->get('foo1', '/bar'));
|
||||
}
|
||||
|
||||
public function testCookieWithWildcardDomain()
|
||||
|
|
|
@ -153,9 +153,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Sets the node Name.
|
||||
*
|
||||
* @param string $name The node's name
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setName($name)
|
||||
{
|
||||
|
@ -163,9 +161,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Checks if the node has a default value.
|
||||
*
|
||||
* @return bool
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hasDefaultValue()
|
||||
{
|
||||
|
@ -173,11 +169,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Retrieves the default value.
|
||||
*
|
||||
* @return array The default value
|
||||
*
|
||||
* @throws \RuntimeException if the node has no default value
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDefaultValue()
|
||||
{
|
||||
|
|
|
@ -33,14 +33,14 @@ abstract class BaseNode implements NodeInterface
|
|||
protected $attributes = array();
|
||||
|
||||
/**
|
||||
* @param string $name The name of the node
|
||||
* @param NodeInterface $parent The parent of this node
|
||||
* @param string|null $name The name of the node
|
||||
* @param NodeInterface|null $parent The parent of this node
|
||||
*
|
||||
* @throws \InvalidArgumentException if the name contains a period
|
||||
*/
|
||||
public function __construct($name, NodeInterface $parent = null)
|
||||
{
|
||||
if (false !== strpos($name, '.')) {
|
||||
if (false !== strpos($name = (string) $name, '.')) {
|
||||
throw new \InvalidArgumentException('The name must not contain ".".');
|
||||
}
|
||||
|
||||
|
@ -170,9 +170,7 @@ abstract class BaseNode implements NodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Checks if this node is required.
|
||||
*
|
||||
* @return bool
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isRequired()
|
||||
{
|
||||
|
@ -180,9 +178,7 @@ abstract class BaseNode implements NodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the name of this node.
|
||||
*
|
||||
* @return string The Node's name
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
|
@ -190,9 +186,7 @@ abstract class BaseNode implements NodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Retrieves the path of this node.
|
||||
*
|
||||
* @return string The Node's path
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getPath()
|
||||
{
|
||||
|
@ -206,14 +200,7 @@ abstract class BaseNode implements NodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Merges two values together.
|
||||
*
|
||||
* @param mixed $leftSide
|
||||
* @param mixed $rightSide
|
||||
*
|
||||
* @return mixed The merged value
|
||||
*
|
||||
* @throws ForbiddenOverwriteException
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
final public function merge($leftSide, $rightSide)
|
||||
{
|
||||
|
@ -233,11 +220,7 @@ abstract class BaseNode implements NodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Normalizes a value, applying all normalization closures.
|
||||
*
|
||||
* @param mixed $value Value to normalize
|
||||
*
|
||||
* @return mixed The normalized value
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
final public function normalize($value)
|
||||
{
|
||||
|
@ -285,14 +268,7 @@ abstract class BaseNode implements NodeInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Finalizes a value, applying all finalization closures.
|
||||
*
|
||||
* @param mixed $value The value to finalize
|
||||
*
|
||||
* @return mixed The finalized value
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws InvalidConfigurationException
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
final public function finalize($value)
|
||||
{
|
||||
|
|
|
@ -48,7 +48,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
|
|||
}
|
||||
|
||||
/**
|
||||
* Sets a custom children builder.
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setBuilder(NodeBuilder $builder)
|
||||
{
|
||||
|
@ -56,9 +56,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns a builder to add children nodes.
|
||||
*
|
||||
* @return NodeBuilder
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function children()
|
||||
{
|
||||
|
@ -310,17 +308,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
|
|||
}
|
||||
|
||||
/**
|
||||
* Appends a node definition.
|
||||
*
|
||||
* $node = new ArrayNodeDefinition()
|
||||
* ->children()
|
||||
* ->scalarNode('foo')->end()
|
||||
* ->scalarNode('baz')->end()
|
||||
* ->end()
|
||||
* ->append($this->getBarNodeDefinition())
|
||||
* ;
|
||||
*
|
||||
* @return $this
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function append(NodeDefinition $node)
|
||||
{
|
||||
|
|
|
@ -143,8 +143,8 @@ class NodeBuilder implements NodeParentInterface
|
|||
/**
|
||||
* Creates a child node.
|
||||
*
|
||||
* @param string $name The name of the node
|
||||
* @param string $type The type of the node
|
||||
* @param string|null $name The name of the node
|
||||
* @param string $type The type of the node
|
||||
*
|
||||
* @return NodeDefinition The child node
|
||||
*
|
||||
|
|
|
@ -36,7 +36,7 @@ abstract class NodeDefinition implements NodeParentInterface
|
|||
protected $attributes = array();
|
||||
|
||||
/**
|
||||
* @param string $name The name of the node
|
||||
* @param string|null $name The name of the node
|
||||
* @param NodeParentInterface|null $parent The parent
|
||||
*/
|
||||
public function __construct($name, NodeParentInterface $parent = null)
|
||||
|
|
|
@ -18,9 +18,32 @@ namespace Symfony\Component\Config\Definition\Builder;
|
|||
*/
|
||||
interface ParentNodeDefinitionInterface
|
||||
{
|
||||
/**
|
||||
* Returns a builder to add children nodes.
|
||||
*
|
||||
* @return NodeBuilder
|
||||
*/
|
||||
public function children();
|
||||
|
||||
/**
|
||||
* Appends a node definition.
|
||||
*
|
||||
* Usage:
|
||||
*
|
||||
* $node = $parentNode
|
||||
* ->children()
|
||||
* ->scalarNode('foo')->end()
|
||||
* ->scalarNode('baz')->end()
|
||||
* ->append($this->getBarNodeDefinition())
|
||||
* ->end()
|
||||
* ;
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function append(NodeDefinition $node);
|
||||
|
||||
/**
|
||||
* Sets a custom children builder.
|
||||
*/
|
||||
public function setBuilder(NodeBuilder $builder);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
|
||||
namespace Symfony\Component\Config\Definition;
|
||||
|
||||
use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
|
||||
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
|
||||
use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
|
||||
|
||||
/**
|
||||
* Common Interface among all nodes.
|
||||
*
|
||||
|
@ -59,11 +63,13 @@ interface NodeInterface
|
|||
public function getDefaultValue();
|
||||
|
||||
/**
|
||||
* Normalizes the supplied value.
|
||||
* Normalizes a value.
|
||||
*
|
||||
* @param mixed $value The value to normalize
|
||||
*
|
||||
* @return mixed The normalized value
|
||||
*
|
||||
* @throws InvalidTypeException if the value type is invalid
|
||||
*/
|
||||
public function normalize($value);
|
||||
|
||||
|
@ -73,7 +79,10 @@ interface NodeInterface
|
|||
* @param mixed $leftSide
|
||||
* @param mixed $rightSide
|
||||
*
|
||||
* @return mixed The merged values
|
||||
* @return mixed The merged value
|
||||
*
|
||||
* @throws ForbiddenOverwriteException if the configuration path cannot be overwritten
|
||||
* @throws InvalidTypeException if the value type is invalid
|
||||
*/
|
||||
public function merge($leftSide, $rightSide);
|
||||
|
||||
|
@ -83,6 +92,9 @@ interface NodeInterface
|
|||
* @param mixed $value The value to finalize
|
||||
*
|
||||
* @return mixed The finalized value
|
||||
*
|
||||
* @throws InvalidTypeException if the value type is invalid
|
||||
* @throws InvalidConfigurationException if the value is invalid configuration
|
||||
*/
|
||||
public function finalize($value);
|
||||
}
|
||||
|
|
|
@ -102,9 +102,7 @@ class PrototypedArrayNode extends ArrayNode
|
|||
}
|
||||
|
||||
/**
|
||||
* Checks if the node has a default value.
|
||||
*
|
||||
* @return bool
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function hasDefaultValue()
|
||||
{
|
||||
|
@ -126,12 +124,10 @@ class PrototypedArrayNode extends ArrayNode
|
|||
}
|
||||
|
||||
/**
|
||||
* Retrieves the default value.
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* The default value could be either explicited or derived from the prototype
|
||||
* default value.
|
||||
*
|
||||
* @return array The default value
|
||||
*/
|
||||
public function getDefaultValue()
|
||||
{
|
||||
|
|
|
@ -27,9 +27,6 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface
|
|||
protected $defaultValue;
|
||||
protected $allowEmptyValue = true;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setDefaultValue($value)
|
||||
{
|
||||
$this->defaultValueSet = true;
|
||||
|
|
|
@ -20,7 +20,7 @@ class ConfigCacheFactoryTest extends TestCase
|
|||
* @expectedException \InvalidArgumentException
|
||||
* @expectedExceptionMessage Invalid type for callback argument. Expected callable, but got "object".
|
||||
*/
|
||||
public function testCachWithInvalidCallback()
|
||||
public function testCacheWithInvalidCallback()
|
||||
{
|
||||
$cacheFactory = new ConfigCacheFactory(true);
|
||||
|
||||
|
|
|
@ -614,15 +614,16 @@ class ErrorHandler
|
|||
}
|
||||
}
|
||||
}
|
||||
$exceptionHandler = $this->exceptionHandler;
|
||||
$this->exceptionHandler = null;
|
||||
try {
|
||||
if (null !== $this->exceptionHandler) {
|
||||
return \call_user_func($this->exceptionHandler, $exception);
|
||||
if (null !== $exceptionHandler) {
|
||||
return \call_user_func($exceptionHandler, $exception);
|
||||
}
|
||||
$handlerException = $handlerException ?: $exception;
|
||||
} catch (\Exception $handlerException) {
|
||||
} catch (\Throwable $handlerException) {
|
||||
}
|
||||
$this->exceptionHandler = null;
|
||||
if ($exception === $handlerException) {
|
||||
self::$reservedMemory = null; // Disable the fatal error handler
|
||||
throw $exception; // Give back $exception to the native handler
|
||||
|
|
|
@ -601,4 +601,18 @@ class ErrorHandlerTest extends TestCase
|
|||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Exception
|
||||
* @group no-hhvm
|
||||
*/
|
||||
public function testCustomExceptionHandler()
|
||||
{
|
||||
$handler = new ErrorHandler();
|
||||
$handler->setExceptionHandler(function ($e) use ($handler) {
|
||||
$handler->handleException($e);
|
||||
});
|
||||
|
||||
$handler->handleException(new \Exception());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -601,7 +601,7 @@ class Crawler extends \SplObjectStorage
|
|||
}
|
||||
}
|
||||
|
||||
$data[] = $count > 1 ? $elements : $elements[0];
|
||||
$data[] = 1 === $count ? $elements[0] : $elements;
|
||||
}
|
||||
|
||||
return $data;
|
||||
|
|
|
@ -97,14 +97,14 @@ class ChoiceFormField extends FormField
|
|||
}
|
||||
|
||||
/**
|
||||
* Ticks a checkbox.
|
||||
* Unticks a checkbox.
|
||||
*
|
||||
* @throws \LogicException When the type provided is not correct
|
||||
*/
|
||||
public function untick()
|
||||
{
|
||||
if ('checkbox' !== $this->type) {
|
||||
throw new \LogicException(sprintf('You cannot tick "%s" as it is not a checkbox (%s).', $this->name, $this->type));
|
||||
throw new \LogicException(sprintf('You cannot untick "%s" as it is not a checkbox (%s).', $this->name, $this->type));
|
||||
}
|
||||
|
||||
$this->setValue(false);
|
||||
|
@ -113,7 +113,7 @@ class ChoiceFormField extends FormField
|
|||
/**
|
||||
* Sets the value of the field.
|
||||
*
|
||||
* @param string $value The value of the field
|
||||
* @param string|array $value The value of the field
|
||||
*
|
||||
* @throws \InvalidArgumentException When value type provided is not correct
|
||||
*/
|
||||
|
|
|
@ -32,11 +32,12 @@ class InputFormField extends FormField
|
|||
throw new \LogicException(sprintf('An InputFormField can only be created from an input or button tag (%s given).', $this->node->nodeName));
|
||||
}
|
||||
|
||||
if ('checkbox' === strtolower($this->node->getAttribute('type'))) {
|
||||
$type = strtolower($this->node->getAttribute('type'));
|
||||
if ('checkbox' === $type) {
|
||||
throw new \LogicException('Checkboxes should be instances of ChoiceFormField.');
|
||||
}
|
||||
|
||||
if ('file' === strtolower($this->node->getAttribute('type'))) {
|
||||
if ('file' === $type) {
|
||||
throw new \LogicException('File inputs should be instances of FileFormField.');
|
||||
}
|
||||
|
||||
|
|
|
@ -389,6 +389,7 @@ EOF
|
|||
|
||||
$this->assertEquals(array('One', 'Two', 'Three'), $crawler->extract('_text'), '->extract() returns an array of extracted data from the node list');
|
||||
$this->assertEquals(array(array('One', 'first'), array('Two', ''), array('Three', '')), $crawler->extract(array('_text', 'class')), '->extract() returns an array of extracted data from the node list');
|
||||
$this->assertEquals(array(array(), array(), array()), $crawler->extract(array()), '->extract() returns empty arrays if the attribute list is empty');
|
||||
|
||||
$this->assertEquals(array(), $this->createTestCrawler()->filterXPath('//ol')->extract('_text'), '->extract() returns an empty array if the node list is empty');
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ class PhpExecutableFinder
|
|||
}
|
||||
|
||||
// PHP_BINARY return the current sapi executable
|
||||
if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server', 'phpdbg')) && is_file(PHP_BINARY)) {
|
||||
if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server', 'phpdbg'))) {
|
||||
return PHP_BINARY.$args;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
|
||||
namespace Symfony\Component\Security\Core\Authentication\Provider;
|
||||
|
||||
use Symfony\Component\Security\Core\User\UserChecker;
|
||||
use Symfony\Component\Security\Core\User\UserCheckerInterface;
|
||||
use Symfony\Component\Security\Core\User\UserProviderInterface;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface;
|
||||
|
@ -24,23 +26,29 @@ class SimpleAuthenticationProvider implements AuthenticationProviderInterface
|
|||
private $simpleAuthenticator;
|
||||
private $userProvider;
|
||||
private $providerKey;
|
||||
private $userChecker;
|
||||
|
||||
public function __construct(SimpleAuthenticatorInterface $simpleAuthenticator, UserProviderInterface $userProvider, $providerKey)
|
||||
public function __construct(SimpleAuthenticatorInterface $simpleAuthenticator, UserProviderInterface $userProvider, $providerKey, UserCheckerInterface $userChecker = null)
|
||||
{
|
||||
$this->simpleAuthenticator = $simpleAuthenticator;
|
||||
$this->userProvider = $userProvider;
|
||||
$this->providerKey = $providerKey;
|
||||
$this->userChecker = $userChecker ?: new UserChecker();
|
||||
}
|
||||
|
||||
public function authenticate(TokenInterface $token)
|
||||
{
|
||||
$authToken = $this->simpleAuthenticator->authenticateToken($token, $this->userProvider, $this->providerKey);
|
||||
|
||||
if ($authToken instanceof TokenInterface) {
|
||||
return $authToken;
|
||||
if (!$authToken instanceof TokenInterface) {
|
||||
throw new AuthenticationException('Simple authenticator failed to return an authenticated token.');
|
||||
}
|
||||
|
||||
throw new AuthenticationException('Simple authenticator failed to return an authenticated token.');
|
||||
$user = $authToken->getUser();
|
||||
$this->userChecker->checkPreAuth($user);
|
||||
$this->userChecker->checkPostAuth($user);
|
||||
|
||||
return $authToken;
|
||||
}
|
||||
|
||||
public function supports(TokenInterface $token)
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Security\Core\Tests\Authentication\Provider;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Security\Core\Exception\DisabledException;
|
||||
use Symfony\Component\Security\Core\Authentication\Provider\SimpleAuthenticationProvider;
|
||||
use Symfony\Component\Security\Core\Exception\LockedException;
|
||||
|
||||
class SimpleAuthenticationProviderTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Security\Core\Exception\DisabledException
|
||||
*/
|
||||
public function testAuthenticateWhenPreChecksFails()
|
||||
{
|
||||
$user = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserInterface')->getMock();
|
||||
|
||||
$token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock();
|
||||
$token->expects($this->any())
|
||||
->method('getUser')
|
||||
->will($this->returnValue($user));
|
||||
|
||||
$userChecker = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserCheckerInterface')->getMock();
|
||||
$userChecker->expects($this->once())
|
||||
->method('checkPreAuth')
|
||||
->will($this->throwException(new DisabledException()));
|
||||
|
||||
$authenticator = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface')->getMock();
|
||||
$authenticator->expects($this->once())
|
||||
->method('authenticateToken')
|
||||
->will($this->returnValue($token));
|
||||
|
||||
$provider = $this->getProvider($authenticator, null, $userChecker);
|
||||
|
||||
$provider->authenticate($token);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Security\Core\Exception\LockedException
|
||||
*/
|
||||
public function testAuthenticateWhenPostChecksFails()
|
||||
{
|
||||
$user = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserInterface')->getMock();
|
||||
|
||||
$token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock();
|
||||
$token->expects($this->any())
|
||||
->method('getUser')
|
||||
->will($this->returnValue($user));
|
||||
|
||||
$userChecker = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserCheckerInterface')->getMock();
|
||||
$userChecker->expects($this->once())
|
||||
->method('checkPostAuth')
|
||||
->will($this->throwException(new LockedException()));
|
||||
|
||||
$authenticator = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface')->getMock();
|
||||
$authenticator->expects($this->once())
|
||||
->method('authenticateToken')
|
||||
->will($this->returnValue($token));
|
||||
|
||||
$provider = $this->getProvider($authenticator, null, $userChecker);
|
||||
|
||||
$provider->authenticate($token);
|
||||
}
|
||||
|
||||
protected function getProvider($simpleAuthenticator = null, $userProvider = null, $userChecker = null, $key = 'test')
|
||||
{
|
||||
if (null === $userChecker) {
|
||||
$userChecker = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserCheckerInterface')->getMock();
|
||||
}
|
||||
if (null === $simpleAuthenticator) {
|
||||
$simpleAuthenticator = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface')->getMock();
|
||||
}
|
||||
if (null === $userProvider) {
|
||||
$userProvider = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserProviderInterface')->getMock();
|
||||
}
|
||||
|
||||
return new SimpleAuthenticationProvider($simpleAuthenticator, $userProvider, $key, $userChecker);
|
||||
}
|
||||
}
|
|
@ -48,7 +48,7 @@ class ClassMetadata extends ElementMetadata implements ClassMetadataInterface
|
|||
public $defaultGroup;
|
||||
|
||||
/**
|
||||
* @var MemberMetadata[]
|
||||
* @var MemberMetadata[][]
|
||||
*
|
||||
* @internal This property is public in order to reduce the size of the
|
||||
* class' serialized representation. Do not access it. Use
|
||||
|
|
Reference in New Issue