From 403869759964426b5505b30ded129b43e96f006f Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 23 Sep 2013 11:45:08 -0400 Subject: [PATCH 01/32] Added support for DI-configurable features similar to annotations --- DependencyInjection/Configuration.php | 43 +- Metadata/ClassMetadata.php | 4 +- Metadata/Driver/AbstractDriver.php | 103 + Metadata/Driver/AnnotationDriver.php | 102 +- Metadata/Driver/ConfigDriver.php | 157 +- .../Func/ServiceCallbackFunctionCompiler.php | 2 +- .../JMSSecurityExtraExtensionTest.php | 10 +- Tests/Functional/MethodAccessControlTest.php | 14 +- .../TestBundle/Controller/FooController.php | 2 +- .../config/method_access_control.yml | 5 +- Tests/Metadata/ClassMetadataTest.php | 4 +- .../Metadata/Driver/AnnotationDriverTest.php | 5 +- Tests/Metadata/Driver/ConfigDriverTest.php | 161 + composer.lock | 2852 ----------------- 14 files changed, 536 insertions(+), 2928 deletions(-) create mode 100644 Metadata/Driver/AbstractDriver.php delete mode 100644 composer.lock diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index fe41d90..9891dd8 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -69,9 +69,46 @@ public function getConfigTreeBuilder() ->end() ->end() ->arrayNode('method_access_control') - ->useAttributeAsKey('pattern') - ->prototype('scalar')->isRequired()->cannotBeEmpty()->end() - ->end() + ->beforeNormalization() + ->always(function ($node) { + /** This is a backward compatibility layer */ + foreach ($node as $key => $value) { + if (is_string($value)) { + $node[$key] = array( + 'pattern' => $key, + 'pre_authorize' => $value + ); + } + } + + return $node; + }) + ->end() + ->useAttributeAsKey('pattern', false) + ->prototype('array') + ->children() + ->scalarNode('pattern')->end() + ->scalarNode('pre_authorize')->cannotBeEmpty()->end() + ->arrayNode('secure') + ->children() + ->arrayNode('roles')->prototype('scalar')->end() + ->end() + ->arrayNode('secure_param') + ->children() + ->scalarNode('name')->end() + ->arrayNode('permissions')->prototype('scalar')->end() + ->end() + ->arrayNode('secure_return') + ->children() + ->arrayNode('permissions')->prototype('scalar')->end() + ->end() + ->arrayNode('run_as') + ->children() + ->arrayNode('roles')->prototype('scalar')->end() + ->end() + ->booleanNode('satisfies_parent_security_policy')->end() + ->end() + ->end() ->arrayNode('util') ->addDefaultsIfNotSet() ->children() diff --git a/Metadata/ClassMetadata.php b/Metadata/ClassMetadata.php index 0f00c8f..3e4f3f8 100644 --- a/Metadata/ClassMetadata.php +++ b/Metadata/ClassMetadata.php @@ -20,7 +20,7 @@ use JMS\SecurityExtraBundle\Exception\RuntimeException; use JMS\SecurityExtraBundle\Exception\InvalidArgumentException; -use Metadata\MethodMetadata; +use Metadata\MethodMetadata as PlainMethodMetadata; use Metadata\MergeableInterface; use Metadata\MergeableClassMetadata; @@ -31,7 +31,7 @@ */ class ClassMetadata extends MergeableClassMetadata { - public function addMethodMetadata(MethodMetadata $metadata) + public function addMethodMetadata(PlainMethodMetadata $metadata) { if ($this->reflection->isFinal()) { throw new RuntimeException(sprintf('Class "%s" is declared final, and cannot be secured.', $reflection->name)); diff --git a/Metadata/Driver/AbstractDriver.php b/Metadata/Driver/AbstractDriver.php new file mode 100644 index 0000000..bfec961 --- /dev/null +++ b/Metadata/Driver/AbstractDriver.php @@ -0,0 +1,103 @@ + + */ +abstract class AbstractDriver implements DriverInterface +{ + /** + * Loads security-related metadata from configuration for a specific class + * + * @param \ReflectionClass $class Class for which to load metadata + * + * @return ClassMetatada + */ + public function loadMetadataForClass(\ReflectionClass $class) + { + $metadata = new ClassMetadata($class->name); + + $classMetadataConfig = $this->getClassScopeMetadata($class); + + $methods = $class->getMethods( + \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED + ); + + foreach ($methods as $method) { + if ($method->getDeclaringClass()->name !== $class->name) { + continue; + } + + $methodMetadataConfig = $this->getMethodScopeMetadata($method); + + $configuratedMetadata = array( + 'class' => $classMetadataConfig ? $classMetadataConfig : array(), + 'method' => $methodMetadataConfig ? $methodMetadataConfig : array() + ); + + $methodMetadata = $this->fromMetadataConfig($method, $configuratedMetadata); + + if ($methodMetadata) { + $metadata->addMethodMetadata($methodMetadata); + } + } + + return $this->metadataPostTreatment($metadata); + } + + /** + * Enables specialized post-treatment for class metadata. + * + * This method is mainly a backward compatibility strategy to bypass the + * violation of liskov substitution principle implied by the conjunction + * use of MetadataFactory and DriverChain. + * + * For more information about this bug, see issue #145 at + * + * @param ClassMetadata $metadata + * + * @return null|ClassMetadata + * + * @see https://github.com/schmittjoh/JMSSecurityExtraBundle/issues/145 + */ + abstract protected function metadataPostTreatment(ClassMetadata $metadata); + + /** + * Retrieves metadata configuration for specified method. Implementations + * should use what configuration source provided by child DriverInterface + * implementation. + * + * @param \ReflectionMethod $method Method for which the configuration will apply + * + * @return array An array of metadata configuration which can be arrays, objects, etc. + */ + abstract protected function getMethodScopeMetadata(\ReflectionMethod $method); + + /** + * Retrieves metadata configuration for specified method. Implementations + * should use what configuration source provided by child DriverInterface + * implementation. + * + * @param \ReflectionClass $class Class for which the configuration will apply + * + * @return array An array of metadata configuration which can be arrays, objects, etc. + */ + abstract protected function getClassScopeMetadata(\ReflectionClass $class); + + /** + * Converts an array of metadata configuration to a MethodMetadada. + * + * @param \ReflectionMethod $method Related method + * @param array $configs Metadata configuration to be converted + * + * @return MethodMetadata + */ + abstract protected function fromMetadataConfig(\ReflectionMethod $method, array $configs); +} diff --git a/Metadata/Driver/AnnotationDriver.php b/Metadata/Driver/AnnotationDriver.php index 44de17e..02049a1 100644 --- a/Metadata/Driver/AnnotationDriver.php +++ b/Metadata/Driver/AnnotationDriver.php @@ -38,58 +38,78 @@ * * @author Johannes M. Schmitt */ -class AnnotationDriver implements DriverInterface +class AnnotationDriver extends AbstractDriver { private $reader; + /** + * @param Reader $reader Annotation reader + */ public function __construct(Reader $reader) { $this->reader = $reader; } - public function loadMetadataForClass(ReflectionClass $reflection) + /** + * {@inheritDoc} + */ + protected function getClassScopeMetadata(ReflectionClass $class) { - $metadata = new ClassMetadata($reflection->name); - - $classPreAuthorize = $this->reader->getClassAnnotation($reflection, 'JMS\SecurityExtraBundle\Annotation\PreAuthorize'); - $classAnnotations = $this->reader->getClassAnnotations($reflection); - foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED) as $method) { - // check if the method was defined on this class - if ($method->getDeclaringClass()->name !== $reflection->name) { - continue; - } + $metadata[] = $this->reader->getClassAnnotation( + $class, + 'JMS\SecurityExtraBundle\Annotation\PreAuthorize' + ); - $annotations = $this->reader->getMethodAnnotations($method); - if ($classAnnotations) { - foreach ($classAnnotations as $classAnnotation) { - if ($classAnnotation instanceof SecureParam) { - $annotations[] = $classAnnotation; - } - } - } + return $metadata; + } - if (! $annotations && ! $classPreAuthorize) { - continue; - } + /** + * {@inheritDoc} + */ + protected function getMethodScopeMetadata(ReflectionMethod $method) + { + $metadata = $this->reader->getMethodAnnotations($method); - if (null !== $methodMetadata = $this->convertMethodAnnotations($method, $annotations, $classPreAuthorize)) { - $metadata->addMethodMetadata($methodMetadata); + $class = $method->getDeclaringClass(); + + /** + * We consider class-scope SecureParam annotations to be method-scope. + */ + foreach ($this->reader->getClassAnnotations($class) as $annotation) { + if ($annotation instanceof SecureParam) { + $metadata[] = $annotation; } } - return $metadata; + return $metadata ? $metadata : array(); } - private function convertMethodAnnotations(\ReflectionMethod $method, array $annotations, PreAuthorize $classPreAuthorize = null) + /** + * {@inheritDoc} + */ + protected function fromMetadataConfig(\ReflectionMethod $method, array $annotations) { $parameters = array(); foreach ($method->getParameters() as $index => $parameter) { $parameters[$parameter->getName()] = $index; } + $classPreAuthorize = null; + + if (isset($annotations['class'])) { + foreach ($annotations['class'] as $annotation) { + if ($annotation instanceof PreAuthorize) { + $classPreAuthorize = $annotation; + break; + } + } + } + $methodMetadata = new MethodMetadata($method->class, $method->name); + $hasSecurityMetadata = $hasPreRestrictions = false; - foreach ($annotations as $annotation) { + + foreach ($annotations['method'] as $annotation) { if ($annotation instanceof Secure) { $methodMetadata->roles = $annotation->roles; $hasSecurityMetadata = $hasPreRestrictions = true; @@ -97,11 +117,11 @@ private function convertMethodAnnotations(\ReflectionMethod $method, array $anno $methodMetadata->roles = array(new Expression($annotation->expr)); $hasSecurityMetadata = $hasPreRestrictions = true; } elseif ($annotation instanceof SecureParam) { - if (!isset($parameters[$annotation->name])) { - throw new InvalidArgumentException(sprintf('The parameter "%s" does not exist for method "%s".', $annotation->name, $method->name)); - } - - $methodMetadata->addParamPermissions($parameters[$annotation->name], $annotation->permissions); + $this->assertParamExistsForMethod($parameters, $annotation->name, $method->name); + $methodMetadata->addParamPermissions( + $parameters[$annotation->name], + $annotation->permissions + ); $hasSecurityMetadata = $hasPreRestrictions = true; } elseif ($annotation instanceof SecureReturn) { $methodMetadata->returnPermissions = $annotation->permissions; @@ -132,4 +152,22 @@ private function convertMethodAnnotations(\ReflectionMethod $method, array $anno return $hasSecurityMetadata ? $methodMetadata : null; } + + protected function metadataPostTreatment(ClassMetadata $metadata) + { + return $metadata; + } + + private function assertParamExistsForMethod(array $params, $name, $method) + { + if (!isset($params[$name])) { + throw new InvalidArgumentException( + sprintf( + 'The parameter "%s" does not exist for method "%s".', + $name, + $method + ) + ); + } + } } diff --git a/Metadata/Driver/ConfigDriver.php b/Metadata/Driver/ConfigDriver.php index 767e30d..a7c7f88 100644 --- a/Metadata/Driver/ConfigDriver.php +++ b/Metadata/Driver/ConfigDriver.php @@ -12,15 +12,19 @@ * * @author Johannes M. Schmitt */ -class ConfigDriver implements DriverInterface +class ConfigDriver extends AbstractDriver { private $bundles; private $config; + /** + * @param array $bundles A list of used bundles indexed by name. + * @param array $config Metadata configuration + */ public function __construct(array $bundles, array $config) { - uasort($bundles, function($a, $b) { - return strlen($b) - strlen($a); + uasort($bundles, function($operandA, $operandB) { + return strlen($operandB) - strlen($operandA); }); foreach ($bundles as $name => $namespace) { @@ -28,51 +32,125 @@ public function __construct(array $bundles, array $config) } $this->bundles = $bundles; - $this->config = $config; + + /** This is a BC layer */ + $this->config = array(); + foreach ($config as $key => $value) { + if (is_string($value)) { + $this->config[$key] = array( + 'pattern' => $key, + 'pre_authorize' => $value + ); + } else { + $this->config[$key] = $value; + } + } } - public function loadMetadataForClass(\ReflectionClass $class) + /** + * {@inheritDoc} + */ + protected function getMethodScopeMetadata(\ReflectionMethod $method) { - $metadata = new ClassMetadata($class->name); + $configurationFound = null; - foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $method) { - if ($method->getDeclaringClass()->name !== $class->name) { - continue; - } + if (null !== $notation = $this->getControllerNotation($method)) { + $configurationFound = $this->getConfigForSignature($notation); + } - $expression = null; - if (null !== $notation = $this->getControllerNotation($method)) { - $expression = $this->getExpressionForSignature($notation); - } + if (null === $configurationFound) { + $configurationFound = $this->getConfigForSignature($method->class.'::'.$method->name); + } - if (null === $expression && null === $expression = - $this->getExpressionForSignature($method->class.'::'.$method->name)) { - continue; - } + return $configurationFound ? $configurationFound : array(); + } - $methodMetadata = new MethodMetadata($method->class, $method->name); - $methodMetadata->roles = array(new Expression($expression)); - $metadata->addMethodMetadata($methodMetadata); + /** + * {@inheritDoc} + */ + protected function getClassScopeMetadata(\ReflectionClass $class) + { + /** + * Class configuration metadata is not supported. Use more general + * regex pattern in configuration instead. + */ + + return array(); + } + + /** + * {@inheritDoc} + */ + protected function fromMetadataConfig(\ReflectionMethod $method, array $configs) + { + $parameters = array(); + foreach ($method->getParameters() as $index => $parameter) { + $parameters[$parameter->getName()] = $index; } - if (!$metadata->methodMetadata) { - return null; + $methodMetadata = new MethodMetadata($method->class, $method->name); + + $hasSecurityMetadata = false; + + foreach ($configs['method'] as $name => $config) { + switch ($name) { + case "pre_authorize": + $methodMetadata->roles = array(new Expression($config)); + $hasSecurityMetadata = true; + break; + case "secure": + $methodMetadata->roles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "secure_param": + $this->assertParamExistsForMethod($parameters, $config['name'], $method->name); + $methodMetadata->addParamPermissions( + $parameters[$config['name']], $config['permissions'] + ); + $hasSecurityMetadata = true; + break; + case "secure_return": + $methodMetadata->returnPermissions = $config['permissions']; + $hasSecurityMetadata = true; + break; + case "run_as": + $methodMetadata->runAsRoles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "satisfies_parent_security_policy": + $methodMetadata->satisfiesParentSecurityPolicy = true; + $hasSecurityMetadata = true; + break; + } } - return $metadata; + return $hasSecurityMetadata ? $methodMetadata : null; } - private function getExpressionForSignature($signature) + protected function getConfigForSignature($signature) { - foreach ($this->config as $pattern => $expr) { - if (!preg_match('#'.$pattern.'#i', $signature)) { + $configurationFound = null; + + foreach ($this->config as $config) { + if (!preg_match('#'.$config['pattern'].'#i', $signature)) { continue; } - return $expr; + $configurationFound = $config; + + break; } - return null; + return $configurationFound; + } + + protected function metadataPostTreatment(ClassMetadata $metadata) + { + if (!$metadata->methodMetadata) { + $metadata = null; + } + + return $metadata; } // TODO: Is it feasible to reverse-engineer the notation for service controllers? @@ -81,7 +159,13 @@ private function getControllerNotation(\ReflectionMethod $method) $signature = $method->class.'::'.$method->name; // check if class is a controller - if (0 === preg_match('#\\\\Controller\\\\([^\\\\]+)Controller::(.+)Action$#', $signature, $match)) { + $matched = preg_match( + '#\\\\Controller\\\\([^\\\\]+)Controller::(.+)Action$#', + $signature, + $match + ); + + if (!$matched) { return null; } @@ -96,4 +180,17 @@ private function getControllerNotation(\ReflectionMethod $method) return null; } + + private function assertParamExistsForMethod(array $params, $name, $method) + { + if (!isset($params[$name])) { + throw new \InvalidArgumentException( + sprintf( + 'The parameter "%s" does not exist for method "%s".', + $name, + $method + ) + ); + } + } } diff --git a/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php b/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php index 3cf2266..9e72e7a 100644 --- a/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php +++ b/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php @@ -54,4 +54,4 @@ public function getName() { return $this->functionName; } -} \ No newline at end of file +} diff --git a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php index 9eedce9..6e57aa5 100644 --- a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php +++ b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php @@ -60,7 +60,13 @@ public function testConfigLoadWithMethodAccessControl() ) )), $container = $this->getContainer()); - $this->assertEquals(array(':login$' => 'hasRole("FOO")'), + $this->assertEquals( + array( + ':login$' => array( + 'pattern' => ':login$', + 'pre_authorize' => 'hasRole("FOO")', + ) + ), $container->getParameter('security.access.method_access_control')); } @@ -71,7 +77,7 @@ public function testConfigLoadThrowsExceptionWhenMethodAccessControlWithoutExpre { $this->extension->load(array(array( 'expressions' => false, - 'method_access_control' => array('foo' => 'bar'), + 'method_access_control' => array('foo' => 'bar', 'FOO' => 'BAR'), )), $this->getContainer()); } diff --git a/Tests/Functional/MethodAccessControlTest.php b/Tests/Functional/MethodAccessControlTest.php index 36f07d4..7852573 100644 --- a/Tests/Functional/MethodAccessControlTest.php +++ b/Tests/Functional/MethodAccessControlTest.php @@ -61,6 +61,17 @@ public function testUserManagerDeleteIsSecure() $manager->delete(); } + /** + * @runInSeparateProcess + */ + public function testCrudEditIsSecureWithAdvancedConfiguration() + { + $client = $this->createClient(array('config' => 'method_access_control.yml')); + + $client->request('GET', '/edit'); + $this->assertRedirectedToLogin($client->getResponse()); + } + /** * @runInSeparateProcess */ @@ -73,6 +84,7 @@ public function testFunctionEvaluator() $client->request('GET', '/post/foo'); $response = $client->getResponse(); + $this->assertEquals('foo', $response->getContent()); $this->assertEquals(1, $evaluator->getNbCalls()); @@ -123,4 +135,4 @@ private function assertRedirectedToLogin(Response $response) $this->assertEquals(302, $response->getStatusCode()); $this->assertEquals('http://localhost/login', $response->headers->get('Location')); } -} \ No newline at end of file +} diff --git a/Tests/Functional/TestBundle/Controller/FooController.php b/Tests/Functional/TestBundle/Controller/FooController.php index 2ab9752..cf62350 100644 --- a/Tests/Functional/TestBundle/Controller/FooController.php +++ b/Tests/Functional/TestBundle/Controller/FooController.php @@ -20,4 +20,4 @@ public function barAction() { return new Response(); } -} \ No newline at end of file +} diff --git a/Tests/Functional/config/method_access_control.yml b/Tests/Functional/config/method_access_control.yml index 937de7c..18f9262 100644 --- a/Tests/Functional/config/method_access_control.yml +++ b/Tests/Functional/config/method_access_control.yml @@ -11,4 +11,7 @@ jms_security_extra: 'UserManager::delete$': 'hasRole("FOO")' 'TestBundle:Crud:add': 'hasRole("FOO")' 'TestBundle:Foo:exception': 'permitAll' - 'TestBundle:Foo:.*': 'hasRole("MOO")' \ No newline at end of file + 'TestBundle:Foo:.*': 'hasRole("MOO")' + AdvancedConfig: + pattern: 'TestBundle:Crud:edit$' + pre_authorize: 'hasRole("FOO")' diff --git a/Tests/Metadata/ClassMetadataTest.php b/Tests/Metadata/ClassMetadataTest.php index b7c0086..11c965f 100644 --- a/Tests/Metadata/ClassMetadataTest.php +++ b/Tests/Metadata/ClassMetadataTest.php @@ -47,14 +47,14 @@ public function testAnalyzeThrowsNoExceptionWhenAbstractMethodIsNotOverridenInDi $metadata = $metadata->methodMetadata['abstractMethod']; $this->assertEquals(array('VIEW'), $metadata->returnPermissions); } - + public function testAnalyzeThrowsNoExceptionWhenSatisfiesParentSecurityPolicyIsDefined() { $metadata = $this ->getFactory() ->getMetadataForClass('JMS\SecurityExtraBundle\Tests\Fixtures\CorrectSubService') ; - + $methods = $metadata->methodMetadata; $this->assertTrue(isset($methods['differentMethodSignature'])); diff --git a/Tests/Metadata/Driver/AnnotationDriverTest.php b/Tests/Metadata/Driver/AnnotationDriverTest.php index 16dc7cd..43035da 100644 --- a/Tests/Metadata/Driver/AnnotationDriverTest.php +++ b/Tests/Metadata/Driver/AnnotationDriverTest.php @@ -24,6 +24,9 @@ require_once __DIR__.'/Fixtures/services.php'; +/** + * @group driver + */ class AnnotationDriverTest extends \PHPUnit_Framework_TestCase { public function testLoadMetadataWithClassPreAuthorize() @@ -111,4 +114,4 @@ public function testLoadMetadataFromClassWithRolesAndPermissionsArrayNotation() $this->assertEquals(array(0 => array('OWNER')), $method->paramPermissions); $this->assertEquals(array('MASTER'), $method->returnPermissions); } -} \ No newline at end of file +} diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index bfd8d62..390fc02 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -6,6 +6,9 @@ use JMS\SecurityExtraBundle\Metadata\MethodMetadata; use JMS\SecurityExtraBundle\Metadata\Driver\ConfigDriver; +/** + * @group driver + */ class ConfigDriverTest extends \PHPUnit_Framework_TestCase { public function testLoadMetadata() @@ -46,6 +49,164 @@ public function testLoadMetadataWithoutConfig() $this->assertNull($driver->loadMetadataForClass($this->getClass('Controller\\CrudController'))); } + /** + * @dataProvider advancedConfigProvider + */ + public function testLoadAdvancedMetadata($config, $securedClass, $securedMethods) + { + $driver = new ConfigDriver(array(), $config); + + $reflection = new \ReflectionClass( + 'JMS\SecurityExtraBundle\Tests\Mapping\Driver\\'.$securedClass + ); + + $metadata = $driver->loadMetadataForClass($reflection); + + $this->assertEquals(1, count($metadata->methodMetadata)); + + foreach ($config as $configEntry) { + foreach ($configEntry as $key => $content) { + switch ($key) { + case 'pattern' : + break 2; + case 'pre_authorize': + $assert = "assertPreAuthorize"; + break; + case 'secure' : + $assert = "assertSecure"; + break; + case 'secure_param' : + $assert ="assertSecureParam"; + break; + case 'secure_return': + $assert = "assertSecureReturn"; + break; + case 'run_as' : + $assert = "assertRunAs"; + break; + case 'satisfies_parent_security_policy': + $assert = "assertSatisfiesParentSecurity"; + break; + default : + $this->fail("Unknown configuration key found: ". $key); + break; + } + + foreach ($metadata->methodMetadata as $name => $metadata) { + $this->assertEquals($name, current($securedMethods)); + $this->{$assert}($metadata, current($securedMethods), $content ); + + next($securedMethods); + } + } + } + } + + protected function assertPreAuthorize($loadedMethod, $config) + { + $expression = new Expression(current($config)); + + $this->assertEquals( + array($expression), $loadedMethod->roles, + sprintf("Expected expression %s got %s", $expression, $loadedMethod->roles) + ); + } + + protected function assertSecure($loadedMethod, $config) + { + $this->assertPreAuthorize($loadedMethod, $config); + } + + protected function assertSecureParam($loadedMethod, $config) + { + $expectedPermission = $loadedMethod->paramPermissions[$config['name']]; + + $this->assertEquals( + $expectedPermissions, $config['permission'], + sprintf("Expected parameter permission %s got %s", $expectedPermission, $config['permission']) + ); + } + + protected function assertSecureReturn($loadedMethod, $config) + { + $this->assertEquals( + $loadedMethod->returnPermissions, $config, + sprintf("Expected return permission %s got %s". $loadedMethod->returnPermission, $config) + ); + } + + protected function assertRunAs($loadedMethods, $expectedMethods, $config) + { + } + + protected function assertSatisfiesParentSecurity($loadedMethods, $expectedMethods, $config) + { + } + + public function advancedConfigProvider() + { + return array( + array( + 'config' => array(array( + 'pattern' => 'FooService::foo', + 'secure' => array( + 'roles' => array( + 'ROLE_USER', 'ROLE_ADMIN', 'ROLE_SUPERADMIN' + ), + ), + 'secure_param' => array('name' => 'param', 'permissions' => array('VIEW')), + )), + 'securedClass' => 'FooService', + 'securedMethods' => array('foo'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooService::shortNotation', + 'secure' => array( + 'roles' => array('ROLE_FOO', 'ROLE_BAR') + ), + )), + 'securedClass' => 'FooService', + 'securedMethods' => array('shortNotation'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooService::bar', + 'secure' => array('roles' => 'ROLE_FOO, ROLE_BAR'), + 'secure_param' => array( + 'name' => 'param', 'permissions' => array('OWNER') + ), + 'secure_return' => array('permissions' => 'MASTER'), + )), + 'securedClass' => 'FooService', + 'securedMethods' => array('bar'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooSecureService::foo', + 'secure_param' => array( + 'name' => 'anotherParam', 'permissions' => array('EDIT') + ), + )), + 'securedClass' => 'FooSecureService', + 'securedMethods' => array('foo'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooMultipleSecureService::foo', + 'secure_param' => array( + 'name' => 'param', 'permissions' => array('VIEW') + ), + 'secure_param' => array( + 'name' => 'anotherParam', 'permissions' => array('EDIT') + ), + )), + 'securedClass' => 'FooMultipleSecureService', + 'securedMethods' => array('foo'), + ), + ); + } + private function getClass($name) { return new \ReflectionClass('JMS\SecurityExtraBundle\Tests\Metadata\Driver\Fixtures\\'.$name); diff --git a/composer.lock b/composer.lock deleted file mode 100644 index cb0afed..0000000 --- a/composer.lock +++ /dev/null @@ -1,2852 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" - ], - "hash": "245b473818cbc4ba651db063782d7a2b", - "packages": [ - { - "name": "doctrine/annotations", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "v1.1.1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/v1.1.1", - "reference": "v1.1.1", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "doctrine/cache": "1.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Annotations\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2013-04-20 08:30:17" - }, - { - "name": "doctrine/cache", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "89493d2c6e1362f581f9de1c1871cc52eb29c030" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/89493d2c6e1362f581f9de1c1871cc52eb29c030", - "reference": "89493d2c6e1362f581f9de1c1871cc52eb29c030", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Cache\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "cache", - "caching" - ], - "time": "2013-06-07 14:54:47" - }, - { - "name": "doctrine/collections", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "3db3ab843ff76774bee4679d4cb3a10cffb0a935" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/3db3ab843ff76774bee4679d4cb3a10cffb0a935", - "reference": "3db3ab843ff76774bee4679d4cb3a10cffb0a935", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Collections\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Collections Abstraction library", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "array", - "collections", - "iterator" - ], - "time": "2013-05-26 05:21:22" - }, - { - "name": "doctrine/common", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe", - "reference": "2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe", - "shasum": "" - }, - "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "collections", - "eventmanager", - "persistence", - "spl" - ], - "time": "2013-05-27 19:11:46" - }, - { - "name": "doctrine/inflector", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", - "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "inflection", - "pluralize", - "singularize", - "string" - ], - "time": "2013-04-10 16:14:30" - }, - { - "name": "doctrine/lexer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", - "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "lexer", - "parser" - ], - "time": "2013-03-07 12:15:25" - }, - { - "name": "jms/aop-bundle", - "version": "dev-master", - "target-dir": "JMS/AopBundle", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/JMSAopBundle.git", - "reference": "7018357f5bedf204979a88867a9da05973744422" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSAopBundle/zipball/7018357f5bedf204979a88867a9da05973744422", - "reference": "7018357f5bedf204979a88867a9da05973744422", - "shasum": "" - }, - "require": { - "jms/cg": "1.*", - "symfony/framework-bundle": "2.*" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\AopBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Adds AOP capabilities to Symfony2", - "keywords": [ - "annotations", - "aop" - ], - "time": "2013-01-09 08:03:40" - }, - { - "name": "jms/cg", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/cg-library.git", - "reference": "75a519d83a33f6b893a25aef835a1e5fc166a6d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/cg-library/zipball/75a519d83a33f6b893a25aef835a1e5fc166a6d7", - "reference": "75a519d83a33f6b893a25aef835a1e5fc166a6d7", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-0": { - "CG\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Toolset for generating PHP code", - "keywords": [ - "code generation" - ], - "time": "2013-03-23 08:03:00" - }, - { - "name": "jms/di-extra-bundle", - "version": "dev-master", - "target-dir": "JMS/DiExtraBundle", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/JMSDiExtraBundle.git", - "reference": "a15367768d8bbf0b5eac135adf31880ed99cc12d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSDiExtraBundle/zipball/a15367768d8bbf0b5eac135adf31880ed99cc12d", - "reference": "a15367768d8bbf0b5eac135adf31880ed99cc12d", - "shasum": "" - }, - "require": { - "jms/aop-bundle": ">=1.0.0,<1.2-dev", - "jms/metadata": "1.*", - "symfony/finder": ">=2.1,<3.0", - "symfony/framework-bundle": ">=2.1,<3.0", - "symfony/process": ">=2.1,<3.0" - }, - "require-dev": { - "doctrine/doctrine-bundle": "*", - "doctrine/orm": "*", - "jms/security-extra-bundle": "1.*", - "phpcollection/phpcollection": ">=0.1,<0.3-dev", - "sensio/framework-extra-bundle": "*", - "symfony/browser-kit": "*", - "symfony/class-loader": "*", - "symfony/form": "*", - "symfony/security-bundle": "*", - "symfony/twig-bundle": "*", - "symfony/validator": "*", - "symfony/yaml": "*" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\DiExtraBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Allows to configure dependency injection using annotations", - "homepage": "http://jmsyst.com/bundles/JMSDiExtraBundle", - "keywords": [ - "annotations", - "dependency injection" - ], - "time": "2013-03-21 16:34:41" - }, - { - "name": "jms/metadata", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/metadata.git", - "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", - "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "doctrine/common": ">=2.0,<2.4-dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Metadata\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Class/method/property metadata management in PHP", - "keywords": [ - "annotations", - "metadata", - "xml", - "yaml" - ], - "time": "2013-03-28 16:32:37" - }, - { - "name": "jms/parser-lib", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/parser-lib.git", - "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", - "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", - "shasum": "" - }, - "require": { - "phpoption/phpoption": ">=0.9,<2.0-dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A library for easily creating recursive-descent parsers.", - "time": "2012-11-30 08:11:04" - }, - { - "name": "phpoption/phpoption", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/1c7e8016289d17d83ced49c56d0f266fd0568941", - "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-0": { - "PhpOption\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "time": "2013-05-19 11:09:35" - }, - { - "name": "psr/log", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log", - "reference": "1.0.0" - }, - "dist": { - "type": "zip", - "url": "https://github.com/php-fig/log/archive/1.0.0.zip", - "reference": "1.0.0", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Psr\\Log\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2012-12-21 11:40:51" - }, - { - "name": "symfony/config", - "version": "dev-master", - "target-dir": "Symfony/Component/Config", - "source": { - "type": "git", - "url": "https://github.com/symfony/Config.git", - "reference": "c2e148f4d1daa2ae407a27a07ff433fadfd6de77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/c2e148f4d1daa2ae407a27a07ff433fadfd6de77", - "reference": "c2e148f4d1daa2ae407a27a07ff433fadfd6de77", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/filesystem": ">=2.3,<3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Config\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/debug", - "version": "dev-master", - "target-dir": "Symfony/Component/Debug", - "source": { - "type": "git", - "url": "https://github.com/symfony/Debug.git", - "reference": "bcf326c347d9e2ccafde5e30fb938e09255f6c1a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Debug/zipball/bcf326c347d9e2ccafde5e30fb938e09255f6c1a", - "reference": "bcf326c347d9e2ccafde5e30fb938e09255f6c1a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/http-foundation": ">=2.1,<3.0", - "symfony/http-kernel": ">=2.1,<3.0" - }, - "suggest": { - "symfony/class-loader": "", - "symfony/http-foundation": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Debug\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/dependency-injection", - "version": "dev-master", - "target-dir": "Symfony/Component/DependencyInjection", - "source": { - "type": "git", - "url": "https://github.com/symfony/DependencyInjection.git", - "reference": "db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9", - "reference": "db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/config": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "symfony/config": "", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\DependencyInjection\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/event-dispatcher", - "version": "dev-master", - "target-dir": "Symfony/Component/EventDispatcher", - "source": { - "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "4b34aad44d0a2d91f301ee967151ce0980f39930" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/4b34aad44d0a2d91f301ee967151ce0980f39930", - "reference": "4b34aad44d0a2d91f301ee967151ce0980f39930", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/dependency-injection": ">=2.0,<3.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/filesystem", - "version": "dev-master", - "target-dir": "Symfony/Component/Filesystem", - "source": { - "type": "git", - "url": "https://github.com/symfony/Filesystem.git", - "reference": "3567f5f48305098044c6d6a383f5cefec9c45efa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/3567f5f48305098044c6d6a383f5cefec9c45efa", - "reference": "3567f5f48305098044c6d6a383f5cefec9c45efa", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Filesystem\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/finder", - "version": "dev-master", - "target-dir": "Symfony/Component/Finder", - "source": { - "type": "git", - "url": "https://github.com/symfony/Finder.git", - "reference": "b709a80b766b47761ae1d1e27a6fa6b4e62dcf08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/b709a80b766b47761ae1d1e27a6fa6b4e62dcf08", - "reference": "b709a80b766b47761ae1d1e27a6fa6b4e62dcf08", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Finder\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/framework-bundle", - "version": "dev-master", - "target-dir": "Symfony/Bundle/FrameworkBundle", - "source": { - "type": "git", - "url": "https://github.com/symfony/FrameworkBundle.git", - "reference": "28fa76f09660af3fa45dde1ad4c296c8758cec5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/FrameworkBundle/zipball/28fa76f09660af3fa45dde1ad4c296c8758cec5e", - "reference": "28fa76f09660af3fa45dde1ad4c296c8758cec5e", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.2,<3.0", - "php": ">=5.3.3", - "symfony/config": ">=2.2,<3.0", - "symfony/dependency-injection": ">=2.2,<3.0", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/filesystem": ">=2.3,<3.0", - "symfony/http-kernel": ">=2.3,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/stopwatch": ">=2.3,<3.0", - "symfony/templating": ">=2.1,<3.0", - "symfony/translation": ">=2.3,<3.0" - }, - "require-dev": { - "symfony/class-loader": ">=2.1,<3.0", - "symfony/finder": ">=2.0,<3.0", - "symfony/form": ">=2.3,<3.0", - "symfony/security": ">=2.3,<3.0", - "symfony/validator": ">=2.1,<3.0" - }, - "suggest": { - "symfony/console": "", - "symfony/finder": "", - "symfony/form": "", - "symfony/validator": "" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony FrameworkBundle", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/http-foundation", - "version": "dev-master", - "target-dir": "Symfony/Component/HttpFoundation", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "f484475d926fe5dad901c559ef1bef395385b3a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/f484475d926fe5dad901c559ef1bef395385b3a9", - "reference": "f484475d926fe5dad901c559ef1bef395385b3a9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "classmap": [ - "Symfony/Component/HttpFoundation/Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "http://symfony.com", - "time": "2013-06-04 15:12:29" - }, - { - "name": "symfony/http-kernel", - "version": "dev-master", - "target-dir": "Symfony/Component/HttpKernel", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpKernel.git", - "reference": "884e196581541a9801e1a0b0000ddf2118dcc30c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/884e196581541a9801e1a0b0000ddf2118dcc30c", - "reference": "884e196581541a9801e1a0b0000ddf2118dcc30c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "psr/log": ">=1.0,<2.0", - "symfony/debug": ">=2.3,<3.0", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/http-foundation": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/browser-kit": "2.2.*", - "symfony/class-loader": ">=2.1,<3.0", - "symfony/config": ">=2.0,<3.0", - "symfony/console": "2.2.*", - "symfony/dependency-injection": ">=2.0,<3.0", - "symfony/finder": ">=2.0,<3.0", - "symfony/process": ">=2.0,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/stopwatch": ">=2.2,<3.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/class-loader": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpKernel\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/process", - "version": "dev-master", - "target-dir": "Symfony/Component/Process", - "source": { - "type": "git", - "url": "https://github.com/symfony/Process.git", - "reference": "75c810176f8e069714cef8696d7ecc3aa86e8168" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/75c810176f8e069714cef8696d7ecc3aa86e8168", - "reference": "75c810176f8e069714cef8696d7ecc3aa86e8168", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Process\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/routing", - "version": "dev-master", - "target-dir": "Symfony/Component/Routing", - "source": { - "type": "git", - "url": "https://github.com/symfony/Routing.git", - "reference": "93fa88b2494d3262c87ca0762551a658cc390669" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/93fa88b2494d3262c87ca0762551a658cc390669", - "reference": "93fa88b2494d3262c87ca0762551a658cc390669", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "doctrine/common": ">=2.2,<3.0", - "psr/log": ">=1.0,<2.0", - "symfony/config": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "doctrine/common": "", - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Routing\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Routing Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/security", - "version": "dev-master", - "target-dir": "Symfony/Component/Security", - "source": { - "type": "git", - "url": "https://github.com/symfony/Security.git", - "reference": "693c2395ef2f1d27d04c56bf6172202c90c95697" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Security/zipball/693c2395ef2f1d27d04c56bf6172202c90c95697", - "reference": "693c2395ef2f1d27d04c56bf6172202c90c95697", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/http-foundation": ">=2.1,<3.0", - "symfony/http-kernel": ">=2.1,<3.0" - }, - "require-dev": { - "doctrine/common": ">=2.2,<3.0", - "doctrine/dbal": ">=2.2,<3.0", - "ircmaxell/password-compat": "1.0.*", - "psr/log": ">=1.0,<2.0", - "symfony/form": ">=2.0,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0" - }, - "suggest": { - "doctrine/dbal": "to use the built-in ACL implementation", - "ircmaxell/password-compat": "", - "symfony/class-loader": "", - "symfony/finder": "", - "symfony/form": "", - "symfony/routing": "", - "symfony/validator": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Security\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Security Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/security-bundle", - "version": "dev-master", - "target-dir": "Symfony/Bundle/SecurityBundle", - "source": { - "type": "git", - "url": "https://github.com/symfony/SecurityBundle.git", - "reference": "ff1b9ca906cd405f0a3e07841abcc9c8417f44cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/SecurityBundle/zipball/ff1b9ca906cd405f0a3e07841abcc9c8417f44cd", - "reference": "ff1b9ca906cd405f0a3e07841abcc9c8417f44cd", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/http-kernel": ">=2.2,<3.0", - "symfony/security": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/form": ">=2.1,<3.0", - "symfony/framework-bundle": ">=2.2,<3.0", - "symfony/twig-bundle": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bundle\\SecurityBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony SecurityBundle", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/stopwatch", - "version": "dev-master", - "target-dir": "Symfony/Component/Stopwatch", - "source": { - "type": "git", - "url": "https://github.com/symfony/Stopwatch.git", - "reference": "453f661bad0ec73417ccce9853b1dc6c2a885db1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/453f661bad0ec73417ccce9853b1dc6c2a885db1", - "reference": "453f661bad0ec73417ccce9853b1dc6c2a885db1", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Stopwatch\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/templating", - "version": "dev-master", - "target-dir": "Symfony/Component/Templating", - "source": { - "type": "git", - "url": "https://github.com/symfony/Templating.git", - "reference": "cd1b2c0a6f67844f44efdbd365bcd33b546ce713" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Templating/zipball/cd1b2c0a6f67844f44efdbd365bcd33b546ce713", - "reference": "cd1b2c0a6f67844f44efdbd365bcd33b546ce713", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Templating\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Templating Component", - "homepage": "http://symfony.com", - "time": "2013-06-04 15:16:10" - }, - { - "name": "symfony/translation", - "version": "dev-master", - "target-dir": "Symfony/Component/Translation", - "source": { - "type": "git", - "url": "https://github.com/symfony/Translation.git", - "reference": "ed0c7257bfc533205dff78f9d247c2544c830ddc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/ed0c7257bfc533205dff78f9d247c2544c830ddc", - "reference": "ed0c7257bfc533205dff78f9d247c2544c830ddc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/config": ">=2.0,<3.0", - "symfony/yaml": ">=2.2,<3.0" - }, - "suggest": { - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Translation Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - } - ], - "packages-dev": [ - { - "name": "doctrine/dbal", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750", - "reference": "5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750", - "shasum": "" - }, - "require": { - "doctrine/common": "2.4.*@beta", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*", - "symfony/console": "2.*" - }, - "suggest": { - "symfony/console": "Allows use of the command line interface" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\DBAL\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - } - ], - "description": "Database Abstraction Layer", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "persistence", - "queryobject" - ], - "time": "2013-06-07 18:55:27" - }, - { - "name": "doctrine/doctrine-bundle", - "version": "dev-master", - "target-dir": "Doctrine/Bundle/DoctrineBundle", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "9218b4116e86b1d278564b8550fb2f53eb400093" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/9218b4116e86b1d278564b8550fb2f53eb400093", - "reference": "9218b4116e86b1d278564b8550fb2f53eb400093", - "shasum": "" - }, - "require": { - "doctrine/dbal": ">=2.2,<2.5-dev", - "jdorn/sql-formatter": ">=1.1,<2.0", - "php": ">=5.3.2", - "symfony/doctrine-bridge": ">=2.2,<3.0", - "symfony/framework-bundle": ">=2.2,<3.0" - }, - "require-dev": { - "doctrine/orm": ">=2.2,<2.5-dev", - "symfony/validator": ">=2.2,<3.0", - "symfony/yaml": ">=2.2,<3.0" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "symfony/web-profiler-bundle": "to use the data collector" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Bundle\\DoctrineBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - } - ], - "description": "Symfony DoctrineBundle", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], - "time": "2013-05-04 07:57:29" - }, - { - "name": "doctrine/orm", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/doctrine2.git", - "reference": "462173ad71ae63cd9877e1e642f7968ed1f9971b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/462173ad71ae63cd9877e1e642f7968ed1f9971b", - "reference": "462173ad71ae63cd9877e1e642f7968ed1f9971b", - "shasum": "" - }, - "require": { - "doctrine/collections": ">=1.1,<2.0", - "doctrine/dbal": ">=2.4-beta,<2.5-dev", - "ext-pdo": "*", - "php": ">=5.3.2", - "symfony/console": "2.*" - }, - "require-dev": { - "symfony/yaml": "2.1" - }, - "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine", - "bin/doctrine.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\ORM\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "orm" - ], - "time": "2013-06-07 21:42:59" - }, - { - "name": "jdorn/sql-formatter", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "v1.2.9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/v1.2.9", - "reference": "v1.2.9", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "lib" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "time": "2013-04-26 18:42:52" - }, - { - "name": "sensio/framework-extra-bundle", - "version": "dev-master", - "target-dir": "Sensio/Bundle/FrameworkExtraBundle", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "v2.3.0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/v2.3.0", - "reference": "v2.3.0", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.2,<3.0", - "symfony/framework-bundle": ">=2.2,<3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Sensio\\Bundle\\FrameworkExtraBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "time": "2013-06-02 16:13:20" - }, - { - "name": "symfony/browser-kit", - "version": "dev-master", - "target-dir": "Symfony/Component/BrowserKit", - "source": { - "type": "git", - "url": "https://github.com/symfony/BrowserKit.git", - "reference": "2d2343dac844a365bd28a7cefd56b47d09e62dda" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/2d2343dac844a365bd28a7cefd56b47d09e62dda", - "reference": "2d2343dac844a365bd28a7cefd56b47d09e62dda", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/dom-crawler": ">=2.0,<3.0" - }, - "require-dev": { - "symfony/css-selector": ">=2.0,<3.0", - "symfony/process": ">=2.0,<3.0" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\BrowserKit\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony BrowserKit Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/class-loader", - "version": "dev-master", - "target-dir": "Symfony/Component/ClassLoader", - "source": { - "type": "git", - "url": "https://github.com/symfony/ClassLoader.git", - "reference": "0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776", - "reference": "0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/finder": ">=2.0,<3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\ClassLoader\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony ClassLoader Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/console", - "version": "dev-master", - "target-dir": "Symfony/Component/Console", - "source": { - "type": "git", - "url": "https://github.com/symfony/Console.git", - "reference": "28b4eced63a11275583345feb3c8269967819eca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/28b4eced63a11275583345feb3c8269967819eca", - "reference": "28b4eced63a11275583345feb3c8269967819eca", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/event-dispatcher": ">=2.1,<3.0" - }, - "suggest": { - "symfony/event-dispatcher": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Console\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "http://symfony.com", - "time": "2013-06-04 15:09:18" - }, - { - "name": "symfony/css-selector", - "version": "dev-master", - "target-dir": "Symfony/Component/CssSelector", - "source": { - "type": "git", - "url": "https://github.com/symfony/CssSelector.git", - "reference": "504601ed1aff97d2327a4f65f3f76ac478c57d45" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/CssSelector/zipball/504601ed1aff97d2327a4f65f3f76ac478c57d45", - "reference": "504601ed1aff97d2327a4f65f3f76ac478c57d45", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\CssSelector\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/doctrine-bridge", - "version": "dev-master", - "target-dir": "Symfony/Bridge/Doctrine", - "source": { - "type": "git", - "url": "https://github.com/symfony/DoctrineBridge.git", - "reference": "b65586b8cf8b5907a3de7290c0b43822ccb5edc8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/DoctrineBridge/zipball/b65586b8cf8b5907a3de7290c0b43822ccb5edc8", - "reference": "b65586b8cf8b5907a3de7290c0b43822ccb5edc8", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.2,<3.0", - "php": ">=5.3.3" - }, - "require-dev": { - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": ">=2.2,<3.0", - "doctrine/orm": ">=2.2,<3.0,>=2.2.3", - "symfony/dependency-injection": ">=2.0,<3.0", - "symfony/form": ">=2.2,<3.0", - "symfony/http-kernel": ">=2.2,<3.0", - "symfony/security": ">=2.2,<3.0", - "symfony/stopwatch": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/validator": "" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bridge\\Doctrine\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Doctrine Bridge", - "homepage": "http://symfony.com", - "time": "2013-05-16 20:40:38" - }, - { - "name": "symfony/dom-crawler", - "version": "dev-master", - "target-dir": "Symfony/Component/DomCrawler", - "source": { - "type": "git", - "url": "https://github.com/symfony/DomCrawler.git", - "reference": "09f0cd5980511ee77c2e8142405ccd5c867506b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/09f0cd5980511ee77c2e8142405ccd5c867506b9", - "reference": "09f0cd5980511ee77c2e8142405ccd5c867506b9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/css-selector": ">=2.0,<3.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\DomCrawler\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/form", - "version": "dev-master", - "target-dir": "Symfony/Component/Form", - "source": { - "type": "git", - "url": "https://github.com/symfony/Form.git", - "reference": "3f33335a1217b6e7d2489dbde50da6b4bf3593cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Form/zipball/3f33335a1217b6e7d2489dbde50da6b4bf3593cc", - "reference": "3f33335a1217b6e7d2489dbde50da6b4bf3593cc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/intl": ">=2.3,<3.0", - "symfony/options-resolver": ">=2.1,<3.0", - "symfony/property-access": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/http-foundation": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0" - }, - "suggest": { - "symfony/http-foundation": "", - "symfony/validator": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Form\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Form Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/icu", - "version": "1.2.x-dev", - "target-dir": "Symfony/Component/Icu", - "source": { - "type": "git", - "url": "https://github.com/symfony/Icu.git", - "reference": "v1.2.0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Icu/zipball/v1.2.0", - "reference": "v1.2.0", - "shasum": "" - }, - "require": { - "lib-icu": ">=4.4", - "php": ">=5.3.3", - "symfony/intl": ">=2.3,<3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Symfony\\Component\\Icu\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Contains an excerpt of the ICU data and classes to load it.", - "homepage": "http://symfony.com", - "keywords": [ - "icu", - "intl" - ], - "time": "2013-06-03 18:32:58" - }, - { - "name": "symfony/intl", - "version": "dev-master", - "target-dir": "Symfony/Component/Intl", - "source": { - "type": "git", - "url": "https://github.com/symfony/Intl.git", - "reference": "5199c826bc2c44cd8becfc75e6ab266b37d01b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Intl/zipball/5199c826bc2c44cd8becfc75e6ab266b37d01b6a", - "reference": "5199c826bc2c44cd8becfc75e6ab266b37d01b6a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/icu": ">=1.0-RC,<2.0" - }, - "require-dev": { - "symfony/filesystem": ">=2.1" - }, - "suggest": { - "ext-intl": "to use the component with locales other than \"en\"" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Intl\\": "" - }, - "classmap": [ - "Symfony/Component/Intl/Resources/stubs" - ], - "files": [ - "Symfony/Component/Intl/Resources/stubs/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch", - "homepage": "http://wiedler.ch/igor/" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - }, - { - "name": "Eriksen Costa", - "email": "eriksen.costa@infranology.com.br" - } - ], - "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", - "homepage": "http://symfony.com", - "keywords": [ - "i18n", - "icu", - "internationalization", - "intl", - "l10n", - "localization" - ], - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/options-resolver", - "version": "dev-master", - "target-dir": "Symfony/Component/OptionsResolver", - "source": { - "type": "git", - "url": "https://github.com/symfony/OptionsResolver.git", - "reference": "48d9182e515128e6d18be9ca776a818223d39f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/48d9182e515128e6d18be9ca776a818223d39f52", - "reference": "48d9182e515128e6d18be9ca776a818223d39f52", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\OptionsResolver\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony OptionsResolver Component", - "homepage": "http://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/property-access", - "version": "dev-master", - "target-dir": "Symfony/Component/PropertyAccess", - "source": { - "type": "git", - "url": "https://github.com/symfony/PropertyAccess.git", - "reference": "3ed937623a4c1e491f46ebf8111f177ce67e13ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/3ed937623a4c1e491f46ebf8111f177ce67e13ba", - "reference": "3ed937623a4c1e491f46ebf8111f177ce67e13ba", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\PropertyAccess\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony PropertyAccess Component", - "homepage": "http://symfony.com", - "keywords": [ - "access", - "array", - "extraction", - "index", - "injection", - "object", - "property", - "property path", - "reflection" - ], - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/twig-bridge", - "version": "dev-master", - "target-dir": "Symfony/Bridge/Twig", - "source": { - "type": "git", - "url": "https://github.com/symfony/TwigBridge.git", - "reference": "126d31387ab33074ffa9d023cc83a700ad1db238" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/126d31387ab33074ffa9d023cc83a700ad1db238", - "reference": "126d31387ab33074ffa9d023cc83a700ad1db238", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "twig/twig": ">=1.11.0,<2.0" - }, - "require-dev": { - "symfony/form": "2.2.*", - "symfony/http-kernel": ">=2.2,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/security": ">=2.0,<3.0", - "symfony/templating": ">=2.1,<3.0", - "symfony/translation": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "symfony/form": "", - "symfony/http-kernel": "", - "symfony/routing": "", - "symfony/security": "", - "symfony/templating": "", - "symfony/translation": "", - "symfony/yaml": "" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bridge\\Twig\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "http://symfony.com", - "time": "2013-05-16 20:40:38" - }, - { - "name": "symfony/twig-bundle", - "version": "dev-master", - "target-dir": "Symfony/Bundle/TwigBundle", - "source": { - "type": "git", - "url": "https://github.com/symfony/TwigBundle.git", - "reference": "c502e341a0b8ed25e76d692f5fcc18640bb7b80a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/TwigBundle/zipball/c502e341a0b8ed25e76d692f5fcc18640bb7b80a", - "reference": "c502e341a0b8ed25e76d692f5fcc18640bb7b80a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/http-kernel": ">=2.1,<3.0", - "symfony/twig-bridge": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/config": ">=2.2,<3.0", - "symfony/dependency-injection": ">=2.0,<3.0", - "symfony/stopwatch": ">=2.2,<3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bundle\\TwigBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/validator", - "version": "dev-master", - "target-dir": "Symfony/Component/Validator", - "source": { - "type": "git", - "url": "https://github.com/symfony/Validator.git", - "reference": "a530bb62eb01865e1212ef1bf1e2166151c33c17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Validator/zipball/a530bb62eb01865e1212ef1bf1e2166151c33c17", - "reference": "a530bb62eb01865e1212ef1bf1e2166151c33c17", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/translation": ">=2.0,<3.0" - }, - "require-dev": { - "symfony/config": ">=2.2,<3.0", - "symfony/http-foundation": ">=2.1,<3.0", - "symfony/intl": ">=2.3,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "doctrine/common": "", - "symfony/config": "", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Validator\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Validator Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/yaml", - "version": "dev-master", - "target-dir": "Symfony/Component/Yaml", - "source": { - "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "82100c7732c95452702d11433aad50988700d36c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/82100c7732c95452702d11433aad50988700d36c", - "reference": "82100c7732c95452702d11433aad50988700d36c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Yaml\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "twig/twig", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/fabpot/Twig.git", - "reference": "1a6507043782f18e3765b52712cf78d16f3117e7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fabpot/Twig/zipball/1a6507043782f18e3765b52712cf78d16f3117e7", - "reference": "1a6507043782f18e3765b52712cf78d16f3117e7", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", - "keywords": [ - "templating" - ], - "time": "2013-06-07 06:24:46" - } - ], - "aliases": [ - - ], - "minimum-stability": "dev", - "stability-flags": [ - - ], - "platform": [ - - ], - "platform-dev": [ - - ] -} From 6a8abde264eb2b9b7ab97d5030ebbf09ce057307 Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 23 Sep 2013 13:15:08 -0400 Subject: [PATCH 02/32] Fixed test conflict --- Tests/Functional/MethodAccessControlTest.php | 4 ++-- Tests/Functional/TestBundle/Controller/CrudController.php | 7 ++++++- Tests/Functional/config/method_access_control.yml | 2 +- Tests/Functional/config/routing.yml | 7 ++++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Tests/Functional/MethodAccessControlTest.php b/Tests/Functional/MethodAccessControlTest.php index 7852573..cae96db 100644 --- a/Tests/Functional/MethodAccessControlTest.php +++ b/Tests/Functional/MethodAccessControlTest.php @@ -64,11 +64,11 @@ public function testUserManagerDeleteIsSecure() /** * @runInSeparateProcess */ - public function testCrudEditIsSecureWithAdvancedConfiguration() + public function testCrudDeleteIsSecureWithAdvancedConfiguration() { $client = $this->createClient(array('config' => 'method_access_control.yml')); - $client->request('GET', '/edit'); + $client->request('GET', '/delete'); $this->assertRedirectedToLogin($client->getResponse()); } diff --git a/Tests/Functional/TestBundle/Controller/CrudController.php b/Tests/Functional/TestBundle/Controller/CrudController.php index ae90060..4be6a55 100644 --- a/Tests/Functional/TestBundle/Controller/CrudController.php +++ b/Tests/Functional/TestBundle/Controller/CrudController.php @@ -15,4 +15,9 @@ public function editAction() { return new Response(); } -} \ No newline at end of file + + public function deleteAction() + { + return new Response(); + } +} diff --git a/Tests/Functional/config/method_access_control.yml b/Tests/Functional/config/method_access_control.yml index 18f9262..bf0a1c0 100644 --- a/Tests/Functional/config/method_access_control.yml +++ b/Tests/Functional/config/method_access_control.yml @@ -13,5 +13,5 @@ jms_security_extra: 'TestBundle:Foo:exception': 'permitAll' 'TestBundle:Foo:.*': 'hasRole("MOO")' AdvancedConfig: - pattern: 'TestBundle:Crud:edit$' + pattern: 'TestBundle:Crud:delete$' pre_authorize: 'hasRole("FOO")' diff --git a/Tests/Functional/config/routing.yml b/Tests/Functional/config/routing.yml index 8550813..ea5c48f 100644 --- a/Tests/Functional/config/routing.yml +++ b/Tests/Functional/config/routing.yml @@ -8,6 +8,11 @@ crud_controller_edit: defaults: _controller: TestBundle:Crud:edit +crud_controller_delete: + pattern: /delete + defaults: + _controller: TestBundle:Crud:delete + post_controller_add: pattern: /post/add defaults: @@ -44,4 +49,4 @@ foo_bar: foo_exception: pattern: /foo/exception defaults: - _controller: TestBundle:Foo:exception \ No newline at end of file + _controller: TestBundle:Foo:exception From c445d15e3c6811d607b119658a5b92eea97a2194 Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 23 Sep 2013 13:16:33 -0400 Subject: [PATCH 03/32] fixed doc --- Metadata/Driver/AbstractDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Metadata/Driver/AbstractDriver.php b/Metadata/Driver/AbstractDriver.php index bfec961..17d5697 100644 --- a/Metadata/Driver/AbstractDriver.php +++ b/Metadata/Driver/AbstractDriver.php @@ -59,7 +59,7 @@ public function loadMetadataForClass(\ReflectionClass $class) * violation of liskov substitution principle implied by the conjunction * use of MetadataFactory and DriverChain. * - * For more information about this bug, see issue #145 at + * For more information about this bug, see issue #145 at github (see below) * * @param ClassMetadata $metadata * From a0092a297e624369a44601eefa449886fe5c2859 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 24 Sep 2013 12:07:10 -0400 Subject: [PATCH 04/32] Fixed indentation of switch/case statements, fixed pluralization normalization for XML config and removed value setting for Symfony comformity in DI-configuration vaidation --- DependencyInjection/Configuration.php | 7 ++- Metadata/Driver/ConfigDriver.php | 59 +++++++++---------- .../JMSSecurityExtraExtensionTest.php | 1 - Tests/Metadata/Driver/ConfigDriverTest.php | 56 +++++++++--------- 4 files changed, 62 insertions(+), 61 deletions(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 9891dd8..646d1f3 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -75,7 +75,6 @@ public function getConfigTreeBuilder() foreach ($node as $key => $value) { if (is_string($value)) { $node[$key] = array( - 'pattern' => $key, 'pre_authorize' => $value ); } @@ -84,25 +83,29 @@ public function getConfigTreeBuilder() return $node; }) ->end() - ->useAttributeAsKey('pattern', false) + ->useAttributeAsKey('pattern') ->prototype('array') ->children() ->scalarNode('pattern')->end() ->scalarNode('pre_authorize')->cannotBeEmpty()->end() ->arrayNode('secure') + ->fixXmlConfig('role') ->children() ->arrayNode('roles')->prototype('scalar')->end() ->end() ->arrayNode('secure_param') + ->fixXmlConfig('permission') ->children() ->scalarNode('name')->end() ->arrayNode('permissions')->prototype('scalar')->end() ->end() ->arrayNode('secure_return') + ->fixXmlConfig('permission') ->children() ->arrayNode('permissions')->prototype('scalar')->end() ->end() ->arrayNode('run_as') + ->fixXmlConfig('role') ->children() ->arrayNode('roles')->prototype('scalar')->end() ->end() diff --git a/Metadata/Driver/ConfigDriver.php b/Metadata/Driver/ConfigDriver.php index a7c7f88..4f90f9d 100644 --- a/Metadata/Driver/ConfigDriver.php +++ b/Metadata/Driver/ConfigDriver.php @@ -38,7 +38,6 @@ public function __construct(array $bundles, array $config) foreach ($config as $key => $value) { if (is_string($value)) { $this->config[$key] = array( - 'pattern' => $key, 'pre_authorize' => $value ); } else { @@ -94,33 +93,33 @@ protected function fromMetadataConfig(\ReflectionMethod $method, array $configs) foreach ($configs['method'] as $name => $config) { switch ($name) { - case "pre_authorize": - $methodMetadata->roles = array(new Expression($config)); - $hasSecurityMetadata = true; - break; - case "secure": - $methodMetadata->roles = $config['roles']; - $hasSecurityMetadata = true; - break; - case "secure_param": - $this->assertParamExistsForMethod($parameters, $config['name'], $method->name); - $methodMetadata->addParamPermissions( - $parameters[$config['name']], $config['permissions'] - ); - $hasSecurityMetadata = true; - break; - case "secure_return": - $methodMetadata->returnPermissions = $config['permissions']; - $hasSecurityMetadata = true; - break; - case "run_as": - $methodMetadata->runAsRoles = $config['roles']; - $hasSecurityMetadata = true; - break; - case "satisfies_parent_security_policy": - $methodMetadata->satisfiesParentSecurityPolicy = true; - $hasSecurityMetadata = true; - break; + case "pre_authorize": + $methodMetadata->roles = array(new Expression($config)); + $hasSecurityMetadata = true; + break; + case "secure": + $methodMetadata->roles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "secure_param": + $this->assertParamExistsForMethod($parameters, $config['name'], $method->name); + $methodMetadata->addParamPermissions( + $parameters[$config['name']], $config['permissions'] + ); + $hasSecurityMetadata = true; + break; + case "secure_return": + $methodMetadata->returnPermissions = $config['permissions']; + $hasSecurityMetadata = true; + break; + case "run_as": + $methodMetadata->runAsRoles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "satisfies_parent_security_policy": + $methodMetadata->satisfiesParentSecurityPolicy = true; + $hasSecurityMetadata = true; + break; } } @@ -131,8 +130,8 @@ protected function getConfigForSignature($signature) { $configurationFound = null; - foreach ($this->config as $config) { - if (!preg_match('#'.$config['pattern'].'#i', $signature)) { + foreach ($this->config as $pattern => $config) { + if (!preg_match('#'.$pattern.'#i', $signature)) { continue; } diff --git a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php index 6e57aa5..802c7c6 100644 --- a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php +++ b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php @@ -63,7 +63,6 @@ public function testConfigLoadWithMethodAccessControl() $this->assertEquals( array( ':login$' => array( - 'pattern' => ':login$', 'pre_authorize' => 'hasRole("FOO")', ) ), diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index 390fc02..25fed52 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -67,29 +67,29 @@ public function testLoadAdvancedMetadata($config, $securedClass, $securedMethods foreach ($config as $configEntry) { foreach ($configEntry as $key => $content) { switch ($key) { - case 'pattern' : - break 2; - case 'pre_authorize': - $assert = "assertPreAuthorize"; - break; - case 'secure' : - $assert = "assertSecure"; - break; - case 'secure_param' : - $assert ="assertSecureParam"; - break; - case 'secure_return': - $assert = "assertSecureReturn"; - break; - case 'run_as' : - $assert = "assertRunAs"; - break; - case 'satisfies_parent_security_policy': - $assert = "assertSatisfiesParentSecurity"; - break; - default : - $this->fail("Unknown configuration key found: ". $key); - break; + case 'pattern' : + break 2; + case 'pre_authorize': + $assert = "assertPreAuthorize"; + break; + case 'secure' : + $assert = "assertSecure"; + break; + case 'secure_param' : + $assert ="assertSecureParam"; + break; + case 'secure_return': + $assert = "assertSecureReturn"; + break; + case 'run_as' : + $assert = "assertRunAs"; + break; + case 'satisfies_parent_security_policy': + $assert = "assertSatisfiesParentSecurity"; + break; + default : + $this->fail("Unknown configuration key found: ". $key); + break; } foreach ($metadata->methodMetadata as $name => $metadata) { @@ -147,7 +147,7 @@ public function advancedConfigProvider() { return array( array( - 'config' => array(array( + 'config' => array('FooService::foo'=> array( 'pattern' => 'FooService::foo', 'secure' => array( 'roles' => array( @@ -160,7 +160,7 @@ public function advancedConfigProvider() 'securedMethods' => array('foo'), ), array( - 'config' => array(array( + 'config' => array('FooService::shortNotation' => array( 'pattern' => 'FooService::shortNotation', 'secure' => array( 'roles' => array('ROLE_FOO', 'ROLE_BAR') @@ -170,7 +170,7 @@ public function advancedConfigProvider() 'securedMethods' => array('shortNotation'), ), array( - 'config' => array(array( + 'config' => array('FooService::bar' => array( 'pattern' => 'FooService::bar', 'secure' => array('roles' => 'ROLE_FOO, ROLE_BAR'), 'secure_param' => array( @@ -182,7 +182,7 @@ public function advancedConfigProvider() 'securedMethods' => array('bar'), ), array( - 'config' => array(array( + 'config' => array('FooSecureService::foo' => array( 'pattern' => 'FooSecureService::foo', 'secure_param' => array( 'name' => 'anotherParam', 'permissions' => array('EDIT') @@ -192,7 +192,7 @@ public function advancedConfigProvider() 'securedMethods' => array('foo'), ), array( - 'config' => array(array( + 'config' => array('FooMultipleSecureService::foo' => array( 'pattern' => 'FooMultipleSecureService::foo', 'secure_param' => array( 'name' => 'param', 'permissions' => array('VIEW') From e08bef404307f07caa0d78429a97c3be675b9d1b Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 24 Sep 2013 14:27:06 -0400 Subject: [PATCH 05/32] Fixed ContextErrorExcepton when no configuration was present. --- DependencyInjection/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 646d1f3..5606bb9 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -70,7 +70,7 @@ public function getConfigTreeBuilder() ->end() ->arrayNode('method_access_control') ->beforeNormalization() - ->always(function ($node) { + ->always(function ($node = array()) { /** This is a backward compatibility layer */ foreach ($node as $key => $value) { if (is_string($value)) { From 2a38b4d280f3e6ff542c7989b94028f6af0a1f7a Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 24 Sep 2013 15:47:55 -0400 Subject: [PATCH 06/32] Fixed bad last commit --- DependencyInjection/Configuration.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 5606bb9..5e8b57e 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -70,16 +70,18 @@ public function getConfigTreeBuilder() ->end() ->arrayNode('method_access_control') ->beforeNormalization() - ->always(function ($node = array()) { + ->always(function ($node) { /** This is a backward compatibility layer */ - foreach ($node as $key => $value) { - if (is_string($value)) { - $node[$key] = array( - 'pre_authorize' => $value - ); + if ($node) { + foreach ($node as $key => $value) { + if (is_string($value)) { + $node[$key] = array( + 'pre_authorize' => $value + ); + } } } - + return $node; }) ->end() From 3e7120bc6caeeeb09b019a3a1f0144e253a4614f Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 08:28:08 -0400 Subject: [PATCH 07/32] Moved pre-processing configs to a private method. --- Metadata/Driver/ConfigDriver.php | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Metadata/Driver/ConfigDriver.php b/Metadata/Driver/ConfigDriver.php index 4f90f9d..7c7acb6 100644 --- a/Metadata/Driver/ConfigDriver.php +++ b/Metadata/Driver/ConfigDriver.php @@ -32,18 +32,7 @@ public function __construct(array $bundles, array $config) } $this->bundles = $bundles; - - /** This is a BC layer */ - $this->config = array(); - foreach ($config as $key => $value) { - if (is_string($value)) { - $this->config[$key] = array( - 'pre_authorize' => $value - ); - } else { - $this->config[$key] = $value; - } - } + $this->setConfigs($config); } /** @@ -192,4 +181,18 @@ private function assertParamExistsForMethod(array $params, $name, $method) ); } } + + private function setConfigs(array $config) + { + $this->config = array(); + foreach ($config as $key => $value) { + if (is_string($value)) { + $this->config[$key] = array( + 'pre_authorize' => $value + ); + } else { + $this->config[$key] = $value; + } + } + } } From 967a96270077e5b0728840ee5e2eed62347fddde Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 08:33:24 -0400 Subject: [PATCH 08/32] Cleaned left behing unsused assert methods in tests --- Tests/Metadata/Driver/ConfigDriverTest.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index 25fed52..b46156e 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -135,14 +135,6 @@ protected function assertSecureReturn($loadedMethod, $config) ); } - protected function assertRunAs($loadedMethods, $expectedMethods, $config) - { - } - - protected function assertSatisfiesParentSecurity($loadedMethods, $expectedMethods, $config) - { - } - public function advancedConfigProvider() { return array( From 0d6f042f966307ef9a60704e6d467b321e51b24a Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 08:37:07 -0400 Subject: [PATCH 09/32] Corrected typo in variable name --- Tests/Metadata/Driver/ConfigDriverTest.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index b46156e..6604cf9 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -91,11 +91,11 @@ public function testLoadAdvancedMetadata($config, $securedClass, $securedMethods $this->fail("Unknown configuration key found: ". $key); break; } - + foreach ($metadata->methodMetadata as $name => $metadata) { $this->assertEquals($name, current($securedMethods)); $this->{$assert}($metadata, current($securedMethods), $content ); - + next($securedMethods); } } @@ -119,11 +119,13 @@ protected function assertSecure($loadedMethod, $config) protected function assertSecureParam($loadedMethod, $config) { - $expectedPermission = $loadedMethod->paramPermissions[$config['name']]; + $expectedPermissions = $loadedMethod->paramPermissions[$config['name']]; $this->assertEquals( $expectedPermissions, $config['permission'], - sprintf("Expected parameter permission %s got %s", $expectedPermission, $config['permission']) + sprintf( + "Expected parameter permission %s got %s", $expectedPermissions, $config['permission'] + ) ); } @@ -131,7 +133,9 @@ protected function assertSecureReturn($loadedMethod, $config) { $this->assertEquals( $loadedMethod->returnPermissions, $config, - sprintf("Expected return permission %s got %s". $loadedMethod->returnPermission, $config) + sprintf( + "Expected return permission %s got %s". $loadedMethod->returnPermissions, $config + ) ); } From 443f53dada96de2135b856922e1da9480f9b19fb Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 09:12:12 -0400 Subject: [PATCH 10/32] Removed AbstractDriver to lessen impact on codebase --- Metadata/Driver/AbstractDriver.php | 103 --------------------------- Metadata/Driver/AnnotationDriver.php | 102 +++++++++----------------- Metadata/Driver/ConfigDriver.php | 45 +++++++----- 3 files changed, 59 insertions(+), 191 deletions(-) delete mode 100644 Metadata/Driver/AbstractDriver.php diff --git a/Metadata/Driver/AbstractDriver.php b/Metadata/Driver/AbstractDriver.php deleted file mode 100644 index 17d5697..0000000 --- a/Metadata/Driver/AbstractDriver.php +++ /dev/null @@ -1,103 +0,0 @@ - - */ -abstract class AbstractDriver implements DriverInterface -{ - /** - * Loads security-related metadata from configuration for a specific class - * - * @param \ReflectionClass $class Class for which to load metadata - * - * @return ClassMetatada - */ - public function loadMetadataForClass(\ReflectionClass $class) - { - $metadata = new ClassMetadata($class->name); - - $classMetadataConfig = $this->getClassScopeMetadata($class); - - $methods = $class->getMethods( - \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED - ); - - foreach ($methods as $method) { - if ($method->getDeclaringClass()->name !== $class->name) { - continue; - } - - $methodMetadataConfig = $this->getMethodScopeMetadata($method); - - $configuratedMetadata = array( - 'class' => $classMetadataConfig ? $classMetadataConfig : array(), - 'method' => $methodMetadataConfig ? $methodMetadataConfig : array() - ); - - $methodMetadata = $this->fromMetadataConfig($method, $configuratedMetadata); - - if ($methodMetadata) { - $metadata->addMethodMetadata($methodMetadata); - } - } - - return $this->metadataPostTreatment($metadata); - } - - /** - * Enables specialized post-treatment for class metadata. - * - * This method is mainly a backward compatibility strategy to bypass the - * violation of liskov substitution principle implied by the conjunction - * use of MetadataFactory and DriverChain. - * - * For more information about this bug, see issue #145 at github (see below) - * - * @param ClassMetadata $metadata - * - * @return null|ClassMetadata - * - * @see https://github.com/schmittjoh/JMSSecurityExtraBundle/issues/145 - */ - abstract protected function metadataPostTreatment(ClassMetadata $metadata); - - /** - * Retrieves metadata configuration for specified method. Implementations - * should use what configuration source provided by child DriverInterface - * implementation. - * - * @param \ReflectionMethod $method Method for which the configuration will apply - * - * @return array An array of metadata configuration which can be arrays, objects, etc. - */ - abstract protected function getMethodScopeMetadata(\ReflectionMethod $method); - - /** - * Retrieves metadata configuration for specified method. Implementations - * should use what configuration source provided by child DriverInterface - * implementation. - * - * @param \ReflectionClass $class Class for which the configuration will apply - * - * @return array An array of metadata configuration which can be arrays, objects, etc. - */ - abstract protected function getClassScopeMetadata(\ReflectionClass $class); - - /** - * Converts an array of metadata configuration to a MethodMetadada. - * - * @param \ReflectionMethod $method Related method - * @param array $configs Metadata configuration to be converted - * - * @return MethodMetadata - */ - abstract protected function fromMetadataConfig(\ReflectionMethod $method, array $configs); -} diff --git a/Metadata/Driver/AnnotationDriver.php b/Metadata/Driver/AnnotationDriver.php index 02049a1..44de17e 100644 --- a/Metadata/Driver/AnnotationDriver.php +++ b/Metadata/Driver/AnnotationDriver.php @@ -38,78 +38,58 @@ * * @author Johannes M. Schmitt */ -class AnnotationDriver extends AbstractDriver +class AnnotationDriver implements DriverInterface { private $reader; - /** - * @param Reader $reader Annotation reader - */ public function __construct(Reader $reader) { $this->reader = $reader; } - /** - * {@inheritDoc} - */ - protected function getClassScopeMetadata(ReflectionClass $class) + public function loadMetadataForClass(ReflectionClass $reflection) { - $metadata[] = $this->reader->getClassAnnotation( - $class, - 'JMS\SecurityExtraBundle\Annotation\PreAuthorize' - ); - - return $metadata; - } + $metadata = new ClassMetadata($reflection->name); + + $classPreAuthorize = $this->reader->getClassAnnotation($reflection, 'JMS\SecurityExtraBundle\Annotation\PreAuthorize'); + $classAnnotations = $this->reader->getClassAnnotations($reflection); + foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED) as $method) { + // check if the method was defined on this class + if ($method->getDeclaringClass()->name !== $reflection->name) { + continue; + } - /** - * {@inheritDoc} - */ - protected function getMethodScopeMetadata(ReflectionMethod $method) - { - $metadata = $this->reader->getMethodAnnotations($method); + $annotations = $this->reader->getMethodAnnotations($method); + if ($classAnnotations) { + foreach ($classAnnotations as $classAnnotation) { + if ($classAnnotation instanceof SecureParam) { + $annotations[] = $classAnnotation; + } + } + } - $class = $method->getDeclaringClass(); + if (! $annotations && ! $classPreAuthorize) { + continue; + } - /** - * We consider class-scope SecureParam annotations to be method-scope. - */ - foreach ($this->reader->getClassAnnotations($class) as $annotation) { - if ($annotation instanceof SecureParam) { - $metadata[] = $annotation; + if (null !== $methodMetadata = $this->convertMethodAnnotations($method, $annotations, $classPreAuthorize)) { + $metadata->addMethodMetadata($methodMetadata); } } - return $metadata ? $metadata : array(); + return $metadata; } - /** - * {@inheritDoc} - */ - protected function fromMetadataConfig(\ReflectionMethod $method, array $annotations) + private function convertMethodAnnotations(\ReflectionMethod $method, array $annotations, PreAuthorize $classPreAuthorize = null) { $parameters = array(); foreach ($method->getParameters() as $index => $parameter) { $parameters[$parameter->getName()] = $index; } - $classPreAuthorize = null; - - if (isset($annotations['class'])) { - foreach ($annotations['class'] as $annotation) { - if ($annotation instanceof PreAuthorize) { - $classPreAuthorize = $annotation; - break; - } - } - } - $methodMetadata = new MethodMetadata($method->class, $method->name); - $hasSecurityMetadata = $hasPreRestrictions = false; - - foreach ($annotations['method'] as $annotation) { + foreach ($annotations as $annotation) { if ($annotation instanceof Secure) { $methodMetadata->roles = $annotation->roles; $hasSecurityMetadata = $hasPreRestrictions = true; @@ -117,11 +97,11 @@ protected function fromMetadataConfig(\ReflectionMethod $method, array $annotati $methodMetadata->roles = array(new Expression($annotation->expr)); $hasSecurityMetadata = $hasPreRestrictions = true; } elseif ($annotation instanceof SecureParam) { - $this->assertParamExistsForMethod($parameters, $annotation->name, $method->name); - $methodMetadata->addParamPermissions( - $parameters[$annotation->name], - $annotation->permissions - ); + if (!isset($parameters[$annotation->name])) { + throw new InvalidArgumentException(sprintf('The parameter "%s" does not exist for method "%s".', $annotation->name, $method->name)); + } + + $methodMetadata->addParamPermissions($parameters[$annotation->name], $annotation->permissions); $hasSecurityMetadata = $hasPreRestrictions = true; } elseif ($annotation instanceof SecureReturn) { $methodMetadata->returnPermissions = $annotation->permissions; @@ -152,22 +132,4 @@ protected function fromMetadataConfig(\ReflectionMethod $method, array $annotati return $hasSecurityMetadata ? $methodMetadata : null; } - - protected function metadataPostTreatment(ClassMetadata $metadata) - { - return $metadata; - } - - private function assertParamExistsForMethod(array $params, $name, $method) - { - if (!isset($params[$name])) { - throw new InvalidArgumentException( - sprintf( - 'The parameter "%s" does not exist for method "%s".', - $name, - $method - ) - ); - } - } } diff --git a/Metadata/Driver/ConfigDriver.php b/Metadata/Driver/ConfigDriver.php index 7c7acb6..5bda6e8 100644 --- a/Metadata/Driver/ConfigDriver.php +++ b/Metadata/Driver/ConfigDriver.php @@ -12,7 +12,7 @@ * * @author Johannes M. Schmitt */ -class ConfigDriver extends AbstractDriver +class ConfigDriver implements DriverInterface { private $bundles; private $config; @@ -38,6 +38,31 @@ public function __construct(array $bundles, array $config) /** * {@inheritDoc} */ + public function loadMetadataForClass(\ReflectionClass $class) + { + $metadata = new ClassMetadata($class->name); + + $methods = $class->getMethods( + \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED + ); + + foreach ($methods as $method) { + if ($method->getDeclaringClass()->name !== $class->name) { + continue; + } + + $methodMetadataConfig = $this->getMethodScopeMetadata($method); + + $methodMetadata = $this->fromMetadataConfig($method, $methodMetadataConfig); + + if ($methodMetadata) { + $metadata->addMethodMetadata($methodMetadata); + } + } + + return $this->metadataPostTreatment($metadata); + } + protected function getMethodScopeMetadata(\ReflectionMethod $method) { $configurationFound = null; @@ -53,22 +78,6 @@ protected function getMethodScopeMetadata(\ReflectionMethod $method) return $configurationFound ? $configurationFound : array(); } - /** - * {@inheritDoc} - */ - protected function getClassScopeMetadata(\ReflectionClass $class) - { - /** - * Class configuration metadata is not supported. Use more general - * regex pattern in configuration instead. - */ - - return array(); - } - - /** - * {@inheritDoc} - */ protected function fromMetadataConfig(\ReflectionMethod $method, array $configs) { $parameters = array(); @@ -80,7 +89,7 @@ protected function fromMetadataConfig(\ReflectionMethod $method, array $configs) $hasSecurityMetadata = false; - foreach ($configs['method'] as $name => $config) { + foreach ($configs as $name => $config) { switch ($name) { case "pre_authorize": $methodMetadata->roles = array(new Expression($config)); From 0aa6b7c81fcd29593c2dd4978b54b48bdb866a80 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 09:19:52 -0400 Subject: [PATCH 11/32] Added more strict configuration validation --- DependencyInjection/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 5e8b57e..1864296 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -72,7 +72,7 @@ public function getConfigTreeBuilder() ->beforeNormalization() ->always(function ($node) { /** This is a backward compatibility layer */ - if ($node) { + if (is_array($node)) { foreach ($node as $key => $value) { if (is_string($value)) { $node[$key] = array( From 42138e5a1f9a1e891eee78487f882cb16d1c7e58 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 09:19:52 -0400 Subject: [PATCH 12/32] Added more strict configuration validation --- DependencyInjection/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 5e8b57e..1864296 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -72,7 +72,7 @@ public function getConfigTreeBuilder() ->beforeNormalization() ->always(function ($node) { /** This is a backward compatibility layer */ - if ($node) { + if (is_array($node)) { foreach ($node as $key => $value) { if (is_string($value)) { $node[$key] = array( From 6cc85110fd8a1e7d8ea297abf5cfc9bd5bea9048 Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 6 Jan 2014 09:20:11 -0500 Subject: [PATCH 13/32] Added a more complete gitignore file --- .gitignore | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5cc78c4..9f388ba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,59 @@ -phpunit.xml +### +# .gitignore +### + +### +# Common pollution +### +*~ +*.DS_Store +*.settings +*Thumb.db + +### +# Temporary, cache, backup and buffer files +### +*.tmp +*.swp +*.lock +~* +.*.sw[a-z] +.Trashes +.sass-cache +*.swp +composer.lock + +### +# Development environement common files +### +*nbproject +*.project +*.idea +*atlassian-ide-plugin.xml +*catalog.xml +*.sublime* +.Spotlight-V100 +Thumb.db +Vagrantfile +.vagrant* +nbproject/ + +### +# Generated files and directories +### +coverage/ vendor/ +cache/ +log/ +app/cache/* +app/logs/* +clover.xml +web/bundles/nelmioapidoc + +### +# Excluded executables +### +bin/ +composer.phar + From 0ce45d1148815c0c6998d72297a5c7b8f47dd3ef Mon Sep 17 00:00:00 2001 From: Michel Salib Date: Thu, 21 Mar 2013 14:03:12 +0100 Subject: [PATCH 14/32] Fixing PR#123 See conversation in #123 for more details. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index abd33ef..0bad197 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ ], "minimum-stability": "dev", "require": { - "symfony/framework-bundle": "~2.1.0", + "symfony/framework-bundle": "~2.1", "symfony/security-bundle": "*", "jms/metadata": "1.*", "jms/parser-lib": "1.*", From f13a4c1b56e32e2b76180e459eccd92ce7c8f292 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Sat, 8 Jun 2013 15:02:16 +0200 Subject: [PATCH 15/32] adds lock file --- .gitignore | 1 - composer.lock | 2852 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2852 insertions(+), 1 deletion(-) create mode 100644 composer.lock diff --git a/.gitignore b/.gitignore index 000c86e..5cc78c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ phpunit.xml vendor/ -composer.lock diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..cb0afed --- /dev/null +++ b/composer.lock @@ -0,0 +1,2852 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "245b473818cbc4ba651db063782d7a2b", + "packages": [ + { + "name": "doctrine/annotations", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "v1.1.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/v1.1.1", + "reference": "v1.1.1", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": ">=5.3.2" + }, + "require-dev": { + "doctrine/cache": "1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Annotations\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan H. Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2013-04-20 08:30:17" + }, + { + "name": "doctrine/cache", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "89493d2c6e1362f581f9de1c1871cc52eb29c030" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/89493d2c6e1362f581f9de1c1871cc52eb29c030", + "reference": "89493d2c6e1362f581f9de1c1871cc52eb29c030", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Cache\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2013-06-07 14:54:47" + }, + { + "name": "doctrine/collections", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "3db3ab843ff76774bee4679d4cb3a10cffb0a935" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/3db3ab843ff76774bee4679d4cb3a10cffb0a935", + "reference": "3db3ab843ff76774bee4679d4cb3a10cffb0a935", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan H. Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2013-05-26 05:21:22" + }, + { + "name": "doctrine/common", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe", + "reference": "2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "doctrine/cache": "1.*", + "doctrine/collections": "1.*", + "doctrine/inflector": "1.*", + "doctrine/lexer": "1.*", + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ], + "time": "2013-05-27 19:11:46" + }, + { + "name": "doctrine/inflector", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", + "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Inflector\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2013-04-10 16:14:30" + }, + { + "name": "doctrine/lexer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", + "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2013-03-07 12:15:25" + }, + { + "name": "jms/aop-bundle", + "version": "dev-master", + "target-dir": "JMS/AopBundle", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/JMSAopBundle.git", + "reference": "7018357f5bedf204979a88867a9da05973744422" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/JMSAopBundle/zipball/7018357f5bedf204979a88867a9da05973744422", + "reference": "7018357f5bedf204979a88867a9da05973744422", + "shasum": "" + }, + "require": { + "jms/cg": "1.*", + "symfony/framework-bundle": "2.*" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\AopBundle": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Adds AOP capabilities to Symfony2", + "keywords": [ + "annotations", + "aop" + ], + "time": "2013-01-09 08:03:40" + }, + { + "name": "jms/cg", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/cg-library.git", + "reference": "75a519d83a33f6b893a25aef835a1e5fc166a6d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/cg-library/zipball/75a519d83a33f6b893a25aef835a1e5fc166a6d7", + "reference": "75a519d83a33f6b893a25aef835a1e5fc166a6d7", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-0": { + "CG\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Toolset for generating PHP code", + "keywords": [ + "code generation" + ], + "time": "2013-03-23 08:03:00" + }, + { + "name": "jms/di-extra-bundle", + "version": "dev-master", + "target-dir": "JMS/DiExtraBundle", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/JMSDiExtraBundle.git", + "reference": "a15367768d8bbf0b5eac135adf31880ed99cc12d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/JMSDiExtraBundle/zipball/a15367768d8bbf0b5eac135adf31880ed99cc12d", + "reference": "a15367768d8bbf0b5eac135adf31880ed99cc12d", + "shasum": "" + }, + "require": { + "jms/aop-bundle": ">=1.0.0,<1.2-dev", + "jms/metadata": "1.*", + "symfony/finder": ">=2.1,<3.0", + "symfony/framework-bundle": ">=2.1,<3.0", + "symfony/process": ">=2.1,<3.0" + }, + "require-dev": { + "doctrine/doctrine-bundle": "*", + "doctrine/orm": "*", + "jms/security-extra-bundle": "1.*", + "phpcollection/phpcollection": ">=0.1,<0.3-dev", + "sensio/framework-extra-bundle": "*", + "symfony/browser-kit": "*", + "symfony/class-loader": "*", + "symfony/form": "*", + "symfony/security-bundle": "*", + "symfony/twig-bundle": "*", + "symfony/validator": "*", + "symfony/yaml": "*" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\DiExtraBundle": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Allows to configure dependency injection using annotations", + "homepage": "http://jmsyst.com/bundles/JMSDiExtraBundle", + "keywords": [ + "annotations", + "dependency injection" + ], + "time": "2013-03-21 16:34:41" + }, + { + "name": "jms/metadata", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", + "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "doctrine/common": ">=2.0,<2.4-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "time": "2013-03-28 16:32:37" + }, + { + "name": "jms/parser-lib", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/parser-lib.git", + "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", + "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", + "shasum": "" + }, + "require": { + "phpoption/phpoption": ">=0.9,<2.0-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "description": "A library for easily creating recursive-descent parsers.", + "time": "2012-11-30 08:11:04" + }, + { + "name": "phpoption/phpoption", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/1c7e8016289d17d83ced49c56d0f266fd0568941", + "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2013-05-19 11:09:35" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/php-fig/log/archive/1.0.0.zip", + "reference": "1.0.0", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "symfony/config", + "version": "dev-master", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/Config.git", + "reference": "c2e148f4d1daa2ae407a27a07ff433fadfd6de77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Config/zipball/c2e148f4d1daa2ae407a27a07ff433fadfd6de77", + "reference": "c2e148f4d1daa2ae407a27a07ff433fadfd6de77", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/filesystem": ">=2.3,<3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/debug", + "version": "dev-master", + "target-dir": "Symfony/Component/Debug", + "source": { + "type": "git", + "url": "https://github.com/symfony/Debug.git", + "reference": "bcf326c347d9e2ccafde5e30fb938e09255f6c1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Debug/zipball/bcf326c347d9e2ccafde5e30fb938e09255f6c1a", + "reference": "bcf326c347d9e2ccafde5e30fb938e09255f6c1a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/http-foundation": ">=2.1,<3.0", + "symfony/http-kernel": ">=2.1,<3.0" + }, + "suggest": { + "symfony/class-loader": "", + "symfony/http-foundation": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Debug\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "http://symfony.com", + "time": "2013-06-02 12:05:59" + }, + { + "name": "symfony/dependency-injection", + "version": "dev-master", + "target-dir": "Symfony/Component/DependencyInjection", + "source": { + "type": "git", + "url": "https://github.com/symfony/DependencyInjection.git", + "reference": "db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9", + "reference": "db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/config": ">=2.2,<3.0", + "symfony/yaml": ">=2.0,<3.0" + }, + "suggest": { + "symfony/config": "", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\DependencyInjection\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/event-dispatcher", + "version": "dev-master", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "4b34aad44d0a2d91f301ee967151ce0980f39930" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/4b34aad44d0a2d91f301ee967151ce0980f39930", + "reference": "4b34aad44d0a2d91f301ee967151ce0980f39930", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/dependency-injection": ">=2.0,<3.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/filesystem", + "version": "dev-master", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/Filesystem.git", + "reference": "3567f5f48305098044c6d6a383f5cefec9c45efa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/3567f5f48305098044c6d6a383f5cefec9c45efa", + "reference": "3567f5f48305098044c6d6a383f5cefec9c45efa", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/finder", + "version": "dev-master", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "b709a80b766b47761ae1d1e27a6fa6b4e62dcf08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/b709a80b766b47761ae1d1e27a6fa6b4e62dcf08", + "reference": "b709a80b766b47761ae1d1e27a6fa6b4e62dcf08", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2013-06-02 12:05:59" + }, + { + "name": "symfony/framework-bundle", + "version": "dev-master", + "target-dir": "Symfony/Bundle/FrameworkBundle", + "source": { + "type": "git", + "url": "https://github.com/symfony/FrameworkBundle.git", + "reference": "28fa76f09660af3fa45dde1ad4c296c8758cec5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/FrameworkBundle/zipball/28fa76f09660af3fa45dde1ad4c296c8758cec5e", + "reference": "28fa76f09660af3fa45dde1ad4c296c8758cec5e", + "shasum": "" + }, + "require": { + "doctrine/common": ">=2.2,<3.0", + "php": ">=5.3.3", + "symfony/config": ">=2.2,<3.0", + "symfony/dependency-injection": ">=2.2,<3.0", + "symfony/event-dispatcher": ">=2.1,<3.0", + "symfony/filesystem": ">=2.3,<3.0", + "symfony/http-kernel": ">=2.3,<3.0", + "symfony/routing": ">=2.2,<3.0", + "symfony/stopwatch": ">=2.3,<3.0", + "symfony/templating": ">=2.1,<3.0", + "symfony/translation": ">=2.3,<3.0" + }, + "require-dev": { + "symfony/class-loader": ">=2.1,<3.0", + "symfony/finder": ">=2.0,<3.0", + "symfony/form": ">=2.3,<3.0", + "symfony/security": ">=2.3,<3.0", + "symfony/validator": ">=2.1,<3.0" + }, + "suggest": { + "symfony/console": "", + "symfony/finder": "", + "symfony/form": "", + "symfony/validator": "" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony FrameworkBundle", + "homepage": "http://symfony.com", + "time": "2013-06-02 12:05:59" + }, + { + "name": "symfony/http-foundation", + "version": "dev-master", + "target-dir": "Symfony/Component/HttpFoundation", + "source": { + "type": "git", + "url": "https://github.com/symfony/HttpFoundation.git", + "reference": "f484475d926fe5dad901c559ef1bef395385b3a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/f484475d926fe5dad901c559ef1bef395385b3a9", + "reference": "f484475d926fe5dad901c559ef1bef395385b3a9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "classmap": [ + "Symfony/Component/HttpFoundation/Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "http://symfony.com", + "time": "2013-06-04 15:12:29" + }, + { + "name": "symfony/http-kernel", + "version": "dev-master", + "target-dir": "Symfony/Component/HttpKernel", + "source": { + "type": "git", + "url": "https://github.com/symfony/HttpKernel.git", + "reference": "884e196581541a9801e1a0b0000ddf2118dcc30c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/884e196581541a9801e1a0b0000ddf2118dcc30c", + "reference": "884e196581541a9801e1a0b0000ddf2118dcc30c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "psr/log": ">=1.0,<2.0", + "symfony/debug": ">=2.3,<3.0", + "symfony/event-dispatcher": ">=2.1,<3.0", + "symfony/http-foundation": ">=2.2,<3.0" + }, + "require-dev": { + "symfony/browser-kit": "2.2.*", + "symfony/class-loader": ">=2.1,<3.0", + "symfony/config": ">=2.0,<3.0", + "symfony/console": "2.2.*", + "symfony/dependency-injection": ">=2.0,<3.0", + "symfony/finder": ">=2.0,<3.0", + "symfony/process": ">=2.0,<3.0", + "symfony/routing": ">=2.2,<3.0", + "symfony/stopwatch": ">=2.2,<3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/class-loader": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\HttpKernel\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/process", + "version": "dev-master", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "75c810176f8e069714cef8696d7ecc3aa86e8168" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/75c810176f8e069714cef8696d7ecc3aa86e8168", + "reference": "75c810176f8e069714cef8696d7ecc3aa86e8168", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/routing", + "version": "dev-master", + "target-dir": "Symfony/Component/Routing", + "source": { + "type": "git", + "url": "https://github.com/symfony/Routing.git", + "reference": "93fa88b2494d3262c87ca0762551a658cc390669" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Routing/zipball/93fa88b2494d3262c87ca0762551a658cc390669", + "reference": "93fa88b2494d3262c87ca0762551a658cc390669", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "doctrine/common": ">=2.2,<3.0", + "psr/log": ">=1.0,<2.0", + "symfony/config": ">=2.2,<3.0", + "symfony/yaml": ">=2.0,<3.0" + }, + "suggest": { + "doctrine/common": "", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Routing\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/security", + "version": "dev-master", + "target-dir": "Symfony/Component/Security", + "source": { + "type": "git", + "url": "https://github.com/symfony/Security.git", + "reference": "693c2395ef2f1d27d04c56bf6172202c90c95697" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Security/zipball/693c2395ef2f1d27d04c56bf6172202c90c95697", + "reference": "693c2395ef2f1d27d04c56bf6172202c90c95697", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/event-dispatcher": ">=2.1,<3.0", + "symfony/http-foundation": ">=2.1,<3.0", + "symfony/http-kernel": ">=2.1,<3.0" + }, + "require-dev": { + "doctrine/common": ">=2.2,<3.0", + "doctrine/dbal": ">=2.2,<3.0", + "ircmaxell/password-compat": "1.0.*", + "psr/log": ">=1.0,<2.0", + "symfony/form": ">=2.0,<3.0", + "symfony/routing": ">=2.2,<3.0", + "symfony/validator": ">=2.2,<3.0" + }, + "suggest": { + "doctrine/dbal": "to use the built-in ACL implementation", + "ircmaxell/password-compat": "", + "symfony/class-loader": "", + "symfony/finder": "", + "symfony/form": "", + "symfony/routing": "", + "symfony/validator": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Security\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Security Component", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/security-bundle", + "version": "dev-master", + "target-dir": "Symfony/Bundle/SecurityBundle", + "source": { + "type": "git", + "url": "https://github.com/symfony/SecurityBundle.git", + "reference": "ff1b9ca906cd405f0a3e07841abcc9c8417f44cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/SecurityBundle/zipball/ff1b9ca906cd405f0a3e07841abcc9c8417f44cd", + "reference": "ff1b9ca906cd405f0a3e07841abcc9c8417f44cd", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/http-kernel": ">=2.2,<3.0", + "symfony/security": ">=2.2,<3.0" + }, + "require-dev": { + "symfony/form": ">=2.1,<3.0", + "symfony/framework-bundle": ">=2.2,<3.0", + "symfony/twig-bundle": ">=2.2,<3.0", + "symfony/validator": ">=2.2,<3.0", + "symfony/yaml": ">=2.0,<3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Bundle\\SecurityBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony SecurityBundle", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/stopwatch", + "version": "dev-master", + "target-dir": "Symfony/Component/Stopwatch", + "source": { + "type": "git", + "url": "https://github.com/symfony/Stopwatch.git", + "reference": "453f661bad0ec73417ccce9853b1dc6c2a885db1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/453f661bad0ec73417ccce9853b1dc6c2a885db1", + "reference": "453f661bad0ec73417ccce9853b1dc6c2a885db1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Stopwatch\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/templating", + "version": "dev-master", + "target-dir": "Symfony/Component/Templating", + "source": { + "type": "git", + "url": "https://github.com/symfony/Templating.git", + "reference": "cd1b2c0a6f67844f44efdbd365bcd33b546ce713" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Templating/zipball/cd1b2c0a6f67844f44efdbd365bcd33b546ce713", + "reference": "cd1b2c0a6f67844f44efdbd365bcd33b546ce713", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Templating\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Templating Component", + "homepage": "http://symfony.com", + "time": "2013-06-04 15:16:10" + }, + { + "name": "symfony/translation", + "version": "dev-master", + "target-dir": "Symfony/Component/Translation", + "source": { + "type": "git", + "url": "https://github.com/symfony/Translation.git", + "reference": "ed0c7257bfc533205dff78f9d247c2544c830ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Translation/zipball/ed0c7257bfc533205dff78f9d247c2544c830ddc", + "reference": "ed0c7257bfc533205dff78f9d247c2544c830ddc", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/config": ">=2.0,<3.0", + "symfony/yaml": ">=2.2,<3.0" + }, + "suggest": { + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + } + ], + "packages-dev": [ + { + "name": "doctrine/dbal", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750", + "reference": "5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750", + "shasum": "" + }, + "require": { + "doctrine/common": "2.4.*@beta", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "symfony/console": "2.*" + }, + "suggest": { + "symfony/console": "Allows use of the command line interface" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\DBAL\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "persistence", + "queryobject" + ], + "time": "2013-06-07 18:55:27" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "dev-master", + "target-dir": "Doctrine/Bundle/DoctrineBundle", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "9218b4116e86b1d278564b8550fb2f53eb400093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/9218b4116e86b1d278564b8550fb2f53eb400093", + "reference": "9218b4116e86b1d278564b8550fb2f53eb400093", + "shasum": "" + }, + "require": { + "doctrine/dbal": ">=2.2,<2.5-dev", + "jdorn/sql-formatter": ">=1.1,<2.0", + "php": ">=5.3.2", + "symfony/doctrine-bridge": ">=2.2,<3.0", + "symfony/framework-bundle": ">=2.2,<3.0" + }, + "require-dev": { + "doctrine/orm": ">=2.2,<2.5-dev", + "symfony/validator": ">=2.2,<3.0", + "symfony/yaml": ">=2.2,<3.0" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "symfony/web-profiler-bundle": "to use the data collector" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Bundle\\DoctrineBundle": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "time": "2013-05-04 07:57:29" + }, + { + "name": "doctrine/orm", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/doctrine2.git", + "reference": "462173ad71ae63cd9877e1e642f7968ed1f9971b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/462173ad71ae63cd9877e1e642f7968ed1f9971b", + "reference": "462173ad71ae63cd9877e1e642f7968ed1f9971b", + "shasum": "" + }, + "require": { + "doctrine/collections": ">=1.1,<2.0", + "doctrine/dbal": ">=2.4-beta,<2.5-dev", + "ext-pdo": "*", + "php": ">=5.3.2", + "symfony/console": "2.*" + }, + "require-dev": { + "symfony/yaml": "2.1" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine", + "bin/doctrine.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\ORM\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm" + ], + "time": "2013-06-07 21:42:59" + }, + { + "name": "jdorn/sql-formatter", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/jdorn/sql-formatter.git", + "reference": "v1.2.9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/v1.2.9", + "reference": "v1.2.9", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/jdorn/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "time": "2013-04-26 18:42:52" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "dev-master", + "target-dir": "Sensio/Bundle/FrameworkExtraBundle", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "v2.3.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/v2.3.0", + "reference": "v2.3.0", + "shasum": "" + }, + "require": { + "doctrine/common": ">=2.2,<3.0", + "symfony/framework-bundle": ">=2.2,<3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Sensio\\Bundle\\FrameworkExtraBundle": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "time": "2013-06-02 16:13:20" + }, + { + "name": "symfony/browser-kit", + "version": "dev-master", + "target-dir": "Symfony/Component/BrowserKit", + "source": { + "type": "git", + "url": "https://github.com/symfony/BrowserKit.git", + "reference": "2d2343dac844a365bd28a7cefd56b47d09e62dda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/2d2343dac844a365bd28a7cefd56b47d09e62dda", + "reference": "2d2343dac844a365bd28a7cefd56b47d09e62dda", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/dom-crawler": ">=2.0,<3.0" + }, + "require-dev": { + "symfony/css-selector": ">=2.0,<3.0", + "symfony/process": ">=2.0,<3.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\BrowserKit\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony BrowserKit Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/class-loader", + "version": "dev-master", + "target-dir": "Symfony/Component/ClassLoader", + "source": { + "type": "git", + "url": "https://github.com/symfony/ClassLoader.git", + "reference": "0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776", + "reference": "0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/finder": ">=2.0,<3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\ClassLoader\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony ClassLoader Component", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/console", + "version": "dev-master", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "28b4eced63a11275583345feb3c8269967819eca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/28b4eced63a11275583345feb3c8269967819eca", + "reference": "28b4eced63a11275583345feb3c8269967819eca", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/event-dispatcher": ">=2.1,<3.0" + }, + "suggest": { + "symfony/event-dispatcher": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2013-06-04 15:09:18" + }, + { + "name": "symfony/css-selector", + "version": "dev-master", + "target-dir": "Symfony/Component/CssSelector", + "source": { + "type": "git", + "url": "https://github.com/symfony/CssSelector.git", + "reference": "504601ed1aff97d2327a4f65f3f76ac478c57d45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/CssSelector/zipball/504601ed1aff97d2327a4f65f3f76ac478c57d45", + "reference": "504601ed1aff97d2327a4f65f3f76ac478c57d45", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\CssSelector\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/doctrine-bridge", + "version": "dev-master", + "target-dir": "Symfony/Bridge/Doctrine", + "source": { + "type": "git", + "url": "https://github.com/symfony/DoctrineBridge.git", + "reference": "b65586b8cf8b5907a3de7290c0b43822ccb5edc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DoctrineBridge/zipball/b65586b8cf8b5907a3de7290c0b43822ccb5edc8", + "reference": "b65586b8cf8b5907a3de7290c0b43822ccb5edc8", + "shasum": "" + }, + "require": { + "doctrine/common": ">=2.2,<3.0", + "php": ">=5.3.3" + }, + "require-dev": { + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": ">=2.2,<3.0", + "doctrine/orm": ">=2.2,<3.0,>=2.2.3", + "symfony/dependency-injection": ">=2.0,<3.0", + "symfony/form": ">=2.2,<3.0", + "symfony/http-kernel": ">=2.2,<3.0", + "symfony/security": ">=2.2,<3.0", + "symfony/stopwatch": ">=2.2,<3.0", + "symfony/validator": ">=2.2,<3.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Bridge\\Doctrine\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "http://symfony.com", + "time": "2013-05-16 20:40:38" + }, + { + "name": "symfony/dom-crawler", + "version": "dev-master", + "target-dir": "Symfony/Component/DomCrawler", + "source": { + "type": "git", + "url": "https://github.com/symfony/DomCrawler.git", + "reference": "09f0cd5980511ee77c2e8142405ccd5c867506b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/09f0cd5980511ee77c2e8142405ccd5c867506b9", + "reference": "09f0cd5980511ee77c2e8142405ccd5c867506b9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/css-selector": ">=2.0,<3.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\DomCrawler\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/form", + "version": "dev-master", + "target-dir": "Symfony/Component/Form", + "source": { + "type": "git", + "url": "https://github.com/symfony/Form.git", + "reference": "3f33335a1217b6e7d2489dbde50da6b4bf3593cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Form/zipball/3f33335a1217b6e7d2489dbde50da6b4bf3593cc", + "reference": "3f33335a1217b6e7d2489dbde50da6b4bf3593cc", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/event-dispatcher": ">=2.1,<3.0", + "symfony/intl": ">=2.3,<3.0", + "symfony/options-resolver": ">=2.1,<3.0", + "symfony/property-access": ">=2.2,<3.0" + }, + "require-dev": { + "symfony/http-foundation": ">=2.2,<3.0", + "symfony/validator": ">=2.2,<3.0" + }, + "suggest": { + "symfony/http-foundation": "", + "symfony/validator": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Form\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Form Component", + "homepage": "http://symfony.com", + "time": "2013-06-02 12:05:59" + }, + { + "name": "symfony/icu", + "version": "1.2.x-dev", + "target-dir": "Symfony/Component/Icu", + "source": { + "type": "git", + "url": "https://github.com/symfony/Icu.git", + "reference": "v1.2.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Icu/zipball/v1.2.0", + "reference": "v1.2.0", + "shasum": "" + }, + "require": { + "lib-icu": ">=4.4", + "php": ">=5.3.3", + "symfony/intl": ">=2.3,<3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Symfony\\Component\\Icu\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Contains an excerpt of the ICU data and classes to load it.", + "homepage": "http://symfony.com", + "keywords": [ + "icu", + "intl" + ], + "time": "2013-06-03 18:32:58" + }, + { + "name": "symfony/intl", + "version": "dev-master", + "target-dir": "Symfony/Component/Intl", + "source": { + "type": "git", + "url": "https://github.com/symfony/Intl.git", + "reference": "5199c826bc2c44cd8becfc75e6ab266b37d01b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Intl/zipball/5199c826bc2c44cd8becfc75e6ab266b37d01b6a", + "reference": "5199c826bc2c44cd8becfc75e6ab266b37d01b6a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/icu": ">=1.0-RC,<2.0" + }, + "require-dev": { + "symfony/filesystem": ">=2.1" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Symfony/Component/Intl/Resources/stubs" + ], + "files": [ + "Symfony/Component/Intl/Resources/stubs/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch", + "homepage": "http://wiedler.ch/igor/" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + } + ], + "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", + "homepage": "http://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/options-resolver", + "version": "dev-master", + "target-dir": "Symfony/Component/OptionsResolver", + "source": { + "type": "git", + "url": "https://github.com/symfony/OptionsResolver.git", + "reference": "48d9182e515128e6d18be9ca776a818223d39f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/48d9182e515128e6d18be9ca776a818223d39f52", + "reference": "48d9182e515128e6d18be9ca776a818223d39f52", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\OptionsResolver\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "http://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/property-access", + "version": "dev-master", + "target-dir": "Symfony/Component/PropertyAccess", + "source": { + "type": "git", + "url": "https://github.com/symfony/PropertyAccess.git", + "reference": "3ed937623a4c1e491f46ebf8111f177ce67e13ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/3ed937623a4c1e491f46ebf8111f177ce67e13ba", + "reference": "3ed937623a4c1e491f46ebf8111f177ce67e13ba", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\PropertyAccess\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony PropertyAccess Component", + "homepage": "http://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "time": "2013-05-16 07:54:39" + }, + { + "name": "symfony/twig-bridge", + "version": "dev-master", + "target-dir": "Symfony/Bridge/Twig", + "source": { + "type": "git", + "url": "https://github.com/symfony/TwigBridge.git", + "reference": "126d31387ab33074ffa9d023cc83a700ad1db238" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/126d31387ab33074ffa9d023cc83a700ad1db238", + "reference": "126d31387ab33074ffa9d023cc83a700ad1db238", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "twig/twig": ">=1.11.0,<2.0" + }, + "require-dev": { + "symfony/form": "2.2.*", + "symfony/http-kernel": ">=2.2,<3.0", + "symfony/routing": ">=2.2,<3.0", + "symfony/security": ">=2.0,<3.0", + "symfony/templating": ">=2.1,<3.0", + "symfony/translation": ">=2.2,<3.0", + "symfony/yaml": ">=2.0,<3.0" + }, + "suggest": { + "symfony/form": "", + "symfony/http-kernel": "", + "symfony/routing": "", + "symfony/security": "", + "symfony/templating": "", + "symfony/translation": "", + "symfony/yaml": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Bridge\\Twig\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Twig Bridge", + "homepage": "http://symfony.com", + "time": "2013-05-16 20:40:38" + }, + { + "name": "symfony/twig-bundle", + "version": "dev-master", + "target-dir": "Symfony/Bundle/TwigBundle", + "source": { + "type": "git", + "url": "https://github.com/symfony/TwigBundle.git", + "reference": "c502e341a0b8ed25e76d692f5fcc18640bb7b80a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/TwigBundle/zipball/c502e341a0b8ed25e76d692f5fcc18640bb7b80a", + "reference": "c502e341a0b8ed25e76d692f5fcc18640bb7b80a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/http-kernel": ">=2.1,<3.0", + "symfony/twig-bridge": ">=2.2,<3.0" + }, + "require-dev": { + "symfony/config": ">=2.2,<3.0", + "symfony/dependency-injection": ">=2.0,<3.0", + "symfony/stopwatch": ">=2.2,<3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Bundle\\TwigBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony TwigBundle", + "homepage": "http://symfony.com", + "time": "2013-05-27 14:49:42" + }, + { + "name": "symfony/validator", + "version": "dev-master", + "target-dir": "Symfony/Component/Validator", + "source": { + "type": "git", + "url": "https://github.com/symfony/Validator.git", + "reference": "a530bb62eb01865e1212ef1bf1e2166151c33c17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Validator/zipball/a530bb62eb01865e1212ef1bf1e2166151c33c17", + "reference": "a530bb62eb01865e1212ef1bf1e2166151c33c17", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/translation": ">=2.0,<3.0" + }, + "require-dev": { + "symfony/config": ">=2.2,<3.0", + "symfony/http-foundation": ">=2.1,<3.0", + "symfony/intl": ">=2.3,<3.0", + "symfony/yaml": ">=2.0,<3.0" + }, + "suggest": { + "doctrine/common": "", + "symfony/config": "", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Validator\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "http://symfony.com", + "time": "2013-06-02 12:05:59" + }, + { + "name": "symfony/yaml", + "version": "dev-master", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "82100c7732c95452702d11433aad50988700d36c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/82100c7732c95452702d11433aad50988700d36c", + "reference": "82100c7732c95452702d11433aad50988700d36c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2013-05-16 07:54:39" + }, + { + "name": "twig/twig", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Twig.git", + "reference": "1a6507043782f18e3765b52712cf78d16f3117e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Twig/zipball/1a6507043782f18e3765b52712cf78d16f3117e7", + "reference": "1a6507043782f18e3765b52712cf78d16f3117e7", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2013-06-07 06:24:46" + } + ], + "aliases": [ + + ], + "minimum-stability": "dev", + "stability-flags": [ + + ], + "platform": [ + + ], + "platform-dev": [ + + ] +} From 4022e33b04ae06ae2529b05b5638f20ec46526b5 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 9 Jun 2013 13:29:54 +0300 Subject: [PATCH 16/32] some constraints changes --- composer.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 0bad197..370c364 100644 --- a/composer.json +++ b/composer.json @@ -15,10 +15,10 @@ "require": { "symfony/framework-bundle": "~2.1", "symfony/security-bundle": "*", - "jms/metadata": "1.*", - "jms/parser-lib": "1.*", - "jms/aop-bundle": ">=1.0.0,<1.2-dev", - "jms/di-extra-bundle": "1.3.*" + "jms/metadata": "~1.0", + "jms/parser-lib": "~1.0", + "jms/aop-bundle": "~1.0", + "jms/di-extra-bundle": "~1.3" }, "require-dev": { "sensio/framework-extra-bundle": "*", From ded85f54be1515fe0957561369484f8ed97e72d7 Mon Sep 17 00:00:00 2001 From: Benjamin Laugueux Date: Sun, 9 Jun 2013 13:33:19 +0300 Subject: [PATCH 17/32] Fixed branch alias --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 370c364..18ee344 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,7 @@ "target-dir": "JMS/SecurityExtraBundle", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } } } From c0229268bcc9c6484bef65da265db96507a31262 Mon Sep 17 00:00:00 2001 From: bronze1man Date: Tue, 6 Aug 2013 14:22:12 +0800 Subject: [PATCH 18/32] fix some file mode bug 755->644 --- Command/InitSecureRandomCommand.php | 0 EventListener/SecureRandomSchemaListener.php | 0 README.md | 0 Resources/config/security_secure_random.xml | 0 Resources/doc/LICENSE | 0 Resources/doc/annotations.rst | 0 Resources/doc/configuration.rst | 0 Resources/doc/expressions.rst | 0 Resources/doc/installation.rst | 0 Resources/doc/method_security_authorization.rst | 0 Resources/doc/random_number_generator.rst | 0 Security/Util/NullSeedProvider.php | 0 Security/Util/SecureRandom.php | 0 Security/Util/SecureRandomSchema.php | 0 Security/Util/SeedProviderInterface.php | 0 Security/Util/String.php | 0 .../Security/Authorization/Expression/Fixture/Issue22/Project.php | 0 .../Authorization/Expression/Fixture/Issue22/SecuredObject.php | 0 Tests/Security/Util/SecureRandomTest.php | 0 Tests/Security/Util/StringTest.php | 0 20 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 Command/InitSecureRandomCommand.php mode change 100755 => 100644 EventListener/SecureRandomSchemaListener.php mode change 100755 => 100644 README.md mode change 100755 => 100644 Resources/config/security_secure_random.xml mode change 100755 => 100644 Resources/doc/LICENSE mode change 100755 => 100644 Resources/doc/annotations.rst mode change 100755 => 100644 Resources/doc/configuration.rst mode change 100755 => 100644 Resources/doc/expressions.rst mode change 100755 => 100644 Resources/doc/installation.rst mode change 100755 => 100644 Resources/doc/method_security_authorization.rst mode change 100755 => 100644 Resources/doc/random_number_generator.rst mode change 100755 => 100644 Security/Util/NullSeedProvider.php mode change 100755 => 100644 Security/Util/SecureRandom.php mode change 100755 => 100644 Security/Util/SecureRandomSchema.php mode change 100755 => 100644 Security/Util/SeedProviderInterface.php mode change 100755 => 100644 Security/Util/String.php mode change 100755 => 100644 Tests/Security/Authorization/Expression/Fixture/Issue22/Project.php mode change 100755 => 100644 Tests/Security/Authorization/Expression/Fixture/Issue22/SecuredObject.php mode change 100755 => 100644 Tests/Security/Util/SecureRandomTest.php mode change 100755 => 100644 Tests/Security/Util/StringTest.php diff --git a/Command/InitSecureRandomCommand.php b/Command/InitSecureRandomCommand.php old mode 100755 new mode 100644 diff --git a/EventListener/SecureRandomSchemaListener.php b/EventListener/SecureRandomSchemaListener.php old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/Resources/config/security_secure_random.xml b/Resources/config/security_secure_random.xml old mode 100755 new mode 100644 diff --git a/Resources/doc/LICENSE b/Resources/doc/LICENSE old mode 100755 new mode 100644 diff --git a/Resources/doc/annotations.rst b/Resources/doc/annotations.rst old mode 100755 new mode 100644 diff --git a/Resources/doc/configuration.rst b/Resources/doc/configuration.rst old mode 100755 new mode 100644 diff --git a/Resources/doc/expressions.rst b/Resources/doc/expressions.rst old mode 100755 new mode 100644 diff --git a/Resources/doc/installation.rst b/Resources/doc/installation.rst old mode 100755 new mode 100644 diff --git a/Resources/doc/method_security_authorization.rst b/Resources/doc/method_security_authorization.rst old mode 100755 new mode 100644 diff --git a/Resources/doc/random_number_generator.rst b/Resources/doc/random_number_generator.rst old mode 100755 new mode 100644 diff --git a/Security/Util/NullSeedProvider.php b/Security/Util/NullSeedProvider.php old mode 100755 new mode 100644 diff --git a/Security/Util/SecureRandom.php b/Security/Util/SecureRandom.php old mode 100755 new mode 100644 diff --git a/Security/Util/SecureRandomSchema.php b/Security/Util/SecureRandomSchema.php old mode 100755 new mode 100644 diff --git a/Security/Util/SeedProviderInterface.php b/Security/Util/SeedProviderInterface.php old mode 100755 new mode 100644 diff --git a/Security/Util/String.php b/Security/Util/String.php old mode 100755 new mode 100644 diff --git a/Tests/Security/Authorization/Expression/Fixture/Issue22/Project.php b/Tests/Security/Authorization/Expression/Fixture/Issue22/Project.php old mode 100755 new mode 100644 diff --git a/Tests/Security/Authorization/Expression/Fixture/Issue22/SecuredObject.php b/Tests/Security/Authorization/Expression/Fixture/Issue22/SecuredObject.php old mode 100755 new mode 100644 diff --git a/Tests/Security/Util/SecureRandomTest.php b/Tests/Security/Util/SecureRandomTest.php old mode 100755 new mode 100644 diff --git a/Tests/Security/Util/StringTest.php b/Tests/Security/Util/StringTest.php old mode 100755 new mode 100644 From 4be8fe07a409cef22487698c0a3d76caf871fcb9 Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 23 Sep 2013 11:45:08 -0400 Subject: [PATCH 19/32] Added support for DI-configurable features similar to annotations --- DependencyInjection/Configuration.php | 43 +- Metadata/ClassMetadata.php | 4 +- Metadata/Driver/AbstractDriver.php | 103 + Metadata/Driver/AnnotationDriver.php | 102 +- Metadata/Driver/ConfigDriver.php | 157 +- .../Func/ServiceCallbackFunctionCompiler.php | 2 +- .../JMSSecurityExtraExtensionTest.php | 10 +- Tests/Functional/MethodAccessControlTest.php | 14 +- .../TestBundle/Controller/FooController.php | 2 +- .../config/method_access_control.yml | 5 +- Tests/Metadata/ClassMetadataTest.php | 4 +- .../Metadata/Driver/AnnotationDriverTest.php | 5 +- Tests/Metadata/Driver/ConfigDriverTest.php | 161 + composer.lock | 2852 ----------------- 14 files changed, 536 insertions(+), 2928 deletions(-) create mode 100644 Metadata/Driver/AbstractDriver.php delete mode 100644 composer.lock diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index fe41d90..9891dd8 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -69,9 +69,46 @@ public function getConfigTreeBuilder() ->end() ->end() ->arrayNode('method_access_control') - ->useAttributeAsKey('pattern') - ->prototype('scalar')->isRequired()->cannotBeEmpty()->end() - ->end() + ->beforeNormalization() + ->always(function ($node) { + /** This is a backward compatibility layer */ + foreach ($node as $key => $value) { + if (is_string($value)) { + $node[$key] = array( + 'pattern' => $key, + 'pre_authorize' => $value + ); + } + } + + return $node; + }) + ->end() + ->useAttributeAsKey('pattern', false) + ->prototype('array') + ->children() + ->scalarNode('pattern')->end() + ->scalarNode('pre_authorize')->cannotBeEmpty()->end() + ->arrayNode('secure') + ->children() + ->arrayNode('roles')->prototype('scalar')->end() + ->end() + ->arrayNode('secure_param') + ->children() + ->scalarNode('name')->end() + ->arrayNode('permissions')->prototype('scalar')->end() + ->end() + ->arrayNode('secure_return') + ->children() + ->arrayNode('permissions')->prototype('scalar')->end() + ->end() + ->arrayNode('run_as') + ->children() + ->arrayNode('roles')->prototype('scalar')->end() + ->end() + ->booleanNode('satisfies_parent_security_policy')->end() + ->end() + ->end() ->arrayNode('util') ->addDefaultsIfNotSet() ->children() diff --git a/Metadata/ClassMetadata.php b/Metadata/ClassMetadata.php index 0f00c8f..3e4f3f8 100644 --- a/Metadata/ClassMetadata.php +++ b/Metadata/ClassMetadata.php @@ -20,7 +20,7 @@ use JMS\SecurityExtraBundle\Exception\RuntimeException; use JMS\SecurityExtraBundle\Exception\InvalidArgumentException; -use Metadata\MethodMetadata; +use Metadata\MethodMetadata as PlainMethodMetadata; use Metadata\MergeableInterface; use Metadata\MergeableClassMetadata; @@ -31,7 +31,7 @@ */ class ClassMetadata extends MergeableClassMetadata { - public function addMethodMetadata(MethodMetadata $metadata) + public function addMethodMetadata(PlainMethodMetadata $metadata) { if ($this->reflection->isFinal()) { throw new RuntimeException(sprintf('Class "%s" is declared final, and cannot be secured.', $reflection->name)); diff --git a/Metadata/Driver/AbstractDriver.php b/Metadata/Driver/AbstractDriver.php new file mode 100644 index 0000000..bfec961 --- /dev/null +++ b/Metadata/Driver/AbstractDriver.php @@ -0,0 +1,103 @@ + + */ +abstract class AbstractDriver implements DriverInterface +{ + /** + * Loads security-related metadata from configuration for a specific class + * + * @param \ReflectionClass $class Class for which to load metadata + * + * @return ClassMetatada + */ + public function loadMetadataForClass(\ReflectionClass $class) + { + $metadata = new ClassMetadata($class->name); + + $classMetadataConfig = $this->getClassScopeMetadata($class); + + $methods = $class->getMethods( + \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED + ); + + foreach ($methods as $method) { + if ($method->getDeclaringClass()->name !== $class->name) { + continue; + } + + $methodMetadataConfig = $this->getMethodScopeMetadata($method); + + $configuratedMetadata = array( + 'class' => $classMetadataConfig ? $classMetadataConfig : array(), + 'method' => $methodMetadataConfig ? $methodMetadataConfig : array() + ); + + $methodMetadata = $this->fromMetadataConfig($method, $configuratedMetadata); + + if ($methodMetadata) { + $metadata->addMethodMetadata($methodMetadata); + } + } + + return $this->metadataPostTreatment($metadata); + } + + /** + * Enables specialized post-treatment for class metadata. + * + * This method is mainly a backward compatibility strategy to bypass the + * violation of liskov substitution principle implied by the conjunction + * use of MetadataFactory and DriverChain. + * + * For more information about this bug, see issue #145 at + * + * @param ClassMetadata $metadata + * + * @return null|ClassMetadata + * + * @see https://github.com/schmittjoh/JMSSecurityExtraBundle/issues/145 + */ + abstract protected function metadataPostTreatment(ClassMetadata $metadata); + + /** + * Retrieves metadata configuration for specified method. Implementations + * should use what configuration source provided by child DriverInterface + * implementation. + * + * @param \ReflectionMethod $method Method for which the configuration will apply + * + * @return array An array of metadata configuration which can be arrays, objects, etc. + */ + abstract protected function getMethodScopeMetadata(\ReflectionMethod $method); + + /** + * Retrieves metadata configuration for specified method. Implementations + * should use what configuration source provided by child DriverInterface + * implementation. + * + * @param \ReflectionClass $class Class for which the configuration will apply + * + * @return array An array of metadata configuration which can be arrays, objects, etc. + */ + abstract protected function getClassScopeMetadata(\ReflectionClass $class); + + /** + * Converts an array of metadata configuration to a MethodMetadada. + * + * @param \ReflectionMethod $method Related method + * @param array $configs Metadata configuration to be converted + * + * @return MethodMetadata + */ + abstract protected function fromMetadataConfig(\ReflectionMethod $method, array $configs); +} diff --git a/Metadata/Driver/AnnotationDriver.php b/Metadata/Driver/AnnotationDriver.php index 44de17e..02049a1 100644 --- a/Metadata/Driver/AnnotationDriver.php +++ b/Metadata/Driver/AnnotationDriver.php @@ -38,58 +38,78 @@ * * @author Johannes M. Schmitt */ -class AnnotationDriver implements DriverInterface +class AnnotationDriver extends AbstractDriver { private $reader; + /** + * @param Reader $reader Annotation reader + */ public function __construct(Reader $reader) { $this->reader = $reader; } - public function loadMetadataForClass(ReflectionClass $reflection) + /** + * {@inheritDoc} + */ + protected function getClassScopeMetadata(ReflectionClass $class) { - $metadata = new ClassMetadata($reflection->name); - - $classPreAuthorize = $this->reader->getClassAnnotation($reflection, 'JMS\SecurityExtraBundle\Annotation\PreAuthorize'); - $classAnnotations = $this->reader->getClassAnnotations($reflection); - foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED) as $method) { - // check if the method was defined on this class - if ($method->getDeclaringClass()->name !== $reflection->name) { - continue; - } + $metadata[] = $this->reader->getClassAnnotation( + $class, + 'JMS\SecurityExtraBundle\Annotation\PreAuthorize' + ); - $annotations = $this->reader->getMethodAnnotations($method); - if ($classAnnotations) { - foreach ($classAnnotations as $classAnnotation) { - if ($classAnnotation instanceof SecureParam) { - $annotations[] = $classAnnotation; - } - } - } + return $metadata; + } - if (! $annotations && ! $classPreAuthorize) { - continue; - } + /** + * {@inheritDoc} + */ + protected function getMethodScopeMetadata(ReflectionMethod $method) + { + $metadata = $this->reader->getMethodAnnotations($method); - if (null !== $methodMetadata = $this->convertMethodAnnotations($method, $annotations, $classPreAuthorize)) { - $metadata->addMethodMetadata($methodMetadata); + $class = $method->getDeclaringClass(); + + /** + * We consider class-scope SecureParam annotations to be method-scope. + */ + foreach ($this->reader->getClassAnnotations($class) as $annotation) { + if ($annotation instanceof SecureParam) { + $metadata[] = $annotation; } } - return $metadata; + return $metadata ? $metadata : array(); } - private function convertMethodAnnotations(\ReflectionMethod $method, array $annotations, PreAuthorize $classPreAuthorize = null) + /** + * {@inheritDoc} + */ + protected function fromMetadataConfig(\ReflectionMethod $method, array $annotations) { $parameters = array(); foreach ($method->getParameters() as $index => $parameter) { $parameters[$parameter->getName()] = $index; } + $classPreAuthorize = null; + + if (isset($annotations['class'])) { + foreach ($annotations['class'] as $annotation) { + if ($annotation instanceof PreAuthorize) { + $classPreAuthorize = $annotation; + break; + } + } + } + $methodMetadata = new MethodMetadata($method->class, $method->name); + $hasSecurityMetadata = $hasPreRestrictions = false; - foreach ($annotations as $annotation) { + + foreach ($annotations['method'] as $annotation) { if ($annotation instanceof Secure) { $methodMetadata->roles = $annotation->roles; $hasSecurityMetadata = $hasPreRestrictions = true; @@ -97,11 +117,11 @@ private function convertMethodAnnotations(\ReflectionMethod $method, array $anno $methodMetadata->roles = array(new Expression($annotation->expr)); $hasSecurityMetadata = $hasPreRestrictions = true; } elseif ($annotation instanceof SecureParam) { - if (!isset($parameters[$annotation->name])) { - throw new InvalidArgumentException(sprintf('The parameter "%s" does not exist for method "%s".', $annotation->name, $method->name)); - } - - $methodMetadata->addParamPermissions($parameters[$annotation->name], $annotation->permissions); + $this->assertParamExistsForMethod($parameters, $annotation->name, $method->name); + $methodMetadata->addParamPermissions( + $parameters[$annotation->name], + $annotation->permissions + ); $hasSecurityMetadata = $hasPreRestrictions = true; } elseif ($annotation instanceof SecureReturn) { $methodMetadata->returnPermissions = $annotation->permissions; @@ -132,4 +152,22 @@ private function convertMethodAnnotations(\ReflectionMethod $method, array $anno return $hasSecurityMetadata ? $methodMetadata : null; } + + protected function metadataPostTreatment(ClassMetadata $metadata) + { + return $metadata; + } + + private function assertParamExistsForMethod(array $params, $name, $method) + { + if (!isset($params[$name])) { + throw new InvalidArgumentException( + sprintf( + 'The parameter "%s" does not exist for method "%s".', + $name, + $method + ) + ); + } + } } diff --git a/Metadata/Driver/ConfigDriver.php b/Metadata/Driver/ConfigDriver.php index 767e30d..a7c7f88 100644 --- a/Metadata/Driver/ConfigDriver.php +++ b/Metadata/Driver/ConfigDriver.php @@ -12,15 +12,19 @@ * * @author Johannes M. Schmitt */ -class ConfigDriver implements DriverInterface +class ConfigDriver extends AbstractDriver { private $bundles; private $config; + /** + * @param array $bundles A list of used bundles indexed by name. + * @param array $config Metadata configuration + */ public function __construct(array $bundles, array $config) { - uasort($bundles, function($a, $b) { - return strlen($b) - strlen($a); + uasort($bundles, function($operandA, $operandB) { + return strlen($operandB) - strlen($operandA); }); foreach ($bundles as $name => $namespace) { @@ -28,51 +32,125 @@ public function __construct(array $bundles, array $config) } $this->bundles = $bundles; - $this->config = $config; + + /** This is a BC layer */ + $this->config = array(); + foreach ($config as $key => $value) { + if (is_string($value)) { + $this->config[$key] = array( + 'pattern' => $key, + 'pre_authorize' => $value + ); + } else { + $this->config[$key] = $value; + } + } } - public function loadMetadataForClass(\ReflectionClass $class) + /** + * {@inheritDoc} + */ + protected function getMethodScopeMetadata(\ReflectionMethod $method) { - $metadata = new ClassMetadata($class->name); + $configurationFound = null; - foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $method) { - if ($method->getDeclaringClass()->name !== $class->name) { - continue; - } + if (null !== $notation = $this->getControllerNotation($method)) { + $configurationFound = $this->getConfigForSignature($notation); + } - $expression = null; - if (null !== $notation = $this->getControllerNotation($method)) { - $expression = $this->getExpressionForSignature($notation); - } + if (null === $configurationFound) { + $configurationFound = $this->getConfigForSignature($method->class.'::'.$method->name); + } - if (null === $expression && null === $expression = - $this->getExpressionForSignature($method->class.'::'.$method->name)) { - continue; - } + return $configurationFound ? $configurationFound : array(); + } - $methodMetadata = new MethodMetadata($method->class, $method->name); - $methodMetadata->roles = array(new Expression($expression)); - $metadata->addMethodMetadata($methodMetadata); + /** + * {@inheritDoc} + */ + protected function getClassScopeMetadata(\ReflectionClass $class) + { + /** + * Class configuration metadata is not supported. Use more general + * regex pattern in configuration instead. + */ + + return array(); + } + + /** + * {@inheritDoc} + */ + protected function fromMetadataConfig(\ReflectionMethod $method, array $configs) + { + $parameters = array(); + foreach ($method->getParameters() as $index => $parameter) { + $parameters[$parameter->getName()] = $index; } - if (!$metadata->methodMetadata) { - return null; + $methodMetadata = new MethodMetadata($method->class, $method->name); + + $hasSecurityMetadata = false; + + foreach ($configs['method'] as $name => $config) { + switch ($name) { + case "pre_authorize": + $methodMetadata->roles = array(new Expression($config)); + $hasSecurityMetadata = true; + break; + case "secure": + $methodMetadata->roles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "secure_param": + $this->assertParamExistsForMethod($parameters, $config['name'], $method->name); + $methodMetadata->addParamPermissions( + $parameters[$config['name']], $config['permissions'] + ); + $hasSecurityMetadata = true; + break; + case "secure_return": + $methodMetadata->returnPermissions = $config['permissions']; + $hasSecurityMetadata = true; + break; + case "run_as": + $methodMetadata->runAsRoles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "satisfies_parent_security_policy": + $methodMetadata->satisfiesParentSecurityPolicy = true; + $hasSecurityMetadata = true; + break; + } } - return $metadata; + return $hasSecurityMetadata ? $methodMetadata : null; } - private function getExpressionForSignature($signature) + protected function getConfigForSignature($signature) { - foreach ($this->config as $pattern => $expr) { - if (!preg_match('#'.$pattern.'#i', $signature)) { + $configurationFound = null; + + foreach ($this->config as $config) { + if (!preg_match('#'.$config['pattern'].'#i', $signature)) { continue; } - return $expr; + $configurationFound = $config; + + break; } - return null; + return $configurationFound; + } + + protected function metadataPostTreatment(ClassMetadata $metadata) + { + if (!$metadata->methodMetadata) { + $metadata = null; + } + + return $metadata; } // TODO: Is it feasible to reverse-engineer the notation for service controllers? @@ -81,7 +159,13 @@ private function getControllerNotation(\ReflectionMethod $method) $signature = $method->class.'::'.$method->name; // check if class is a controller - if (0 === preg_match('#\\\\Controller\\\\([^\\\\]+)Controller::(.+)Action$#', $signature, $match)) { + $matched = preg_match( + '#\\\\Controller\\\\([^\\\\]+)Controller::(.+)Action$#', + $signature, + $match + ); + + if (!$matched) { return null; } @@ -96,4 +180,17 @@ private function getControllerNotation(\ReflectionMethod $method) return null; } + + private function assertParamExistsForMethod(array $params, $name, $method) + { + if (!isset($params[$name])) { + throw new \InvalidArgumentException( + sprintf( + 'The parameter "%s" does not exist for method "%s".', + $name, + $method + ) + ); + } + } } diff --git a/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php b/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php index 3cf2266..9e72e7a 100644 --- a/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php +++ b/Security/Authorization/Expression/Compiler/Func/ServiceCallbackFunctionCompiler.php @@ -54,4 +54,4 @@ public function getName() { return $this->functionName; } -} \ No newline at end of file +} diff --git a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php index 9eedce9..6e57aa5 100644 --- a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php +++ b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php @@ -60,7 +60,13 @@ public function testConfigLoadWithMethodAccessControl() ) )), $container = $this->getContainer()); - $this->assertEquals(array(':login$' => 'hasRole("FOO")'), + $this->assertEquals( + array( + ':login$' => array( + 'pattern' => ':login$', + 'pre_authorize' => 'hasRole("FOO")', + ) + ), $container->getParameter('security.access.method_access_control')); } @@ -71,7 +77,7 @@ public function testConfigLoadThrowsExceptionWhenMethodAccessControlWithoutExpre { $this->extension->load(array(array( 'expressions' => false, - 'method_access_control' => array('foo' => 'bar'), + 'method_access_control' => array('foo' => 'bar', 'FOO' => 'BAR'), )), $this->getContainer()); } diff --git a/Tests/Functional/MethodAccessControlTest.php b/Tests/Functional/MethodAccessControlTest.php index 36f07d4..7852573 100644 --- a/Tests/Functional/MethodAccessControlTest.php +++ b/Tests/Functional/MethodAccessControlTest.php @@ -61,6 +61,17 @@ public function testUserManagerDeleteIsSecure() $manager->delete(); } + /** + * @runInSeparateProcess + */ + public function testCrudEditIsSecureWithAdvancedConfiguration() + { + $client = $this->createClient(array('config' => 'method_access_control.yml')); + + $client->request('GET', '/edit'); + $this->assertRedirectedToLogin($client->getResponse()); + } + /** * @runInSeparateProcess */ @@ -73,6 +84,7 @@ public function testFunctionEvaluator() $client->request('GET', '/post/foo'); $response = $client->getResponse(); + $this->assertEquals('foo', $response->getContent()); $this->assertEquals(1, $evaluator->getNbCalls()); @@ -123,4 +135,4 @@ private function assertRedirectedToLogin(Response $response) $this->assertEquals(302, $response->getStatusCode()); $this->assertEquals('http://localhost/login', $response->headers->get('Location')); } -} \ No newline at end of file +} diff --git a/Tests/Functional/TestBundle/Controller/FooController.php b/Tests/Functional/TestBundle/Controller/FooController.php index 2ab9752..cf62350 100644 --- a/Tests/Functional/TestBundle/Controller/FooController.php +++ b/Tests/Functional/TestBundle/Controller/FooController.php @@ -20,4 +20,4 @@ public function barAction() { return new Response(); } -} \ No newline at end of file +} diff --git a/Tests/Functional/config/method_access_control.yml b/Tests/Functional/config/method_access_control.yml index 937de7c..18f9262 100644 --- a/Tests/Functional/config/method_access_control.yml +++ b/Tests/Functional/config/method_access_control.yml @@ -11,4 +11,7 @@ jms_security_extra: 'UserManager::delete$': 'hasRole("FOO")' 'TestBundle:Crud:add': 'hasRole("FOO")' 'TestBundle:Foo:exception': 'permitAll' - 'TestBundle:Foo:.*': 'hasRole("MOO")' \ No newline at end of file + 'TestBundle:Foo:.*': 'hasRole("MOO")' + AdvancedConfig: + pattern: 'TestBundle:Crud:edit$' + pre_authorize: 'hasRole("FOO")' diff --git a/Tests/Metadata/ClassMetadataTest.php b/Tests/Metadata/ClassMetadataTest.php index b7c0086..11c965f 100644 --- a/Tests/Metadata/ClassMetadataTest.php +++ b/Tests/Metadata/ClassMetadataTest.php @@ -47,14 +47,14 @@ public function testAnalyzeThrowsNoExceptionWhenAbstractMethodIsNotOverridenInDi $metadata = $metadata->methodMetadata['abstractMethod']; $this->assertEquals(array('VIEW'), $metadata->returnPermissions); } - + public function testAnalyzeThrowsNoExceptionWhenSatisfiesParentSecurityPolicyIsDefined() { $metadata = $this ->getFactory() ->getMetadataForClass('JMS\SecurityExtraBundle\Tests\Fixtures\CorrectSubService') ; - + $methods = $metadata->methodMetadata; $this->assertTrue(isset($methods['differentMethodSignature'])); diff --git a/Tests/Metadata/Driver/AnnotationDriverTest.php b/Tests/Metadata/Driver/AnnotationDriverTest.php index 16dc7cd..43035da 100644 --- a/Tests/Metadata/Driver/AnnotationDriverTest.php +++ b/Tests/Metadata/Driver/AnnotationDriverTest.php @@ -24,6 +24,9 @@ require_once __DIR__.'/Fixtures/services.php'; +/** + * @group driver + */ class AnnotationDriverTest extends \PHPUnit_Framework_TestCase { public function testLoadMetadataWithClassPreAuthorize() @@ -111,4 +114,4 @@ public function testLoadMetadataFromClassWithRolesAndPermissionsArrayNotation() $this->assertEquals(array(0 => array('OWNER')), $method->paramPermissions); $this->assertEquals(array('MASTER'), $method->returnPermissions); } -} \ No newline at end of file +} diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index bfd8d62..390fc02 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -6,6 +6,9 @@ use JMS\SecurityExtraBundle\Metadata\MethodMetadata; use JMS\SecurityExtraBundle\Metadata\Driver\ConfigDriver; +/** + * @group driver + */ class ConfigDriverTest extends \PHPUnit_Framework_TestCase { public function testLoadMetadata() @@ -46,6 +49,164 @@ public function testLoadMetadataWithoutConfig() $this->assertNull($driver->loadMetadataForClass($this->getClass('Controller\\CrudController'))); } + /** + * @dataProvider advancedConfigProvider + */ + public function testLoadAdvancedMetadata($config, $securedClass, $securedMethods) + { + $driver = new ConfigDriver(array(), $config); + + $reflection = new \ReflectionClass( + 'JMS\SecurityExtraBundle\Tests\Mapping\Driver\\'.$securedClass + ); + + $metadata = $driver->loadMetadataForClass($reflection); + + $this->assertEquals(1, count($metadata->methodMetadata)); + + foreach ($config as $configEntry) { + foreach ($configEntry as $key => $content) { + switch ($key) { + case 'pattern' : + break 2; + case 'pre_authorize': + $assert = "assertPreAuthorize"; + break; + case 'secure' : + $assert = "assertSecure"; + break; + case 'secure_param' : + $assert ="assertSecureParam"; + break; + case 'secure_return': + $assert = "assertSecureReturn"; + break; + case 'run_as' : + $assert = "assertRunAs"; + break; + case 'satisfies_parent_security_policy': + $assert = "assertSatisfiesParentSecurity"; + break; + default : + $this->fail("Unknown configuration key found: ". $key); + break; + } + + foreach ($metadata->methodMetadata as $name => $metadata) { + $this->assertEquals($name, current($securedMethods)); + $this->{$assert}($metadata, current($securedMethods), $content ); + + next($securedMethods); + } + } + } + } + + protected function assertPreAuthorize($loadedMethod, $config) + { + $expression = new Expression(current($config)); + + $this->assertEquals( + array($expression), $loadedMethod->roles, + sprintf("Expected expression %s got %s", $expression, $loadedMethod->roles) + ); + } + + protected function assertSecure($loadedMethod, $config) + { + $this->assertPreAuthorize($loadedMethod, $config); + } + + protected function assertSecureParam($loadedMethod, $config) + { + $expectedPermission = $loadedMethod->paramPermissions[$config['name']]; + + $this->assertEquals( + $expectedPermissions, $config['permission'], + sprintf("Expected parameter permission %s got %s", $expectedPermission, $config['permission']) + ); + } + + protected function assertSecureReturn($loadedMethod, $config) + { + $this->assertEquals( + $loadedMethod->returnPermissions, $config, + sprintf("Expected return permission %s got %s". $loadedMethod->returnPermission, $config) + ); + } + + protected function assertRunAs($loadedMethods, $expectedMethods, $config) + { + } + + protected function assertSatisfiesParentSecurity($loadedMethods, $expectedMethods, $config) + { + } + + public function advancedConfigProvider() + { + return array( + array( + 'config' => array(array( + 'pattern' => 'FooService::foo', + 'secure' => array( + 'roles' => array( + 'ROLE_USER', 'ROLE_ADMIN', 'ROLE_SUPERADMIN' + ), + ), + 'secure_param' => array('name' => 'param', 'permissions' => array('VIEW')), + )), + 'securedClass' => 'FooService', + 'securedMethods' => array('foo'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooService::shortNotation', + 'secure' => array( + 'roles' => array('ROLE_FOO', 'ROLE_BAR') + ), + )), + 'securedClass' => 'FooService', + 'securedMethods' => array('shortNotation'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooService::bar', + 'secure' => array('roles' => 'ROLE_FOO, ROLE_BAR'), + 'secure_param' => array( + 'name' => 'param', 'permissions' => array('OWNER') + ), + 'secure_return' => array('permissions' => 'MASTER'), + )), + 'securedClass' => 'FooService', + 'securedMethods' => array('bar'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooSecureService::foo', + 'secure_param' => array( + 'name' => 'anotherParam', 'permissions' => array('EDIT') + ), + )), + 'securedClass' => 'FooSecureService', + 'securedMethods' => array('foo'), + ), + array( + 'config' => array(array( + 'pattern' => 'FooMultipleSecureService::foo', + 'secure_param' => array( + 'name' => 'param', 'permissions' => array('VIEW') + ), + 'secure_param' => array( + 'name' => 'anotherParam', 'permissions' => array('EDIT') + ), + )), + 'securedClass' => 'FooMultipleSecureService', + 'securedMethods' => array('foo'), + ), + ); + } + private function getClass($name) { return new \ReflectionClass('JMS\SecurityExtraBundle\Tests\Metadata\Driver\Fixtures\\'.$name); diff --git a/composer.lock b/composer.lock deleted file mode 100644 index cb0afed..0000000 --- a/composer.lock +++ /dev/null @@ -1,2852 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" - ], - "hash": "245b473818cbc4ba651db063782d7a2b", - "packages": [ - { - "name": "doctrine/annotations", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "v1.1.1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/v1.1.1", - "reference": "v1.1.1", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "doctrine/cache": "1.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Annotations\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2013-04-20 08:30:17" - }, - { - "name": "doctrine/cache", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "89493d2c6e1362f581f9de1c1871cc52eb29c030" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/89493d2c6e1362f581f9de1c1871cc52eb29c030", - "reference": "89493d2c6e1362f581f9de1c1871cc52eb29c030", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Cache\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "cache", - "caching" - ], - "time": "2013-06-07 14:54:47" - }, - { - "name": "doctrine/collections", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "3db3ab843ff76774bee4679d4cb3a10cffb0a935" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/3db3ab843ff76774bee4679d4cb3a10cffb0a935", - "reference": "3db3ab843ff76774bee4679d4cb3a10cffb0a935", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Collections\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan H. Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Collections Abstraction library", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "array", - "collections", - "iterator" - ], - "time": "2013-05-26 05:21:22" - }, - { - "name": "doctrine/common", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe", - "reference": "2169b0ce1d253d448c60b7d40bbe4e4b5afe22fe", - "shasum": "" - }, - "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "collections", - "eventmanager", - "persistence", - "spl" - ], - "time": "2013-05-27 19:11:46" - }, - { - "name": "doctrine/inflector", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", - "reference": "8b4b3ccec7aafc596e2fc1e593c9f2e78f939c8c", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "inflection", - "pluralize", - "singularize", - "string" - ], - "time": "2013-04-10 16:14:30" - }, - { - "name": "doctrine/lexer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", - "reference": "bc0e1f0cc285127a38c6c8ea88bc5dba2fd53e94", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "lexer", - "parser" - ], - "time": "2013-03-07 12:15:25" - }, - { - "name": "jms/aop-bundle", - "version": "dev-master", - "target-dir": "JMS/AopBundle", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/JMSAopBundle.git", - "reference": "7018357f5bedf204979a88867a9da05973744422" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSAopBundle/zipball/7018357f5bedf204979a88867a9da05973744422", - "reference": "7018357f5bedf204979a88867a9da05973744422", - "shasum": "" - }, - "require": { - "jms/cg": "1.*", - "symfony/framework-bundle": "2.*" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\AopBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Adds AOP capabilities to Symfony2", - "keywords": [ - "annotations", - "aop" - ], - "time": "2013-01-09 08:03:40" - }, - { - "name": "jms/cg", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/cg-library.git", - "reference": "75a519d83a33f6b893a25aef835a1e5fc166a6d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/cg-library/zipball/75a519d83a33f6b893a25aef835a1e5fc166a6d7", - "reference": "75a519d83a33f6b893a25aef835a1e5fc166a6d7", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-0": { - "CG\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Toolset for generating PHP code", - "keywords": [ - "code generation" - ], - "time": "2013-03-23 08:03:00" - }, - { - "name": "jms/di-extra-bundle", - "version": "dev-master", - "target-dir": "JMS/DiExtraBundle", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/JMSDiExtraBundle.git", - "reference": "a15367768d8bbf0b5eac135adf31880ed99cc12d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSDiExtraBundle/zipball/a15367768d8bbf0b5eac135adf31880ed99cc12d", - "reference": "a15367768d8bbf0b5eac135adf31880ed99cc12d", - "shasum": "" - }, - "require": { - "jms/aop-bundle": ">=1.0.0,<1.2-dev", - "jms/metadata": "1.*", - "symfony/finder": ">=2.1,<3.0", - "symfony/framework-bundle": ">=2.1,<3.0", - "symfony/process": ">=2.1,<3.0" - }, - "require-dev": { - "doctrine/doctrine-bundle": "*", - "doctrine/orm": "*", - "jms/security-extra-bundle": "1.*", - "phpcollection/phpcollection": ">=0.1,<0.3-dev", - "sensio/framework-extra-bundle": "*", - "symfony/browser-kit": "*", - "symfony/class-loader": "*", - "symfony/form": "*", - "symfony/security-bundle": "*", - "symfony/twig-bundle": "*", - "symfony/validator": "*", - "symfony/yaml": "*" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\DiExtraBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Allows to configure dependency injection using annotations", - "homepage": "http://jmsyst.com/bundles/JMSDiExtraBundle", - "keywords": [ - "annotations", - "dependency injection" - ], - "time": "2013-03-21 16:34:41" - }, - { - "name": "jms/metadata", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/metadata.git", - "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", - "reference": "0979c7d9eb7f0031a3c5ffed1d6e1fa4eb846e4e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "doctrine/common": ">=2.0,<2.4-dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Metadata\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Class/method/property metadata management in PHP", - "keywords": [ - "annotations", - "metadata", - "xml", - "yaml" - ], - "time": "2013-03-28 16:32:37" - }, - { - "name": "jms/parser-lib", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/parser-lib.git", - "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", - "reference": "4d469a70c6dd03f921cbdeadafbcb261bb23e8b0", - "shasum": "" - }, - "require": { - "phpoption/phpoption": ">=0.9,<2.0-dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A library for easily creating recursive-descent parsers.", - "time": "2012-11-30 08:11:04" - }, - { - "name": "phpoption/phpoption", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/1c7e8016289d17d83ced49c56d0f266fd0568941", - "reference": "1c7e8016289d17d83ced49c56d0f266fd0568941", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-0": { - "PhpOption\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "time": "2013-05-19 11:09:35" - }, - { - "name": "psr/log", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log", - "reference": "1.0.0" - }, - "dist": { - "type": "zip", - "url": "https://github.com/php-fig/log/archive/1.0.0.zip", - "reference": "1.0.0", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Psr\\Log\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2012-12-21 11:40:51" - }, - { - "name": "symfony/config", - "version": "dev-master", - "target-dir": "Symfony/Component/Config", - "source": { - "type": "git", - "url": "https://github.com/symfony/Config.git", - "reference": "c2e148f4d1daa2ae407a27a07ff433fadfd6de77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/c2e148f4d1daa2ae407a27a07ff433fadfd6de77", - "reference": "c2e148f4d1daa2ae407a27a07ff433fadfd6de77", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/filesystem": ">=2.3,<3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Config\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/debug", - "version": "dev-master", - "target-dir": "Symfony/Component/Debug", - "source": { - "type": "git", - "url": "https://github.com/symfony/Debug.git", - "reference": "bcf326c347d9e2ccafde5e30fb938e09255f6c1a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Debug/zipball/bcf326c347d9e2ccafde5e30fb938e09255f6c1a", - "reference": "bcf326c347d9e2ccafde5e30fb938e09255f6c1a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/http-foundation": ">=2.1,<3.0", - "symfony/http-kernel": ">=2.1,<3.0" - }, - "suggest": { - "symfony/class-loader": "", - "symfony/http-foundation": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Debug\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/dependency-injection", - "version": "dev-master", - "target-dir": "Symfony/Component/DependencyInjection", - "source": { - "type": "git", - "url": "https://github.com/symfony/DependencyInjection.git", - "reference": "db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9", - "reference": "db5cf551bfebe8fbb0a0734eaf5d732aa10b74e9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/config": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "symfony/config": "", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\DependencyInjection\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/event-dispatcher", - "version": "dev-master", - "target-dir": "Symfony/Component/EventDispatcher", - "source": { - "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "4b34aad44d0a2d91f301ee967151ce0980f39930" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/4b34aad44d0a2d91f301ee967151ce0980f39930", - "reference": "4b34aad44d0a2d91f301ee967151ce0980f39930", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/dependency-injection": ">=2.0,<3.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/filesystem", - "version": "dev-master", - "target-dir": "Symfony/Component/Filesystem", - "source": { - "type": "git", - "url": "https://github.com/symfony/Filesystem.git", - "reference": "3567f5f48305098044c6d6a383f5cefec9c45efa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/3567f5f48305098044c6d6a383f5cefec9c45efa", - "reference": "3567f5f48305098044c6d6a383f5cefec9c45efa", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Filesystem\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/finder", - "version": "dev-master", - "target-dir": "Symfony/Component/Finder", - "source": { - "type": "git", - "url": "https://github.com/symfony/Finder.git", - "reference": "b709a80b766b47761ae1d1e27a6fa6b4e62dcf08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/b709a80b766b47761ae1d1e27a6fa6b4e62dcf08", - "reference": "b709a80b766b47761ae1d1e27a6fa6b4e62dcf08", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Finder\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/framework-bundle", - "version": "dev-master", - "target-dir": "Symfony/Bundle/FrameworkBundle", - "source": { - "type": "git", - "url": "https://github.com/symfony/FrameworkBundle.git", - "reference": "28fa76f09660af3fa45dde1ad4c296c8758cec5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/FrameworkBundle/zipball/28fa76f09660af3fa45dde1ad4c296c8758cec5e", - "reference": "28fa76f09660af3fa45dde1ad4c296c8758cec5e", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.2,<3.0", - "php": ">=5.3.3", - "symfony/config": ">=2.2,<3.0", - "symfony/dependency-injection": ">=2.2,<3.0", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/filesystem": ">=2.3,<3.0", - "symfony/http-kernel": ">=2.3,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/stopwatch": ">=2.3,<3.0", - "symfony/templating": ">=2.1,<3.0", - "symfony/translation": ">=2.3,<3.0" - }, - "require-dev": { - "symfony/class-loader": ">=2.1,<3.0", - "symfony/finder": ">=2.0,<3.0", - "symfony/form": ">=2.3,<3.0", - "symfony/security": ">=2.3,<3.0", - "symfony/validator": ">=2.1,<3.0" - }, - "suggest": { - "symfony/console": "", - "symfony/finder": "", - "symfony/form": "", - "symfony/validator": "" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony FrameworkBundle", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/http-foundation", - "version": "dev-master", - "target-dir": "Symfony/Component/HttpFoundation", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "f484475d926fe5dad901c559ef1bef395385b3a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/f484475d926fe5dad901c559ef1bef395385b3a9", - "reference": "f484475d926fe5dad901c559ef1bef395385b3a9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "classmap": [ - "Symfony/Component/HttpFoundation/Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "http://symfony.com", - "time": "2013-06-04 15:12:29" - }, - { - "name": "symfony/http-kernel", - "version": "dev-master", - "target-dir": "Symfony/Component/HttpKernel", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpKernel.git", - "reference": "884e196581541a9801e1a0b0000ddf2118dcc30c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/884e196581541a9801e1a0b0000ddf2118dcc30c", - "reference": "884e196581541a9801e1a0b0000ddf2118dcc30c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "psr/log": ">=1.0,<2.0", - "symfony/debug": ">=2.3,<3.0", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/http-foundation": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/browser-kit": "2.2.*", - "symfony/class-loader": ">=2.1,<3.0", - "symfony/config": ">=2.0,<3.0", - "symfony/console": "2.2.*", - "symfony/dependency-injection": ">=2.0,<3.0", - "symfony/finder": ">=2.0,<3.0", - "symfony/process": ">=2.0,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/stopwatch": ">=2.2,<3.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/class-loader": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpKernel\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/process", - "version": "dev-master", - "target-dir": "Symfony/Component/Process", - "source": { - "type": "git", - "url": "https://github.com/symfony/Process.git", - "reference": "75c810176f8e069714cef8696d7ecc3aa86e8168" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/75c810176f8e069714cef8696d7ecc3aa86e8168", - "reference": "75c810176f8e069714cef8696d7ecc3aa86e8168", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Process\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/routing", - "version": "dev-master", - "target-dir": "Symfony/Component/Routing", - "source": { - "type": "git", - "url": "https://github.com/symfony/Routing.git", - "reference": "93fa88b2494d3262c87ca0762551a658cc390669" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/93fa88b2494d3262c87ca0762551a658cc390669", - "reference": "93fa88b2494d3262c87ca0762551a658cc390669", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "doctrine/common": ">=2.2,<3.0", - "psr/log": ">=1.0,<2.0", - "symfony/config": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "doctrine/common": "", - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Routing\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Routing Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/security", - "version": "dev-master", - "target-dir": "Symfony/Component/Security", - "source": { - "type": "git", - "url": "https://github.com/symfony/Security.git", - "reference": "693c2395ef2f1d27d04c56bf6172202c90c95697" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Security/zipball/693c2395ef2f1d27d04c56bf6172202c90c95697", - "reference": "693c2395ef2f1d27d04c56bf6172202c90c95697", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/http-foundation": ">=2.1,<3.0", - "symfony/http-kernel": ">=2.1,<3.0" - }, - "require-dev": { - "doctrine/common": ">=2.2,<3.0", - "doctrine/dbal": ">=2.2,<3.0", - "ircmaxell/password-compat": "1.0.*", - "psr/log": ">=1.0,<2.0", - "symfony/form": ">=2.0,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0" - }, - "suggest": { - "doctrine/dbal": "to use the built-in ACL implementation", - "ircmaxell/password-compat": "", - "symfony/class-loader": "", - "symfony/finder": "", - "symfony/form": "", - "symfony/routing": "", - "symfony/validator": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Security\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Security Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/security-bundle", - "version": "dev-master", - "target-dir": "Symfony/Bundle/SecurityBundle", - "source": { - "type": "git", - "url": "https://github.com/symfony/SecurityBundle.git", - "reference": "ff1b9ca906cd405f0a3e07841abcc9c8417f44cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/SecurityBundle/zipball/ff1b9ca906cd405f0a3e07841abcc9c8417f44cd", - "reference": "ff1b9ca906cd405f0a3e07841abcc9c8417f44cd", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/http-kernel": ">=2.2,<3.0", - "symfony/security": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/form": ">=2.1,<3.0", - "symfony/framework-bundle": ">=2.2,<3.0", - "symfony/twig-bundle": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bundle\\SecurityBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony SecurityBundle", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/stopwatch", - "version": "dev-master", - "target-dir": "Symfony/Component/Stopwatch", - "source": { - "type": "git", - "url": "https://github.com/symfony/Stopwatch.git", - "reference": "453f661bad0ec73417ccce9853b1dc6c2a885db1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/453f661bad0ec73417ccce9853b1dc6c2a885db1", - "reference": "453f661bad0ec73417ccce9853b1dc6c2a885db1", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Stopwatch\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/templating", - "version": "dev-master", - "target-dir": "Symfony/Component/Templating", - "source": { - "type": "git", - "url": "https://github.com/symfony/Templating.git", - "reference": "cd1b2c0a6f67844f44efdbd365bcd33b546ce713" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Templating/zipball/cd1b2c0a6f67844f44efdbd365bcd33b546ce713", - "reference": "cd1b2c0a6f67844f44efdbd365bcd33b546ce713", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Templating\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Templating Component", - "homepage": "http://symfony.com", - "time": "2013-06-04 15:16:10" - }, - { - "name": "symfony/translation", - "version": "dev-master", - "target-dir": "Symfony/Component/Translation", - "source": { - "type": "git", - "url": "https://github.com/symfony/Translation.git", - "reference": "ed0c7257bfc533205dff78f9d247c2544c830ddc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/ed0c7257bfc533205dff78f9d247c2544c830ddc", - "reference": "ed0c7257bfc533205dff78f9d247c2544c830ddc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/config": ">=2.0,<3.0", - "symfony/yaml": ">=2.2,<3.0" - }, - "suggest": { - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Translation Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - } - ], - "packages-dev": [ - { - "name": "doctrine/dbal", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750", - "reference": "5a8eedf627339ed682d1a2d8d3a4aaf8ac8af750", - "shasum": "" - }, - "require": { - "doctrine/common": "2.4.*@beta", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*", - "symfony/console": "2.*" - }, - "suggest": { - "symfony/console": "Allows use of the command line interface" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\DBAL\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - } - ], - "description": "Database Abstraction Layer", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "persistence", - "queryobject" - ], - "time": "2013-06-07 18:55:27" - }, - { - "name": "doctrine/doctrine-bundle", - "version": "dev-master", - "target-dir": "Doctrine/Bundle/DoctrineBundle", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "9218b4116e86b1d278564b8550fb2f53eb400093" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/9218b4116e86b1d278564b8550fb2f53eb400093", - "reference": "9218b4116e86b1d278564b8550fb2f53eb400093", - "shasum": "" - }, - "require": { - "doctrine/dbal": ">=2.2,<2.5-dev", - "jdorn/sql-formatter": ">=1.1,<2.0", - "php": ">=5.3.2", - "symfony/doctrine-bridge": ">=2.2,<3.0", - "symfony/framework-bundle": ">=2.2,<3.0" - }, - "require-dev": { - "doctrine/orm": ">=2.2,<2.5-dev", - "symfony/validator": ">=2.2,<3.0", - "symfony/yaml": ">=2.2,<3.0" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "symfony/web-profiler-bundle": "to use the data collector" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Bundle\\DoctrineBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - } - ], - "description": "Symfony DoctrineBundle", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], - "time": "2013-05-04 07:57:29" - }, - { - "name": "doctrine/orm", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/doctrine2.git", - "reference": "462173ad71ae63cd9877e1e642f7968ed1f9971b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/462173ad71ae63cd9877e1e642f7968ed1f9971b", - "reference": "462173ad71ae63cd9877e1e642f7968ed1f9971b", - "shasum": "" - }, - "require": { - "doctrine/collections": ">=1.1,<2.0", - "doctrine/dbal": ">=2.4-beta,<2.5-dev", - "ext-pdo": "*", - "php": ">=5.3.2", - "symfony/console": "2.*" - }, - "require-dev": { - "symfony/yaml": "2.1" - }, - "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine", - "bin/doctrine.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\ORM\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "orm" - ], - "time": "2013-06-07 21:42:59" - }, - { - "name": "jdorn/sql-formatter", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "v1.2.9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/v1.2.9", - "reference": "v1.2.9", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "lib" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "time": "2013-04-26 18:42:52" - }, - { - "name": "sensio/framework-extra-bundle", - "version": "dev-master", - "target-dir": "Sensio/Bundle/FrameworkExtraBundle", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "v2.3.0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/v2.3.0", - "reference": "v2.3.0", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.2,<3.0", - "symfony/framework-bundle": ">=2.2,<3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Sensio\\Bundle\\FrameworkExtraBundle": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "time": "2013-06-02 16:13:20" - }, - { - "name": "symfony/browser-kit", - "version": "dev-master", - "target-dir": "Symfony/Component/BrowserKit", - "source": { - "type": "git", - "url": "https://github.com/symfony/BrowserKit.git", - "reference": "2d2343dac844a365bd28a7cefd56b47d09e62dda" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/2d2343dac844a365bd28a7cefd56b47d09e62dda", - "reference": "2d2343dac844a365bd28a7cefd56b47d09e62dda", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/dom-crawler": ">=2.0,<3.0" - }, - "require-dev": { - "symfony/css-selector": ">=2.0,<3.0", - "symfony/process": ">=2.0,<3.0" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\BrowserKit\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony BrowserKit Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/class-loader", - "version": "dev-master", - "target-dir": "Symfony/Component/ClassLoader", - "source": { - "type": "git", - "url": "https://github.com/symfony/ClassLoader.git", - "reference": "0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776", - "reference": "0cea075c5e7fa61c86ca3cf6cfbed65cf0b1f776", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/finder": ">=2.0,<3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\ClassLoader\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony ClassLoader Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/console", - "version": "dev-master", - "target-dir": "Symfony/Component/Console", - "source": { - "type": "git", - "url": "https://github.com/symfony/Console.git", - "reference": "28b4eced63a11275583345feb3c8269967819eca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/28b4eced63a11275583345feb3c8269967819eca", - "reference": "28b4eced63a11275583345feb3c8269967819eca", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/event-dispatcher": ">=2.1,<3.0" - }, - "suggest": { - "symfony/event-dispatcher": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Console\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "http://symfony.com", - "time": "2013-06-04 15:09:18" - }, - { - "name": "symfony/css-selector", - "version": "dev-master", - "target-dir": "Symfony/Component/CssSelector", - "source": { - "type": "git", - "url": "https://github.com/symfony/CssSelector.git", - "reference": "504601ed1aff97d2327a4f65f3f76ac478c57d45" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/CssSelector/zipball/504601ed1aff97d2327a4f65f3f76ac478c57d45", - "reference": "504601ed1aff97d2327a4f65f3f76ac478c57d45", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\CssSelector\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/doctrine-bridge", - "version": "dev-master", - "target-dir": "Symfony/Bridge/Doctrine", - "source": { - "type": "git", - "url": "https://github.com/symfony/DoctrineBridge.git", - "reference": "b65586b8cf8b5907a3de7290c0b43822ccb5edc8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/DoctrineBridge/zipball/b65586b8cf8b5907a3de7290c0b43822ccb5edc8", - "reference": "b65586b8cf8b5907a3de7290c0b43822ccb5edc8", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.2,<3.0", - "php": ">=5.3.3" - }, - "require-dev": { - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": ">=2.2,<3.0", - "doctrine/orm": ">=2.2,<3.0,>=2.2.3", - "symfony/dependency-injection": ">=2.0,<3.0", - "symfony/form": ">=2.2,<3.0", - "symfony/http-kernel": ">=2.2,<3.0", - "symfony/security": ">=2.2,<3.0", - "symfony/stopwatch": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/validator": "" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bridge\\Doctrine\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Doctrine Bridge", - "homepage": "http://symfony.com", - "time": "2013-05-16 20:40:38" - }, - { - "name": "symfony/dom-crawler", - "version": "dev-master", - "target-dir": "Symfony/Component/DomCrawler", - "source": { - "type": "git", - "url": "https://github.com/symfony/DomCrawler.git", - "reference": "09f0cd5980511ee77c2e8142405ccd5c867506b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/09f0cd5980511ee77c2e8142405ccd5c867506b9", - "reference": "09f0cd5980511ee77c2e8142405ccd5c867506b9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/css-selector": ">=2.0,<3.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\DomCrawler\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/form", - "version": "dev-master", - "target-dir": "Symfony/Component/Form", - "source": { - "type": "git", - "url": "https://github.com/symfony/Form.git", - "reference": "3f33335a1217b6e7d2489dbde50da6b4bf3593cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Form/zipball/3f33335a1217b6e7d2489dbde50da6b4bf3593cc", - "reference": "3f33335a1217b6e7d2489dbde50da6b4bf3593cc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/event-dispatcher": ">=2.1,<3.0", - "symfony/intl": ">=2.3,<3.0", - "symfony/options-resolver": ">=2.1,<3.0", - "symfony/property-access": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/http-foundation": ">=2.2,<3.0", - "symfony/validator": ">=2.2,<3.0" - }, - "suggest": { - "symfony/http-foundation": "", - "symfony/validator": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Form\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Form Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/icu", - "version": "1.2.x-dev", - "target-dir": "Symfony/Component/Icu", - "source": { - "type": "git", - "url": "https://github.com/symfony/Icu.git", - "reference": "v1.2.0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Icu/zipball/v1.2.0", - "reference": "v1.2.0", - "shasum": "" - }, - "require": { - "lib-icu": ">=4.4", - "php": ">=5.3.3", - "symfony/intl": ">=2.3,<3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Symfony\\Component\\Icu\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Contains an excerpt of the ICU data and classes to load it.", - "homepage": "http://symfony.com", - "keywords": [ - "icu", - "intl" - ], - "time": "2013-06-03 18:32:58" - }, - { - "name": "symfony/intl", - "version": "dev-master", - "target-dir": "Symfony/Component/Intl", - "source": { - "type": "git", - "url": "https://github.com/symfony/Intl.git", - "reference": "5199c826bc2c44cd8becfc75e6ab266b37d01b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Intl/zipball/5199c826bc2c44cd8becfc75e6ab266b37d01b6a", - "reference": "5199c826bc2c44cd8becfc75e6ab266b37d01b6a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/icu": ">=1.0-RC,<2.0" - }, - "require-dev": { - "symfony/filesystem": ">=2.1" - }, - "suggest": { - "ext-intl": "to use the component with locales other than \"en\"" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Intl\\": "" - }, - "classmap": [ - "Symfony/Component/Intl/Resources/stubs" - ], - "files": [ - "Symfony/Component/Intl/Resources/stubs/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch", - "homepage": "http://wiedler.ch/igor/" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - }, - { - "name": "Eriksen Costa", - "email": "eriksen.costa@infranology.com.br" - } - ], - "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", - "homepage": "http://symfony.com", - "keywords": [ - "i18n", - "icu", - "internationalization", - "intl", - "l10n", - "localization" - ], - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/options-resolver", - "version": "dev-master", - "target-dir": "Symfony/Component/OptionsResolver", - "source": { - "type": "git", - "url": "https://github.com/symfony/OptionsResolver.git", - "reference": "48d9182e515128e6d18be9ca776a818223d39f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/48d9182e515128e6d18be9ca776a818223d39f52", - "reference": "48d9182e515128e6d18be9ca776a818223d39f52", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\OptionsResolver\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony OptionsResolver Component", - "homepage": "http://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/property-access", - "version": "dev-master", - "target-dir": "Symfony/Component/PropertyAccess", - "source": { - "type": "git", - "url": "https://github.com/symfony/PropertyAccess.git", - "reference": "3ed937623a4c1e491f46ebf8111f177ce67e13ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/3ed937623a4c1e491f46ebf8111f177ce67e13ba", - "reference": "3ed937623a4c1e491f46ebf8111f177ce67e13ba", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\PropertyAccess\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony PropertyAccess Component", - "homepage": "http://symfony.com", - "keywords": [ - "access", - "array", - "extraction", - "index", - "injection", - "object", - "property", - "property path", - "reflection" - ], - "time": "2013-05-16 07:54:39" - }, - { - "name": "symfony/twig-bridge", - "version": "dev-master", - "target-dir": "Symfony/Bridge/Twig", - "source": { - "type": "git", - "url": "https://github.com/symfony/TwigBridge.git", - "reference": "126d31387ab33074ffa9d023cc83a700ad1db238" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/126d31387ab33074ffa9d023cc83a700ad1db238", - "reference": "126d31387ab33074ffa9d023cc83a700ad1db238", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "twig/twig": ">=1.11.0,<2.0" - }, - "require-dev": { - "symfony/form": "2.2.*", - "symfony/http-kernel": ">=2.2,<3.0", - "symfony/routing": ">=2.2,<3.0", - "symfony/security": ">=2.0,<3.0", - "symfony/templating": ">=2.1,<3.0", - "symfony/translation": ">=2.2,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "symfony/form": "", - "symfony/http-kernel": "", - "symfony/routing": "", - "symfony/security": "", - "symfony/templating": "", - "symfony/translation": "", - "symfony/yaml": "" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bridge\\Twig\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "http://symfony.com", - "time": "2013-05-16 20:40:38" - }, - { - "name": "symfony/twig-bundle", - "version": "dev-master", - "target-dir": "Symfony/Bundle/TwigBundle", - "source": { - "type": "git", - "url": "https://github.com/symfony/TwigBundle.git", - "reference": "c502e341a0b8ed25e76d692f5fcc18640bb7b80a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/TwigBundle/zipball/c502e341a0b8ed25e76d692f5fcc18640bb7b80a", - "reference": "c502e341a0b8ed25e76d692f5fcc18640bb7b80a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/http-kernel": ">=2.1,<3.0", - "symfony/twig-bridge": ">=2.2,<3.0" - }, - "require-dev": { - "symfony/config": ">=2.2,<3.0", - "symfony/dependency-injection": ">=2.0,<3.0", - "symfony/stopwatch": ">=2.2,<3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Bundle\\TwigBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "http://symfony.com", - "time": "2013-05-27 14:49:42" - }, - { - "name": "symfony/validator", - "version": "dev-master", - "target-dir": "Symfony/Component/Validator", - "source": { - "type": "git", - "url": "https://github.com/symfony/Validator.git", - "reference": "a530bb62eb01865e1212ef1bf1e2166151c33c17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Validator/zipball/a530bb62eb01865e1212ef1bf1e2166151c33c17", - "reference": "a530bb62eb01865e1212ef1bf1e2166151c33c17", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/translation": ">=2.0,<3.0" - }, - "require-dev": { - "symfony/config": ">=2.2,<3.0", - "symfony/http-foundation": ">=2.1,<3.0", - "symfony/intl": ">=2.3,<3.0", - "symfony/yaml": ">=2.0,<3.0" - }, - "suggest": { - "doctrine/common": "", - "symfony/config": "", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Validator\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Validator Component", - "homepage": "http://symfony.com", - "time": "2013-06-02 12:05:59" - }, - { - "name": "symfony/yaml", - "version": "dev-master", - "target-dir": "Symfony/Component/Yaml", - "source": { - "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "82100c7732c95452702d11433aad50988700d36c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/82100c7732c95452702d11433aad50988700d36c", - "reference": "82100c7732c95452702d11433aad50988700d36c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Yaml\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "http://symfony.com", - "time": "2013-05-16 07:54:39" - }, - { - "name": "twig/twig", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/fabpot/Twig.git", - "reference": "1a6507043782f18e3765b52712cf78d16f3117e7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fabpot/Twig/zipball/1a6507043782f18e3765b52712cf78d16f3117e7", - "reference": "1a6507043782f18e3765b52712cf78d16f3117e7", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", - "keywords": [ - "templating" - ], - "time": "2013-06-07 06:24:46" - } - ], - "aliases": [ - - ], - "minimum-stability": "dev", - "stability-flags": [ - - ], - "platform": [ - - ], - "platform-dev": [ - - ] -} From 6629a6717f2d64ede06298a823b963776297b35b Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 23 Sep 2013 13:15:08 -0400 Subject: [PATCH 20/32] Fixed test conflict --- Tests/Functional/MethodAccessControlTest.php | 4 ++-- Tests/Functional/TestBundle/Controller/CrudController.php | 7 ++++++- Tests/Functional/config/method_access_control.yml | 2 +- Tests/Functional/config/routing.yml | 7 ++++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Tests/Functional/MethodAccessControlTest.php b/Tests/Functional/MethodAccessControlTest.php index 7852573..cae96db 100644 --- a/Tests/Functional/MethodAccessControlTest.php +++ b/Tests/Functional/MethodAccessControlTest.php @@ -64,11 +64,11 @@ public function testUserManagerDeleteIsSecure() /** * @runInSeparateProcess */ - public function testCrudEditIsSecureWithAdvancedConfiguration() + public function testCrudDeleteIsSecureWithAdvancedConfiguration() { $client = $this->createClient(array('config' => 'method_access_control.yml')); - $client->request('GET', '/edit'); + $client->request('GET', '/delete'); $this->assertRedirectedToLogin($client->getResponse()); } diff --git a/Tests/Functional/TestBundle/Controller/CrudController.php b/Tests/Functional/TestBundle/Controller/CrudController.php index ae90060..4be6a55 100644 --- a/Tests/Functional/TestBundle/Controller/CrudController.php +++ b/Tests/Functional/TestBundle/Controller/CrudController.php @@ -15,4 +15,9 @@ public function editAction() { return new Response(); } -} \ No newline at end of file + + public function deleteAction() + { + return new Response(); + } +} diff --git a/Tests/Functional/config/method_access_control.yml b/Tests/Functional/config/method_access_control.yml index 18f9262..bf0a1c0 100644 --- a/Tests/Functional/config/method_access_control.yml +++ b/Tests/Functional/config/method_access_control.yml @@ -13,5 +13,5 @@ jms_security_extra: 'TestBundle:Foo:exception': 'permitAll' 'TestBundle:Foo:.*': 'hasRole("MOO")' AdvancedConfig: - pattern: 'TestBundle:Crud:edit$' + pattern: 'TestBundle:Crud:delete$' pre_authorize: 'hasRole("FOO")' diff --git a/Tests/Functional/config/routing.yml b/Tests/Functional/config/routing.yml index 8550813..ea5c48f 100644 --- a/Tests/Functional/config/routing.yml +++ b/Tests/Functional/config/routing.yml @@ -8,6 +8,11 @@ crud_controller_edit: defaults: _controller: TestBundle:Crud:edit +crud_controller_delete: + pattern: /delete + defaults: + _controller: TestBundle:Crud:delete + post_controller_add: pattern: /post/add defaults: @@ -44,4 +49,4 @@ foo_bar: foo_exception: pattern: /foo/exception defaults: - _controller: TestBundle:Foo:exception \ No newline at end of file + _controller: TestBundle:Foo:exception From 86a3578efccec9b2d0679d0f239d9a5271f9dd01 Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 23 Sep 2013 13:16:33 -0400 Subject: [PATCH 21/32] fixed doc --- Metadata/Driver/AbstractDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Metadata/Driver/AbstractDriver.php b/Metadata/Driver/AbstractDriver.php index bfec961..17d5697 100644 --- a/Metadata/Driver/AbstractDriver.php +++ b/Metadata/Driver/AbstractDriver.php @@ -59,7 +59,7 @@ public function loadMetadataForClass(\ReflectionClass $class) * violation of liskov substitution principle implied by the conjunction * use of MetadataFactory and DriverChain. * - * For more information about this bug, see issue #145 at + * For more information about this bug, see issue #145 at github (see below) * * @param ClassMetadata $metadata * From c77655b02effa5b6b884c3c3225fd1eb8eace7f7 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 24 Sep 2013 12:07:10 -0400 Subject: [PATCH 22/32] Fixed indentation of switch/case statements, fixed pluralization normalization for XML config and removed value setting for Symfony comformity in DI-configuration vaidation --- DependencyInjection/Configuration.php | 7 ++- Metadata/Driver/ConfigDriver.php | 59 +++++++++---------- .../JMSSecurityExtraExtensionTest.php | 1 - Tests/Metadata/Driver/ConfigDriverTest.php | 56 +++++++++--------- 4 files changed, 62 insertions(+), 61 deletions(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 9891dd8..646d1f3 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -75,7 +75,6 @@ public function getConfigTreeBuilder() foreach ($node as $key => $value) { if (is_string($value)) { $node[$key] = array( - 'pattern' => $key, 'pre_authorize' => $value ); } @@ -84,25 +83,29 @@ public function getConfigTreeBuilder() return $node; }) ->end() - ->useAttributeAsKey('pattern', false) + ->useAttributeAsKey('pattern') ->prototype('array') ->children() ->scalarNode('pattern')->end() ->scalarNode('pre_authorize')->cannotBeEmpty()->end() ->arrayNode('secure') + ->fixXmlConfig('role') ->children() ->arrayNode('roles')->prototype('scalar')->end() ->end() ->arrayNode('secure_param') + ->fixXmlConfig('permission') ->children() ->scalarNode('name')->end() ->arrayNode('permissions')->prototype('scalar')->end() ->end() ->arrayNode('secure_return') + ->fixXmlConfig('permission') ->children() ->arrayNode('permissions')->prototype('scalar')->end() ->end() ->arrayNode('run_as') + ->fixXmlConfig('role') ->children() ->arrayNode('roles')->prototype('scalar')->end() ->end() diff --git a/Metadata/Driver/ConfigDriver.php b/Metadata/Driver/ConfigDriver.php index a7c7f88..4f90f9d 100644 --- a/Metadata/Driver/ConfigDriver.php +++ b/Metadata/Driver/ConfigDriver.php @@ -38,7 +38,6 @@ public function __construct(array $bundles, array $config) foreach ($config as $key => $value) { if (is_string($value)) { $this->config[$key] = array( - 'pattern' => $key, 'pre_authorize' => $value ); } else { @@ -94,33 +93,33 @@ protected function fromMetadataConfig(\ReflectionMethod $method, array $configs) foreach ($configs['method'] as $name => $config) { switch ($name) { - case "pre_authorize": - $methodMetadata->roles = array(new Expression($config)); - $hasSecurityMetadata = true; - break; - case "secure": - $methodMetadata->roles = $config['roles']; - $hasSecurityMetadata = true; - break; - case "secure_param": - $this->assertParamExistsForMethod($parameters, $config['name'], $method->name); - $methodMetadata->addParamPermissions( - $parameters[$config['name']], $config['permissions'] - ); - $hasSecurityMetadata = true; - break; - case "secure_return": - $methodMetadata->returnPermissions = $config['permissions']; - $hasSecurityMetadata = true; - break; - case "run_as": - $methodMetadata->runAsRoles = $config['roles']; - $hasSecurityMetadata = true; - break; - case "satisfies_parent_security_policy": - $methodMetadata->satisfiesParentSecurityPolicy = true; - $hasSecurityMetadata = true; - break; + case "pre_authorize": + $methodMetadata->roles = array(new Expression($config)); + $hasSecurityMetadata = true; + break; + case "secure": + $methodMetadata->roles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "secure_param": + $this->assertParamExistsForMethod($parameters, $config['name'], $method->name); + $methodMetadata->addParamPermissions( + $parameters[$config['name']], $config['permissions'] + ); + $hasSecurityMetadata = true; + break; + case "secure_return": + $methodMetadata->returnPermissions = $config['permissions']; + $hasSecurityMetadata = true; + break; + case "run_as": + $methodMetadata->runAsRoles = $config['roles']; + $hasSecurityMetadata = true; + break; + case "satisfies_parent_security_policy": + $methodMetadata->satisfiesParentSecurityPolicy = true; + $hasSecurityMetadata = true; + break; } } @@ -131,8 +130,8 @@ protected function getConfigForSignature($signature) { $configurationFound = null; - foreach ($this->config as $config) { - if (!preg_match('#'.$config['pattern'].'#i', $signature)) { + foreach ($this->config as $pattern => $config) { + if (!preg_match('#'.$pattern.'#i', $signature)) { continue; } diff --git a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php index 6e57aa5..802c7c6 100644 --- a/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php +++ b/Tests/DependencyInjection/JMSSecurityExtraExtensionTest.php @@ -63,7 +63,6 @@ public function testConfigLoadWithMethodAccessControl() $this->assertEquals( array( ':login$' => array( - 'pattern' => ':login$', 'pre_authorize' => 'hasRole("FOO")', ) ), diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index 390fc02..25fed52 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -67,29 +67,29 @@ public function testLoadAdvancedMetadata($config, $securedClass, $securedMethods foreach ($config as $configEntry) { foreach ($configEntry as $key => $content) { switch ($key) { - case 'pattern' : - break 2; - case 'pre_authorize': - $assert = "assertPreAuthorize"; - break; - case 'secure' : - $assert = "assertSecure"; - break; - case 'secure_param' : - $assert ="assertSecureParam"; - break; - case 'secure_return': - $assert = "assertSecureReturn"; - break; - case 'run_as' : - $assert = "assertRunAs"; - break; - case 'satisfies_parent_security_policy': - $assert = "assertSatisfiesParentSecurity"; - break; - default : - $this->fail("Unknown configuration key found: ". $key); - break; + case 'pattern' : + break 2; + case 'pre_authorize': + $assert = "assertPreAuthorize"; + break; + case 'secure' : + $assert = "assertSecure"; + break; + case 'secure_param' : + $assert ="assertSecureParam"; + break; + case 'secure_return': + $assert = "assertSecureReturn"; + break; + case 'run_as' : + $assert = "assertRunAs"; + break; + case 'satisfies_parent_security_policy': + $assert = "assertSatisfiesParentSecurity"; + break; + default : + $this->fail("Unknown configuration key found: ". $key); + break; } foreach ($metadata->methodMetadata as $name => $metadata) { @@ -147,7 +147,7 @@ public function advancedConfigProvider() { return array( array( - 'config' => array(array( + 'config' => array('FooService::foo'=> array( 'pattern' => 'FooService::foo', 'secure' => array( 'roles' => array( @@ -160,7 +160,7 @@ public function advancedConfigProvider() 'securedMethods' => array('foo'), ), array( - 'config' => array(array( + 'config' => array('FooService::shortNotation' => array( 'pattern' => 'FooService::shortNotation', 'secure' => array( 'roles' => array('ROLE_FOO', 'ROLE_BAR') @@ -170,7 +170,7 @@ public function advancedConfigProvider() 'securedMethods' => array('shortNotation'), ), array( - 'config' => array(array( + 'config' => array('FooService::bar' => array( 'pattern' => 'FooService::bar', 'secure' => array('roles' => 'ROLE_FOO, ROLE_BAR'), 'secure_param' => array( @@ -182,7 +182,7 @@ public function advancedConfigProvider() 'securedMethods' => array('bar'), ), array( - 'config' => array(array( + 'config' => array('FooSecureService::foo' => array( 'pattern' => 'FooSecureService::foo', 'secure_param' => array( 'name' => 'anotherParam', 'permissions' => array('EDIT') @@ -192,7 +192,7 @@ public function advancedConfigProvider() 'securedMethods' => array('foo'), ), array( - 'config' => array(array( + 'config' => array('FooMultipleSecureService::foo' => array( 'pattern' => 'FooMultipleSecureService::foo', 'secure_param' => array( 'name' => 'param', 'permissions' => array('VIEW') From aea1378e24616c124061e16ef812aa95b9212ac6 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 24 Sep 2013 14:27:06 -0400 Subject: [PATCH 23/32] Fixed ContextErrorExcepton when no configuration was present. --- DependencyInjection/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 646d1f3..5606bb9 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -70,7 +70,7 @@ public function getConfigTreeBuilder() ->end() ->arrayNode('method_access_control') ->beforeNormalization() - ->always(function ($node) { + ->always(function ($node = array()) { /** This is a backward compatibility layer */ foreach ($node as $key => $value) { if (is_string($value)) { From 9fde14486fbe1452216690b347eb7589a5aa6af5 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 24 Sep 2013 15:47:55 -0400 Subject: [PATCH 24/32] Fixed bad last commit --- DependencyInjection/Configuration.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 5606bb9..5e8b57e 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -70,16 +70,18 @@ public function getConfigTreeBuilder() ->end() ->arrayNode('method_access_control') ->beforeNormalization() - ->always(function ($node = array()) { + ->always(function ($node) { /** This is a backward compatibility layer */ - foreach ($node as $key => $value) { - if (is_string($value)) { - $node[$key] = array( - 'pre_authorize' => $value - ); + if ($node) { + foreach ($node as $key => $value) { + if (is_string($value)) { + $node[$key] = array( + 'pre_authorize' => $value + ); + } } } - + return $node; }) ->end() From e7eebc0e996d72f349156a0c7ba126b9184619d2 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 08:28:08 -0400 Subject: [PATCH 25/32] Moved pre-processing configs to a private method. --- Metadata/Driver/ConfigDriver.php | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Metadata/Driver/ConfigDriver.php b/Metadata/Driver/ConfigDriver.php index 4f90f9d..7c7acb6 100644 --- a/Metadata/Driver/ConfigDriver.php +++ b/Metadata/Driver/ConfigDriver.php @@ -32,18 +32,7 @@ public function __construct(array $bundles, array $config) } $this->bundles = $bundles; - - /** This is a BC layer */ - $this->config = array(); - foreach ($config as $key => $value) { - if (is_string($value)) { - $this->config[$key] = array( - 'pre_authorize' => $value - ); - } else { - $this->config[$key] = $value; - } - } + $this->setConfigs($config); } /** @@ -192,4 +181,18 @@ private function assertParamExistsForMethod(array $params, $name, $method) ); } } + + private function setConfigs(array $config) + { + $this->config = array(); + foreach ($config as $key => $value) { + if (is_string($value)) { + $this->config[$key] = array( + 'pre_authorize' => $value + ); + } else { + $this->config[$key] = $value; + } + } + } } From aea3c1ec36ebb5c06533f5d1bcf6f58856d6c0d6 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 08:33:24 -0400 Subject: [PATCH 26/32] Cleaned left behing unsused assert methods in tests --- Tests/Metadata/Driver/ConfigDriverTest.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index 25fed52..b46156e 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -135,14 +135,6 @@ protected function assertSecureReturn($loadedMethod, $config) ); } - protected function assertRunAs($loadedMethods, $expectedMethods, $config) - { - } - - protected function assertSatisfiesParentSecurity($loadedMethods, $expectedMethods, $config) - { - } - public function advancedConfigProvider() { return array( From 853765361b3c6d3d3fe197481d68eaadf202bbfe Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 08:37:07 -0400 Subject: [PATCH 27/32] Corrected typo in variable name --- Tests/Metadata/Driver/ConfigDriverTest.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Tests/Metadata/Driver/ConfigDriverTest.php b/Tests/Metadata/Driver/ConfigDriverTest.php index b46156e..6604cf9 100644 --- a/Tests/Metadata/Driver/ConfigDriverTest.php +++ b/Tests/Metadata/Driver/ConfigDriverTest.php @@ -91,11 +91,11 @@ public function testLoadAdvancedMetadata($config, $securedClass, $securedMethods $this->fail("Unknown configuration key found: ". $key); break; } - + foreach ($metadata->methodMetadata as $name => $metadata) { $this->assertEquals($name, current($securedMethods)); $this->{$assert}($metadata, current($securedMethods), $content ); - + next($securedMethods); } } @@ -119,11 +119,13 @@ protected function assertSecure($loadedMethod, $config) protected function assertSecureParam($loadedMethod, $config) { - $expectedPermission = $loadedMethod->paramPermissions[$config['name']]; + $expectedPermissions = $loadedMethod->paramPermissions[$config['name']]; $this->assertEquals( $expectedPermissions, $config['permission'], - sprintf("Expected parameter permission %s got %s", $expectedPermission, $config['permission']) + sprintf( + "Expected parameter permission %s got %s", $expectedPermissions, $config['permission'] + ) ); } @@ -131,7 +133,9 @@ protected function assertSecureReturn($loadedMethod, $config) { $this->assertEquals( $loadedMethod->returnPermissions, $config, - sprintf("Expected return permission %s got %s". $loadedMethod->returnPermission, $config) + sprintf( + "Expected return permission %s got %s". $loadedMethod->returnPermissions, $config + ) ); } From f51d6e8283e294b91aabc57634ea1c2e056821d9 Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 09:19:52 -0400 Subject: [PATCH 28/32] Added more strict configuration validation --- DependencyInjection/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 5e8b57e..1864296 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -72,7 +72,7 @@ public function getConfigTreeBuilder() ->beforeNormalization() ->always(function ($node) { /** This is a backward compatibility layer */ - if ($node) { + if (is_array($node)) { foreach ($node as $key => $value) { if (is_string($value)) { $node[$key] = array( From 5cdb9aeea36e7dfb5c0774c985549f1de2cd0d38 Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 6 Jan 2014 09:20:11 -0500 Subject: [PATCH 29/32] Added a more complete gitignore file --- .gitignore | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5cc78c4..9f388ba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,59 @@ -phpunit.xml +### +# .gitignore +### + +### +# Common pollution +### +*~ +*.DS_Store +*.settings +*Thumb.db + +### +# Temporary, cache, backup and buffer files +### +*.tmp +*.swp +*.lock +~* +.*.sw[a-z] +.Trashes +.sass-cache +*.swp +composer.lock + +### +# Development environement common files +### +*nbproject +*.project +*.idea +*atlassian-ide-plugin.xml +*catalog.xml +*.sublime* +.Spotlight-V100 +Thumb.db +Vagrantfile +.vagrant* +nbproject/ + +### +# Generated files and directories +### +coverage/ vendor/ +cache/ +log/ +app/cache/* +app/logs/* +clover.xml +web/bundles/nelmioapidoc + +### +# Excluded executables +### +bin/ +composer.phar + From 35135552c3104d6003a6fb2e5c7be218df9f55ba Mon Sep 17 00:00:00 2001 From: cblegare Date: Tue, 1 Oct 2013 09:19:52 -0400 Subject: [PATCH 30/32] Added more strict configuration validation From ab50517db8d2ab2404fd1d0cf8394875e6d860b6 Mon Sep 17 00:00:00 2001 From: cblegare Date: Mon, 6 Jan 2014 14:47:38 -0500 Subject: [PATCH 31/32] Merging --- JMSSecurityExtraBundle.php | 2 +- Resources/config/services.xml | 4 +++- .../doc/cookbook/creating_your_own_expression_function.rst | 2 +- Security/Authorization/Expression/ExpressionLexer.php | 4 ++-- composer.json | 1 - 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/JMSSecurityExtraBundle.php b/JMSSecurityExtraBundle.php index 37c13be..2065960 100644 --- a/JMSSecurityExtraBundle.php +++ b/JMSSecurityExtraBundle.php @@ -35,7 +35,7 @@ */ class JMSSecurityExtraBundle extends Bundle { - const VERSION = '1.4.0-DEV'; + const VERSION = '1.5.0-DEV'; public function build(ContainerBuilder $container) { diff --git a/Resources/config/services.xml b/Resources/config/services.xml index 11b600f..f563582 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -94,7 +94,9 @@