├── .gitignore ├── .php_cs ├── OpenSkyLdapBundle.php ├── Security ├── User │ ├── LdapUserManagerInterface.php │ ├── LdapUser.php │ ├── LdapUserProvider.php │ └── LdapUserManager.php └── HttpBasicPreAuthenticatedListener.php ├── composer.json ├── Resources └── config │ ├── security_factories.xml │ └── ldap.xml ├── phpunit.xml.dist ├── Tests ├── DependencyInjection │ ├── Security │ │ └── HttpBasicPreAuthenticatedFactoryTest.php │ └── OpenSkyLdapExtensionTest.php └── Security │ ├── User │ ├── LdapUserTest.php │ ├── LdapUserProviderTest.php │ └── LdapUserManagerTest.php │ └── HttpBasicPreAuthenticatedListenerTest.php ├── DependencyInjection ├── OpenSkyLdapExtension.php ├── Security │ └── HttpBasicPreAuthenticatedFactory.php └── Configuration.php ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | phpunit.xml 2 | .php_cs.cache 3 | vendor 4 | -------------------------------------------------------------------------------- /.php_cs: -------------------------------------------------------------------------------- 1 | setRules([ 5 | '@Symfony' => true, 6 | 'array_syntax' => ['syntax' => 'short'], 7 | 'ordered_imports' => true, 8 | ]) 9 | ->setFinder( 10 | PhpCsFixer\Finder::create() 11 | ->exclude(['bin', 'vendor']) 12 | ->in(__DIR__) 13 | ) 14 | ; 15 | -------------------------------------------------------------------------------- /OpenSkyLdapBundle.php: -------------------------------------------------------------------------------- 1 | extension = new OpenSkyLdapExtension(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Security/User/LdapUserManagerInterface.php: -------------------------------------------------------------------------------- 1 | =7.0", 10 | "symfony/framework-bundle": "~3.0", 11 | "symfony/security-bundle": "~3.0", 12 | "zendframework/zend-ldap": "~2.0" 13 | }, 14 | "require-dev": { 15 | "phpunit/phpunit": "~6.0", 16 | "friendsofphp/php-cs-fixer": "~2.0" 17 | }, 18 | "autoload": { 19 | "psr-0": { "OpenSky\\Bundle\\LdapBundle": "" } 20 | }, 21 | "target-dir": "OpenSky/Bundle/LdapBundle" 22 | } 23 | -------------------------------------------------------------------------------- /Resources/config/security_factories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | OpenSky\Bundle\LdapBundle\DependencyInjection\Security\HttpBasicPreAuthenticatedFactory 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 15 | ./Tests/ 16 | 17 | 18 | 19 | 20 | 21 | ./ 22 | 23 | ./Resources 24 | ./Tests 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Security/HttpBasicPreAuthenticatedListener.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class HttpBasicPreAuthenticatedListener extends AbstractPreAuthenticatedListener 16 | { 17 | protected function getPreAuthenticatedData(Request $request) 18 | { 19 | if (!$request->server->has('PHP_AUTH_USER')) { 20 | throw new BadCredentialsException('HTTP-authenticated user was not found'); 21 | } 22 | 23 | return [$request->server->get('PHP_AUTH_USER'), $request->server->get('PHP_AUTH_PW', '')]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Tests/DependencyInjection/Security/HttpBasicPreAuthenticatedFactoryTest.php: -------------------------------------------------------------------------------- 1 | createMock(AuthenticationEntryPointInterface::class); 20 | 21 | // Load "security.authentication.listener.basic_pre_auth.class" parameter from ldap.xml 22 | $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config')); 23 | $loader->load('ldap.xml'); 24 | 25 | list($provider, $listenerId, $returnedDefaultEntryPoint) = $factory->create($container, rand(), [], $userProvider, $defaultEntryPoint); 26 | 27 | $this->assertTrue($container->hasDefinition($provider)); 28 | $this->assertTrue($container->hasDefinition($listenerId)); 29 | $this->assertEquals($defaultEntryPoint, $returnedDefaultEntryPoint); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Tests/Security/User/LdapUserTest.php: -------------------------------------------------------------------------------- 1 | assertEquals('jmikola', (string) $user); 22 | } 23 | 24 | public function testGetRoles() 25 | { 26 | $user = new LdapUser('jmikola'); 27 | $this->assertEquals([], $user->getRoles()); 28 | 29 | $user = new LdapUser('jmikola', ['ROLE_ADMIN']); 30 | $this->assertEquals(['ROLE_ADMIN'], $user->getRoles()); 31 | } 32 | 33 | public function testGetPassword() 34 | { 35 | $user = new LdapUser('jmikola'); 36 | $this->assertNull($user->getPassword()); 37 | } 38 | 39 | public function testGetUsername() 40 | { 41 | $user = new LdapUser('jmikola'); 42 | $this->assertEquals('jmikola', $user->getUsername()); 43 | } 44 | 45 | public function testGetSalt() 46 | { 47 | $user = new LdapUser('jmikola'); 48 | $this->assertNull($user->getSalt()); 49 | } 50 | 51 | public function testEquals() 52 | { 53 | $user = new LdapUser('jmikola'); 54 | 55 | $this->assertTrue($user->equals(new LdapUser('jmikola'))); 56 | $this->assertFalse($user->equals(new LdapUser('foobar'))); 57 | $this->assertFalse($user->equals($this->createMock('Symfony\Component\Security\Core\User\UserInterface'))); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /DependencyInjection/OpenSkyLdapExtension.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | class OpenSkyLdapExtension extends Extension 17 | { 18 | /** 19 | * @see Symfony\Component\DependencyInjection\Extension\ExtensionInterface::load() 20 | */ 21 | public function load(array $configs, ContainerBuilder $container) 22 | { 23 | $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 24 | $loader->load('ldap.xml'); 25 | 26 | $processor = new Processor(); 27 | $config = $processor->processConfiguration(new Configuration(), $configs); 28 | 29 | $container->setParameter('opensky_ldap.client.options', $config['client']); 30 | 31 | foreach (['user_base_dn', 'user_filter', 'username_attribute', 'role_base_dn', 'role_filter', 'role_name_attribute', 'role_user_attribute'] as $key) { 32 | $container->setParameter('opensky_ldap.user_manager.'.$key, $config[$key]); 33 | } 34 | 35 | foreach (['role_prefix', 'default_roles'] as $key) { 36 | $container->setParameter('opensky_ldap.user_provider.'.$key, $config['security'][$key]); 37 | } 38 | } 39 | 40 | /** 41 | * @see Symfony\Component\DependencyInjection\Extension\ExtensionInterface::getAlias() 42 | * @codeCoverageIgnore 43 | */ 44 | public function getAlias() 45 | { 46 | return 'opensky_ldap'; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Tests/Security/HttpBasicPreAuthenticatedListenerTest.php: -------------------------------------------------------------------------------- 1 | listener = new HttpBasicPreAuthenticatedListener( 20 | $this->createMock(TokenStorageInterface::class), 21 | $this->createMock(AuthenticationManagerInterface::class), 22 | 'ldap.provider' 23 | ); 24 | 25 | $this->method = new ReflectionMethod($this->listener, 'getPreAuthenticatedData'); 26 | $this->method->setAccessible(true); 27 | } 28 | 29 | /** 30 | * @dataProvider provideTestGetPreAuthenticatedData 31 | */ 32 | public function testGetPreAuthenticatedData($serverParams, $expectedData) 33 | { 34 | $request = new Request([], [], [], [], [], $serverParams); 35 | 36 | $this->assertEquals($expectedData, $this->method->invoke($this->listener, $request)); 37 | } 38 | 39 | public function provideTestGetPreAuthenticatedData() 40 | { 41 | return [ 42 | [ 43 | ['PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'password'], 44 | ['username', 'password'], 45 | ], 46 | [ 47 | ['PHP_AUTH_USER' => 'username'], 48 | ['username', ''], 49 | ], 50 | ]; 51 | } 52 | 53 | /** 54 | * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException 55 | */ 56 | public function testGetPreAuthenticatedDataBadCredentials() 57 | { 58 | $this->method->invoke($this->listener, new Request()); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Security/User/LdapUser.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class LdapUser implements UserInterface 13 | { 14 | protected $username; 15 | protected $roles; 16 | 17 | /** 18 | * Constructor. 19 | * 20 | * @param string $username 21 | * @param array $roles 22 | */ 23 | public function __construct($username, array $roles = []) 24 | { 25 | if (empty($username)) { 26 | throw new \InvalidArgumentException('The username cannot be empty.'); 27 | } 28 | 29 | $this->username = $username; 30 | $this->roles = $roles; 31 | } 32 | 33 | /** 34 | * @see Symfony\Component\Security\Core\User\UserInterface::__toString() 35 | */ 36 | public function __toString() 37 | { 38 | return $this->username; 39 | } 40 | 41 | /** 42 | * @see Symfony\Component\Security\Core\User\UserInterface::getRoles() 43 | */ 44 | public function getRoles() 45 | { 46 | return $this->roles; 47 | } 48 | 49 | /** 50 | * @see Symfony\Component\Security\Core\User\UserInterface::getPassword() 51 | */ 52 | public function getPassword() 53 | { 54 | return null; 55 | } 56 | 57 | /** 58 | * @see Symfony\Component\Security\Core\User\UserInterface::getSalt() 59 | */ 60 | public function getSalt() 61 | { 62 | return null; 63 | } 64 | 65 | /** 66 | * @see Symfony\Component\Security\Core\User\UserInterface::getUsername() 67 | */ 68 | public function getUsername() 69 | { 70 | return $this->username; 71 | } 72 | 73 | /** 74 | * @see Symfony\Component\Security\Core\User\UserInterface::eraseCredentials() 75 | * @codeCoverageIgnore 76 | */ 77 | public function eraseCredentials() 78 | { 79 | } 80 | 81 | /** 82 | * @see Symfony\Component\Security\Core\User\UserInterface::equals() 83 | */ 84 | public function equals(UserInterface $account) 85 | { 86 | if (!$account instanceof self) { 87 | return false; 88 | } 89 | 90 | if ($this->username !== $account->getUsername()) { 91 | return false; 92 | } 93 | 94 | return true; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Tests/DependencyInjection/OpenSkyLdapExtensionTest.php: -------------------------------------------------------------------------------- 1 | 'ou=Users,dc=example,dc=com', 15 | 'role_base_dn' => 'ou=Groups,dc=example,dc=com', 16 | ]; 17 | 18 | $container = new ContainerBuilder(); 19 | $extension = new OpenSkyLdapExtension(); 20 | 21 | $extension->load([$config], $container); 22 | 23 | $this->assertTrue($container->hasDefinition('opensky_ldap.user_manager')); 24 | $this->assertTrue($container->hasDefinition('opensky_ldap.user_provider')); 25 | 26 | foreach (['user_base_dn', 'role_base_dn'] as $key) { 27 | $this->assertEquals($config[$key], $container->getParameter('opensky_ldap.user_manager.'.$key)); 28 | } 29 | } 30 | 31 | public function testLoadFullConfiguration() 32 | { 33 | $config = [ 34 | 'user_base_dn' => 'ou=Users,dc=example,dc=com', 35 | 'user_filter' => '(objectClass=employee)', 36 | 'username_attribute' => 'uid', 37 | 'role_base_dn' => 'ou=Groups,dc=example,dc=com', 38 | 'role_filter' => '(objectClass=role)', 39 | 'role_name_attribute' => 'cn', 40 | 'role_user_attribute' => 'memberuid', 41 | 'client' => [ 42 | 'host' => 'example.com', 43 | ], 44 | 'security' => [ 45 | 'role_prefix' => 'ROLE_', 46 | 'default_roles' => ['ROLE_ADMIN', 'ROLE_LDAP'], 47 | ], 48 | ]; 49 | 50 | $container = new ContainerBuilder(); 51 | $extension = new OpenSkyLdapExtension(); 52 | 53 | $extension->load([$config], $container); 54 | 55 | $this->assertEquals($config['client'], $container->getParameter('opensky_ldap.client.options')); 56 | 57 | foreach (['user_base_dn', 'user_filter', 'username_attribute', 'role_base_dn', 'role_filter', 'role_name_attribute', 'role_user_attribute'] as $key) { 58 | $this->assertEquals($config[$key], $container->getParameter('opensky_ldap.user_manager.'.$key)); 59 | } 60 | 61 | foreach (['role_prefix', 'default_roles'] as $key) { 62 | $this->assertEquals($config['security'][$key], $container->getParameter('opensky_ldap.user_provider.'.$key)); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Resources/config/ldap.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | Zend\Ldap\Ldap 8 | 9 | OpenSky\Bundle\LdapBundle\Security\User\LdapUserManager 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | OpenSky\Bundle\LdapBundle\Security\User\LdapUserProvider 18 | 19 | 20 | OpenSky\Bundle\LdapBundle\Security\HttpBasicPreAuthenticatedListener 21 | 22 | 23 | 24 | 25 | %opensky_ldap.client.options% 26 | 27 | 28 | 29 | %opensky_ldap.user_manager.user_base_dn% 30 | %opensky_ldap.user_manager.user_filter% 31 | %opensky_ldap.user_manager.username_attribute% 32 | %opensky_ldap.user_manager.role_base_dn% 33 | %opensky_ldap.user_manager.role_filter% 34 | %opensky_ldap.user_manager.role_name_attribute% 35 | %opensky_ldap.user_manager.role_user_attribute% 36 | 37 | 38 | 39 | %opensky_ldap.user_provider.role_prefix% 40 | %opensky_ldap.user_provider.default_roles% 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /DependencyInjection/Security/HttpBasicPreAuthenticatedFactory.php: -------------------------------------------------------------------------------- 1 | 17 | */ 18 | class HttpBasicPreAuthenticatedFactory implements SecurityFactoryInterface 19 | { 20 | public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint) 21 | { 22 | $provider = 'security.authentication.provider.pre_authenticated.'.$id; 23 | $container 24 | ->setDefinition($provider, new DefinitionDecorator('security.authentication.provider.pre_authenticated')) 25 | ->replaceArgument(0, new Reference($userProvider)) 26 | ->addArgument($id) 27 | ->addTag('security.authentication_provider') 28 | ; 29 | 30 | $listener = new Definition( 31 | '%opensky_ldap.authentication.listener.basic_pre_auth.class%', 32 | [ 33 | new Reference('security.context'), 34 | new Reference('security.authentication.manager'), 35 | $id, 36 | new Reference('logger', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), 37 | ] 38 | ); 39 | $listener->addTag('monolog.logger', ['channel' => 'security']); 40 | 41 | $listenerId = 'opensky_ldap.authentication.listener.basic_pre_auth.'.$id; 42 | $container->setDefinition($listenerId, $listener); 43 | 44 | return [$provider, $listenerId, $defaultEntryPoint]; 45 | } 46 | 47 | /** 48 | * @see Symfony\Bundle\FrameworkBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface::getPosition() 49 | * @codeCoverageIgnore 50 | */ 51 | public function getPosition() 52 | { 53 | return 'pre_auth'; 54 | } 55 | 56 | /** 57 | * @see Symfony\Bundle\FrameworkBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface::getKey() 58 | * @codeCoverageIgnore 59 | */ 60 | public function getKey() 61 | { 62 | return 'http-basic-pre-auth'; 63 | } 64 | 65 | /** 66 | * @see Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface::addConfiguration() 67 | * @codeCoverageIgnore 68 | */ 69 | public function addConfiguration(NodeDefinition $builder) 70 | { 71 | $builder->children()->scalarNode('provider')->end()->end(); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /DependencyInjection/Configuration.php: -------------------------------------------------------------------------------- 1 | root('opensky_ldap'); 18 | 19 | $rootNode 20 | ->children() 21 | ->scalarNode('user_base_dn')->isRequired()->cannotBeEmpty()->end() 22 | ->scalarNode('user_filter')->defaultValue('(objectClass=*)')->end() 23 | ->scalarNode('username_attribute')->defaultValue('uid')->end() 24 | ->scalarNode('role_base_dn')->isRequired()->cannotBeEmpty()->end() 25 | ->scalarNode('role_filter')->defaultValue('(objectClass=*)')->end() 26 | ->scalarNode('role_name_attribute')->defaultValue('cn')->end() 27 | ->scalarNode('role_user_attribute')->defaultValue('memberuid')->end() 28 | ->end() 29 | ; 30 | 31 | $this->addClientSection($rootNode); 32 | $this->addSecuritySection($rootNode); 33 | 34 | return $treeBuilder; 35 | } 36 | 37 | private function addClientSection(ArrayNodeDefinition $rootNode) 38 | { 39 | $rootNode 40 | ->children() 41 | // TODO: Add Zend\Ldap configuration structure 42 | ->variableNode('client') 43 | ->defaultValue([]) 44 | ->beforeNormalization() 45 | ->ifTrue(function ($v) { return !is_array($v); }) 46 | ->thenEmptyArray() 47 | ->end() 48 | ->end() 49 | ->end() 50 | ; 51 | } 52 | 53 | private function addSecuritySection(ArrayNodeDefinition $rootNode) 54 | { 55 | $rootNode 56 | ->children() 57 | ->arrayNode('security') 58 | ->addDefaultsIfNotSet() 59 | ->children() 60 | ->scalarNode('role_prefix')->defaultValue('ROLE_LDAP_')->end() 61 | ->arrayNode('default_roles') 62 | ->performNoDeepMerging() 63 | ->beforeNormalization()->ifString()->then(function ($v) { return ['value' => $v]; })->end() 64 | ->beforeNormalization() 65 | ->ifTrue(function ($v) { return is_array($v) && isset($v['value']); }) 66 | ->then(function ($v) { return preg_split('/\s*,\s*/', $v['value']); }) 67 | ->end() 68 | ->prototype('scalar')->end() 69 | ->end() 70 | ->end() 71 | ->end() 72 | ->end() 73 | ; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Tests/Security/User/LdapUserProviderTest.php: -------------------------------------------------------------------------------- 1 | ldapUserManager = $this->createMock('OpenSky\Bundle\LdapBundle\Security\User\LdapUserManagerInterface'); 19 | $this->rolePrefix = 'ROLE_LDAP_'; 20 | $this->defaultRoles = ['ROLE_LDAP']; 21 | 22 | $this->provider = new LdapUserProvider( 23 | $this->ldapUserManager, 24 | $this->rolePrefix, 25 | $this->defaultRoles 26 | ); 27 | } 28 | 29 | /** 30 | * @dataProvider provideTestLoadByUsername 31 | */ 32 | public function testLoadByUsername(array $roleNames, array $expectedRoles) 33 | { 34 | $username = 'jmikola'; 35 | 36 | $this->ldapUserManager->expects($this->once()) 37 | ->method('hasUsername') 38 | ->with($username) 39 | ->will($this->returnValue(true)); 40 | 41 | $this->ldapUserManager->expects($this->once()) 42 | ->method('getRolesForUsername') 43 | ->with($username) 44 | ->will($this->returnValue($roleNames)); 45 | 46 | $user = $this->provider->loadUserByUsername($username); 47 | 48 | $this->assertEquals($username, $user->getUsername()); 49 | $this->assertEquals($expectedRoles, $user->getRoles()); 50 | } 51 | 52 | public function provideTestLoadByUsername() 53 | { 54 | return [ 55 | [ 56 | [], 57 | ['ROLE_LDAP'], 58 | ], 59 | [ 60 | ['admin', 'moderator'], 61 | ['ROLE_LDAP', 'ROLE_LDAP_ADMIN', 'ROLE_LDAP_MODERATOR'], 62 | ], 63 | [ 64 | ['The "Special" Group'], 65 | ['ROLE_LDAP', 'ROLE_LDAP_THE_SPECIAL_GROUP'], 66 | ], 67 | ]; 68 | } 69 | 70 | /** 71 | * @expectedException \Symfony\Component\Security\Core\Exception\UsernameNotFoundException 72 | */ 73 | public function testLoadUserByUsernameNotFound() 74 | { 75 | $username = 'jmikola'; 76 | 77 | $this->ldapUserManager->expects($this->once()) 78 | ->method('hasUsername') 79 | ->with($username) 80 | ->will($this->returnValue(false)); 81 | 82 | $this->provider->loadUserByUsername($username); 83 | } 84 | 85 | public function testRefreshUser() 86 | { 87 | $username = 'jmikola'; 88 | $existingUser = new LdapUser($username); 89 | 90 | $this->ldapUserManager->expects($this->once()) 91 | ->method('hasUsername') 92 | ->with($username) 93 | ->will($this->returnValue(true)); 94 | 95 | $this->ldapUserManager->expects($this->once()) 96 | ->method('getRolesForUsername') 97 | ->with($username) 98 | ->will($this->returnValue([])); 99 | 100 | $user = $this->provider->refreshUser($existingUser); 101 | 102 | $this->assertTrue($user->equals($existingUser)); 103 | $this->assertEquals($username, $user->getUsername()); 104 | $this->assertEquals(['ROLE_LDAP'], $user->getRoles()); 105 | } 106 | 107 | /** 108 | * @expectedException \Symfony\Component\Security\Core\Exception\UnsupportedUserException 109 | */ 110 | public function testRefreshUserNotSupported() 111 | { 112 | $this->provider->refreshUser($this->createMock('Symfony\Component\Security\Core\User\UserInterface')); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /Security/User/LdapUserProvider.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class LdapUserProvider implements UserProviderInterface 16 | { 17 | private $ldapUserManager; 18 | private $rolePrefix; 19 | private $defaultRoles; 20 | 21 | /** 22 | * Constructor. 23 | * 24 | * @param LdapUserManagerInterface $ldapUserManager LDAP user manager instance 25 | * @param string $rolePrefix Prefix for transforming group names to roles 26 | * @param array $defaultRoles Default roles given to all users 27 | */ 28 | public function __construct(LdapUserManagerInterface $ldapUserManager, $rolePrefix = 'ROLE_', array $defaultRoles = []) 29 | { 30 | $this->ldapUserManager = $ldapUserManager; 31 | $this->rolePrefix = $rolePrefix; 32 | $this->defaultRoles = $defaultRoles; 33 | } 34 | 35 | /** 36 | * @see Symfony\Component\Security\Core\User\UserProviderInterface::loadUserByUsername() 37 | */ 38 | public function loadUserByUsername($username) 39 | { 40 | if (!$this->ldapUserManager->hasUsername($username)) { 41 | throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username)); 42 | } 43 | 44 | return new LdapUser($username, $this->getRolesForUsername($username)); 45 | } 46 | 47 | /** 48 | * @see Symfony\Component\Security\Core\User\UserProviderInterface::refreshUser() 49 | */ 50 | public function refreshUser(UserInterface $account) 51 | { 52 | if (!$account instanceof LdapUser) { 53 | throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($account))); 54 | } 55 | 56 | return $this->loadUserByUsername($account->getUsername()); 57 | } 58 | 59 | /** 60 | * Gets roles for the username. 61 | * 62 | * @param string $username 63 | * 64 | * @return array 65 | */ 66 | private function getRolesForUsername($username) 67 | { 68 | $roles = []; 69 | 70 | foreach ($this->ldapUserManager->getRolesForUsername($username) as $roleName) { 71 | if ($role = $this->createRoleFromAttribute($roleName)) { 72 | $roles[] = $role; 73 | } 74 | } 75 | 76 | return array_unique(array_merge($this->defaultRoles, $roles)); 77 | } 78 | 79 | /** 80 | * Creates a role name from an LDAP attribute. 81 | * 82 | * If a name cannot be derived from the attribute, null will be returned. 83 | * 84 | * @param string $attribute 85 | * 86 | * @return string 87 | */ 88 | private function createRoleFromAttribute($attribute) 89 | { 90 | // Replace sequences of non-alphanumeric characters with an underscore 91 | $role = preg_replace('/[^\\pL\d]+/u', '_', $attribute); 92 | 93 | // Attempt transliteration of non-ASCII characters 94 | if (function_exists('iconv')) { 95 | $role = iconv('utf-8', 'us-ascii//TRANSLIT', $role); 96 | } 97 | 98 | // Strip any remaining non-word characters 99 | $role = preg_replace('/[^\w]+/', '', $role); 100 | 101 | // Trim surrounding underscores and convert to uppercase 102 | $role = strtoupper(trim($role, '_')); 103 | 104 | return '' === $role ? null : $this->rolePrefix.$role; 105 | } 106 | 107 | /** 108 | * @see Symfony\Component\Security\Core\User\UserProviderInterface::supportsClass() 109 | * @codeCoverageIgnore 110 | */ 111 | public function supportsClass($class) 112 | { 113 | return 'OpenSky\Bundle\LdapBundle\Security\User\LdapUser' === $class; 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /Tests/Security/User/LdapUserManagerTest.php: -------------------------------------------------------------------------------- 1 | ldap = $this->createMock(Ldap::class); 29 | 30 | $this->userBaseDn = 'ou=Users,dc=example,dc=com'; 31 | $this->userFilter = '(objectClass=employee)'; 32 | $this->usernameAttribute = self::USERNAME_ATTRIBUTE; 33 | $this->roleBaseDn = 'ou=Groups,dc=example,dc=com'; 34 | $this->roleFilter = '(objectClass=*)'; 35 | $this->roleNameAttribute = self::ROLE_NAME_ATTRIBUTE; 36 | $this->roleUserAttribute = 'memberuid'; 37 | 38 | $this->manager = new LdapUserManager( 39 | $this->ldap, 40 | $this->userBaseDn, 41 | $this->userFilter, 42 | $this->usernameAttribute, 43 | $this->roleBaseDn, 44 | $this->roleFilter, 45 | $this->roleNameAttribute, 46 | $this->roleUserAttribute 47 | ); 48 | } 49 | 50 | /** 51 | * @dataProvider provideTestHasUsername 52 | */ 53 | public function testHasUsername($expectedCount, $expectedResult) 54 | { 55 | $username = 'jmikola'; 56 | $expectedDn = sprintf('%s=%s,%s', $this->usernameAttribute, $username, $this->userBaseDn); 57 | 58 | $this->ldap->expects($this->once()) 59 | ->method('count') 60 | ->with($this->userFilter, $expectedDn, Ldap::SEARCH_SCOPE_BASE) 61 | ->will($this->returnValue($expectedCount)); 62 | 63 | $this->assertEquals($expectedResult, $this->manager->hasUsername($username)); 64 | } 65 | 66 | public function provideTestHasUsername() 67 | { 68 | return [ 69 | [0, false], 70 | [1, true], 71 | ]; 72 | } 73 | 74 | /** 75 | * @dataProvider provideAttributes 76 | */ 77 | public function testGetUsernames($usernames) 78 | { 79 | $this->ldap->expects($this->once()) 80 | ->method('searchEntries') 81 | ->with($this->userFilter, $this->userBaseDn, Ldap::SEARCH_SCOPE_SUB, [$this->usernameAttribute]) 82 | ->will($this->returnValue(call_user_func_array([$this, 'createUserEntries'], $usernames))); 83 | 84 | $this->assertEquals($usernames, $this->manager->getUsernames()); 85 | } 86 | 87 | /** 88 | * @dataProvider provideAttributes 89 | */ 90 | public function testGetRoles($roles) 91 | { 92 | $this->ldap->expects($this->once()) 93 | ->method('searchEntries') 94 | ->with($this->roleFilter, $this->roleBaseDn, Ldap::SEARCH_SCOPE_SUB, [$this->roleNameAttribute]) 95 | ->will($this->returnValue(call_user_func_array([$this, 'createRoleEntries'], $roles))); 96 | 97 | $this->assertEquals($roles, $this->manager->getRoles()); 98 | } 99 | 100 | /** 101 | * @dataProvider provideAttributes 102 | */ 103 | public function testGetRolesForUsername($roles) 104 | { 105 | $username = 'jmikola'; 106 | $expectedFilter = sprintf('(&%s(%s=%s))', $this->roleFilter, $this->roleUserAttribute, $username); 107 | 108 | $this->ldap->expects($this->once()) 109 | ->method('searchEntries') 110 | ->with($expectedFilter, $this->roleBaseDn, Ldap::SEARCH_SCOPE_SUB, [$this->roleNameAttribute]) 111 | ->will($this->returnValue(call_user_func_array([$this, 'createRoleEntries'], $roles))); 112 | 113 | $this->assertEquals($roles, $this->manager->getRolesForUsername($username)); 114 | } 115 | 116 | public function provideAttributes() 117 | { 118 | return [ 119 | [[]], 120 | [['alpha']], 121 | [['alpha', 'beta', 'gamma']], 122 | ]; 123 | } 124 | 125 | private function createRoleEntries() 126 | { 127 | $entries = []; 128 | 129 | foreach (func_get_args() as $value) { 130 | $entries[] = [self::ROLE_NAME_ATTRIBUTE => [$value]]; 131 | } 132 | 133 | return $entries; 134 | } 135 | 136 | private function createUserEntries() 137 | { 138 | $entries = []; 139 | 140 | foreach (func_get_args() as $value) { 141 | $entries[] = [self::USERNAME_ATTRIBUTE => [$value]]; 142 | } 143 | 144 | return $entries; 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LdapBundle 2 | 3 | This bundle implements an LDAP-based UserProvider for Symfony2's Security component. 4 | 5 | When used in conjunction with Symfony2's HTTP basic authentication listener, this 6 | bundle can verify usernames against an LDAP server and populate roles based on 7 | groups to which the LDAP user belongs. 8 | 9 | ## Installation 10 | 11 | ### Dependencies 12 | 13 | This bundle depends on the [Zend Framework 2](https://github.com/zendframework/zf2) 14 | LDAP client. 15 | 16 | If you don't already have the ZF2 codebase available in the vendor path of your 17 | Symfony2 application, you may be interested in using [git-subtree](https://github.com/apenwarr/git-subtree) 18 | to pull in the LDAP client by itself. Instructions for this process are documented 19 | in [this thread](https://groups.google.com/d/msg/symfony-devs/N-uIGhEWgs8/CrFmiLFYQbEJ) 20 | from the symfony-devs mailing list. 21 | 22 | ### Submodule Creation 23 | 24 | Add LdapBundle to your `src/` directory: 25 | 26 | $ git submodule add https://github.com/opensky/LdapBundle.git vendor/bundles/OpenSky/Bundle/LdapBundle 27 | 28 | ### Class Autoloading 29 | 30 | If the `src/` directory is already configured in your project's `autoload.php` 31 | via `registerNamespaceFallback()`, no changes should be necessary. Otherwise, 32 | either define the fallback directory or explicitly add the "OpenSky" namespace: 33 | 34 | # app/autoload.php 35 | 36 | $loader->registerNamespaces(array( 37 | 'OpenSky' => __DIR__.'/../vendor/bundles', 38 | )); 39 | 40 | Additionally, ensure that the "Zend" namespace is also configured for autoloading. 41 | 42 | ### Application Kernel 43 | 44 | Add LdapBundle to the `registerBundles()` method of your application kernel: 45 | 46 | public function registerBundles() 47 | { 48 | return array( 49 | new OpenSky\Bundle\LdapBundle\OpenSkyLdapBundle(), 50 | ); 51 | } 52 | 53 | ## Configuration 54 | 55 | ### LdapBundle Extension 56 | 57 | The LDAP UserProvider may be configured with the following: 58 | 59 | # app/config/config.yml 60 | 61 | opensky_ldap: 62 | client: 63 | host: ldap.example.com 64 | user_base_dn: ou=Users,dc=example,dc=com 65 | user_filter: (objectClass=employee) 66 | username_attribute: uid 67 | role_base_dn: ou=Groups,dc=example,dc=com 68 | role_filter: (objectClass=role) 69 | role_name_attribute: cn 70 | role_user_attribute: memberuid 71 | security: 72 | role_prefix: ROLE_LDAP_ 73 | default_roles: [ROLE_ADMIN, ROLE_LDAP] 74 | 75 | These settings are explained below: 76 | 77 | * `client`: array of options for the ZF2 LDAP client. Any options may be 78 | specified, although host is likely a minimum requirement. 79 | * `user_base_dn`: base DN when searching for users is LDAP. 80 | * `user_filter`: filter to apply when searching for users in LDAP. 81 | * `username_attribute`: user entry attribute to use as a username. 82 | * `role_base_dn`: base DN when searching for roles in LDAP. 83 | * `role_filter`: filter to apply when searching for roles in LDAP. 84 | * `role_name_attribute`: role entry attribute to use as the role name. 85 | * `role_user_attribute`: role entry attribute to use for inferring user 86 | relationships. Its value should be a set of user identifiers, which 87 | correspond to `usernameAttribute` values of user entries. 88 | * `security.role_prefix`: prefix to apply when transforming role names from LDAP 89 | entries into security roles. See: *Deriving Symfony2 Roles from LDAP Groups* 90 | * `security.default_roles`: array of default roles to be assigned to all LDAP 91 | users, before roles are inferred from user/role entry relationships. 92 | 93 | See also: 94 | 95 | * [Zend_Ldap config documentation](http://framework.zend.com/manual/en/zend.ldap.api.html) 96 | 97 | ### Security Component 98 | 99 | This bundle is currently intended to be used alongside Apache's mod_auth_ldap. 100 | As such, it must be configured to operate with a PreAuthenticatedAuthenticationProvider. 101 | A pre-auth provider for HTTP basic authentication is included, and may be 102 | configured as follows: 103 | 104 | # app/config/security.yml 105 | 106 | security.config: 107 | providers: 108 | ldap: 109 | id: opensky_ldap.user_provider 110 | firewalls: 111 | backend: 112 | provider: ldap 113 | pattern: /admin(/.*)? 114 | http_basic_pre_auth: true 115 | stateless: true 116 | factories: 117 | - %kernel.root_dir%/../vendor/bundles/OpenSky/Bundle/LdapBundle/Resources/config/security_factories.xml 118 | 119 | Note: a future enhancement for this bundle will be a UserAuthenticationProvider 120 | to allow for authentication against an LDAP server, which will remove the need 121 | to use mod_auth_ldap for pre-authentication. 122 | 123 | See also: 124 | 125 | * [mod_auth_ldap documentation](http://httpd.apache.org/docs/2.0/mod/mod_auth_ldap.html) 126 | 127 | ## The LdapUser Object ## 128 | 129 | Users provided by the LDAP UserProvider will be instances of LdapUser, which is 130 | a lightweight implementation of Symfony2's UserInterface. This user object 131 | stores only a username and array of roles. 132 | 133 | ## Deriving Symfony2 Roles from LDAP Groups 134 | 135 | LdapBundle will attempt to create Symfony2 security roles based on an attribute 136 | from the group entry. By default, the group's common name ("cn") will be used. 137 | 138 | In general, a group's name will be slugified (using an underscore), uppercased 139 | and prefixed with a configurable string ("ROLE_LDAP_" by default). For example, 140 | if your user exists within the LDAP group named "Admin", the provided LdapUser 141 | object will have the "ROLE_LDAP_ADMIN" role. The full implementation can be 142 | found within the LdapUserProvider class. 143 | -------------------------------------------------------------------------------- /Security/User/LdapUserManager.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class LdapUserManager implements LdapUserManagerInterface 13 | { 14 | private $ldap; 15 | private $userBaseDn; 16 | private $userFilter; 17 | private $usernameAttribute; 18 | private $roleBaseDn; 19 | private $roleFilter; 20 | private $roleNameAttribute; 21 | private $roleUserAttribute; 22 | 23 | /** 24 | * Constructor. 25 | * 26 | * @param Ldap $ldap LDAP client instance 27 | * @param string $userBaseDn Base DN for user records 28 | * @param string $userFilter Filter for user queries 29 | * @param string $usernameAttribute User entry attribute from which to derive username 30 | * @param string $roleBaseDn Base DN for role records 31 | * @param string $roleFilter Filter for role queries 32 | * @param string $roleNameAttribute Role entry attribute from which to derive name 33 | * @param string $roleUserAttribute Role entry attribute from which to derive user memberships 34 | */ 35 | public function __construct(Ldap $ldap, $userBaseDn, $userFilter, $usernameAttribute, $roleBaseDn, $roleFilter, $roleNameAttribute, $roleUserAttribute) 36 | { 37 | $this->ldap = $ldap; 38 | $this->userBaseDn = $userBaseDn; 39 | $this->userFilter = $userFilter; 40 | $this->usernameAttribute = $usernameAttribute; 41 | $this->roleBaseDn = $roleBaseDn; 42 | $this->roleFilter = $roleFilter; 43 | $this->roleNameAttribute = $roleNameAttribute; 44 | $this->roleUserAttribute = $roleUserAttribute; 45 | } 46 | 47 | /** 48 | * Check if the username exists. 49 | * 50 | * @param string $username 51 | * 52 | * @return bool 53 | */ 54 | public function hasUsername($username) 55 | { 56 | $dn = sprintf('%s=%s,%s', $this->usernameAttribute, $username, $this->userBaseDn); 57 | 58 | return (bool) $this->ldap->count($this->userFilter, $dn, Ldap::SEARCH_SCOPE_BASE); 59 | } 60 | 61 | /** 62 | * Get a list of usernames. 63 | * 64 | * @return array 65 | */ 66 | public function getUsernames() 67 | { 68 | return $this->resolveEntriesToAttributes($this->ldap->searchEntries( 69 | $this->userFilter, 70 | $this->userBaseDn, 71 | Ldap::SEARCH_SCOPE_SUB, 72 | [$this->usernameAttribute] 73 | ), $this->usernameAttribute); 74 | } 75 | 76 | /** 77 | * Get a list of roles. 78 | * 79 | * @return array 80 | */ 81 | public function getRoles() 82 | { 83 | return $this->resolveEntriesToAttributes($this->ldap->searchEntries( 84 | $this->roleFilter, 85 | $this->roleBaseDn, 86 | Ldap::SEARCH_SCOPE_SUB, 87 | [$this->roleNameAttribute] 88 | ), $this->roleNameAttribute); 89 | } 90 | 91 | /** 92 | * Get a list of roles for the username. 93 | * 94 | * @param string $username 95 | * 96 | * @return array 97 | */ 98 | public function getRolesForUsername($username) 99 | { 100 | return $this->resolveEntriesToAttributes($this->ldap->searchEntries( 101 | sprintf('(&%s(%s=%s))', $this->roleFilter, $this->roleUserAttribute, $username), 102 | $this->roleBaseDn, 103 | Ldap::SEARCH_SCOPE_SUB, 104 | [$this->roleNameAttribute] 105 | ), $this->roleNameAttribute); 106 | } 107 | 108 | /** 109 | * Set roles for a username. 110 | * 111 | * @param string $username 112 | * @param array $roles 113 | */ 114 | public function setRolesForUsername($username, array $roles) 115 | { 116 | $existingRoles = $this->getRolesForUsername($username); 117 | 118 | $addRoles = array_diff($roles, $existingRoles); 119 | $removeRoles = array_diff($existingRoles, $roles); 120 | 121 | $updateEntriesByDn = []; 122 | 123 | foreach ($addRoles as $name) { 124 | $dn = sprintf('%s=%s,%s', $this->roleNameAttribute, $name, $this->roleBaseDn); 125 | 126 | if ($entry = $this->ldap->getEntry($dn)) { 127 | if (!isset($entry[$this->roleUserAttribute]) || !in_array($username, $entry[$this->roleUserAttribute])) { 128 | $entry[$this->roleUserAttribute][] = $username; 129 | $updateEntriesByDn[$dn] = $entry; 130 | } 131 | } 132 | } 133 | 134 | foreach ($removeRoles as $name) { 135 | $dn = sprintf('%s=%s,%s', $this->roleNameAttribute, $name, $this->roleBaseDn); 136 | 137 | if ($entry = $this->ldap->getEntry($dn)) { 138 | if (isset($entry[$this->roleUserAttribute]) && ($key = array_search($username, $entry[$this->roleUserAttribute]))) { 139 | unset($entry[$this->roleUserAttribute][$key]); 140 | $updateEntriesByDn[$dn] = $entry; 141 | } 142 | } 143 | } 144 | 145 | foreach ($updateEntriesByDn as $dn => $entry) { 146 | $this->ldap->update($dn, $entry); 147 | } 148 | } 149 | 150 | /** 151 | * Resolves entries resulting from a search query to an array of attribute 152 | * values. 153 | * 154 | * @param array $entries 155 | * @param string $attributeName 156 | * 157 | * @return array 158 | */ 159 | private function resolveEntriesToAttributes(array $entries, $attributeName) 160 | { 161 | $attributes = []; 162 | 163 | foreach ($entries as $entry) { 164 | if (isset($entry[$attributeName][0])) { 165 | $attributes[] = $entry[$attributeName][0]; 166 | } 167 | } 168 | 169 | return $attributes; 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "a75b8e72838dd335275a78e3bfcb7b83", 8 | "packages": [ 9 | { 10 | "name": "doctrine/cache", 11 | "version": "v1.7.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/cache.git", 15 | "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a", 20 | "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "~7.1" 25 | }, 26 | "conflict": { 27 | "doctrine/common": ">2.2,<2.4" 28 | }, 29 | "require-dev": { 30 | "alcaeus/mongo-php-adapter": "^1.1", 31 | "mongodb/mongodb": "^1.1", 32 | "phpunit/phpunit": "^5.7", 33 | "predis/predis": "~1.0" 34 | }, 35 | "suggest": { 36 | "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" 37 | }, 38 | "type": "library", 39 | "extra": { 40 | "branch-alias": { 41 | "dev-master": "1.7.x-dev" 42 | } 43 | }, 44 | "autoload": { 45 | "psr-4": { 46 | "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" 47 | } 48 | }, 49 | "notification-url": "https://packagist.org/downloads/", 50 | "license": [ 51 | "MIT" 52 | ], 53 | "authors": [ 54 | { 55 | "name": "Roman Borschel", 56 | "email": "roman@code-factory.org" 57 | }, 58 | { 59 | "name": "Benjamin Eberlei", 60 | "email": "kontakt@beberlei.de" 61 | }, 62 | { 63 | "name": "Guilherme Blanco", 64 | "email": "guilhermeblanco@gmail.com" 65 | }, 66 | { 67 | "name": "Jonathan Wage", 68 | "email": "jonwage@gmail.com" 69 | }, 70 | { 71 | "name": "Johannes Schmitt", 72 | "email": "schmittjoh@gmail.com" 73 | } 74 | ], 75 | "description": "Caching library offering an object-oriented API for many cache backends", 76 | "homepage": "http://www.doctrine-project.org", 77 | "keywords": [ 78 | "cache", 79 | "caching" 80 | ], 81 | "time": "2017-08-25T07:02:50+00:00" 82 | }, 83 | { 84 | "name": "paragonie/random_compat", 85 | "version": "v2.0.11", 86 | "source": { 87 | "type": "git", 88 | "url": "https://github.com/paragonie/random_compat.git", 89 | "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" 90 | }, 91 | "dist": { 92 | "type": "zip", 93 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", 94 | "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", 95 | "shasum": "" 96 | }, 97 | "require": { 98 | "php": ">=5.2.0" 99 | }, 100 | "require-dev": { 101 | "phpunit/phpunit": "4.*|5.*" 102 | }, 103 | "suggest": { 104 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 105 | }, 106 | "type": "library", 107 | "autoload": { 108 | "files": [ 109 | "lib/random.php" 110 | ] 111 | }, 112 | "notification-url": "https://packagist.org/downloads/", 113 | "license": [ 114 | "MIT" 115 | ], 116 | "authors": [ 117 | { 118 | "name": "Paragon Initiative Enterprises", 119 | "email": "security@paragonie.com", 120 | "homepage": "https://paragonie.com" 121 | } 122 | ], 123 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 124 | "keywords": [ 125 | "csprng", 126 | "pseudorandom", 127 | "random" 128 | ], 129 | "time": "2017-09-27T21:40:39+00:00" 130 | }, 131 | { 132 | "name": "psr/cache", 133 | "version": "1.0.1", 134 | "source": { 135 | "type": "git", 136 | "url": "https://github.com/php-fig/cache.git", 137 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" 138 | }, 139 | "dist": { 140 | "type": "zip", 141 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", 142 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 143 | "shasum": "" 144 | }, 145 | "require": { 146 | "php": ">=5.3.0" 147 | }, 148 | "type": "library", 149 | "extra": { 150 | "branch-alias": { 151 | "dev-master": "1.0.x-dev" 152 | } 153 | }, 154 | "autoload": { 155 | "psr-4": { 156 | "Psr\\Cache\\": "src/" 157 | } 158 | }, 159 | "notification-url": "https://packagist.org/downloads/", 160 | "license": [ 161 | "MIT" 162 | ], 163 | "authors": [ 164 | { 165 | "name": "PHP-FIG", 166 | "homepage": "http://www.php-fig.org/" 167 | } 168 | ], 169 | "description": "Common interface for caching libraries", 170 | "keywords": [ 171 | "cache", 172 | "psr", 173 | "psr-6" 174 | ], 175 | "time": "2016-08-06T20:24:11+00:00" 176 | }, 177 | { 178 | "name": "psr/container", 179 | "version": "1.0.0", 180 | "source": { 181 | "type": "git", 182 | "url": "https://github.com/php-fig/container.git", 183 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 184 | }, 185 | "dist": { 186 | "type": "zip", 187 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 188 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 189 | "shasum": "" 190 | }, 191 | "require": { 192 | "php": ">=5.3.0" 193 | }, 194 | "type": "library", 195 | "extra": { 196 | "branch-alias": { 197 | "dev-master": "1.0.x-dev" 198 | } 199 | }, 200 | "autoload": { 201 | "psr-4": { 202 | "Psr\\Container\\": "src/" 203 | } 204 | }, 205 | "notification-url": "https://packagist.org/downloads/", 206 | "license": [ 207 | "MIT" 208 | ], 209 | "authors": [ 210 | { 211 | "name": "PHP-FIG", 212 | "homepage": "http://www.php-fig.org/" 213 | } 214 | ], 215 | "description": "Common Container Interface (PHP FIG PSR-11)", 216 | "homepage": "https://github.com/php-fig/container", 217 | "keywords": [ 218 | "PSR-11", 219 | "container", 220 | "container-interface", 221 | "container-interop", 222 | "psr" 223 | ], 224 | "time": "2017-02-14T16:28:37+00:00" 225 | }, 226 | { 227 | "name": "psr/log", 228 | "version": "1.0.2", 229 | "source": { 230 | "type": "git", 231 | "url": "https://github.com/php-fig/log.git", 232 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 233 | }, 234 | "dist": { 235 | "type": "zip", 236 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 237 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 238 | "shasum": "" 239 | }, 240 | "require": { 241 | "php": ">=5.3.0" 242 | }, 243 | "type": "library", 244 | "extra": { 245 | "branch-alias": { 246 | "dev-master": "1.0.x-dev" 247 | } 248 | }, 249 | "autoload": { 250 | "psr-4": { 251 | "Psr\\Log\\": "Psr/Log/" 252 | } 253 | }, 254 | "notification-url": "https://packagist.org/downloads/", 255 | "license": [ 256 | "MIT" 257 | ], 258 | "authors": [ 259 | { 260 | "name": "PHP-FIG", 261 | "homepage": "http://www.php-fig.org/" 262 | } 263 | ], 264 | "description": "Common interface for logging libraries", 265 | "homepage": "https://github.com/php-fig/log", 266 | "keywords": [ 267 | "log", 268 | "psr", 269 | "psr-3" 270 | ], 271 | "time": "2016-10-10T12:19:37+00:00" 272 | }, 273 | { 274 | "name": "psr/simple-cache", 275 | "version": "1.0.0", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/php-fig/simple-cache.git", 279 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", 284 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "php": ">=5.3.0" 289 | }, 290 | "type": "library", 291 | "extra": { 292 | "branch-alias": { 293 | "dev-master": "1.0.x-dev" 294 | } 295 | }, 296 | "autoload": { 297 | "psr-4": { 298 | "Psr\\SimpleCache\\": "src/" 299 | } 300 | }, 301 | "notification-url": "https://packagist.org/downloads/", 302 | "license": [ 303 | "MIT" 304 | ], 305 | "authors": [ 306 | { 307 | "name": "PHP-FIG", 308 | "homepage": "http://www.php-fig.org/" 309 | } 310 | ], 311 | "description": "Common interfaces for simple caching", 312 | "keywords": [ 313 | "cache", 314 | "caching", 315 | "psr", 316 | "psr-16", 317 | "simple-cache" 318 | ], 319 | "time": "2017-01-02T13:31:39+00:00" 320 | }, 321 | { 322 | "name": "symfony/cache", 323 | "version": "v3.3.13", 324 | "source": { 325 | "type": "git", 326 | "url": "https://github.com/symfony/cache.git", 327 | "reference": "49aadc35cc8ae6646cdc39ebdeaceb6712769c9f" 328 | }, 329 | "dist": { 330 | "type": "zip", 331 | "url": "https://api.github.com/repos/symfony/cache/zipball/49aadc35cc8ae6646cdc39ebdeaceb6712769c9f", 332 | "reference": "49aadc35cc8ae6646cdc39ebdeaceb6712769c9f", 333 | "shasum": "" 334 | }, 335 | "require": { 336 | "php": "^5.5.9|>=7.0.8", 337 | "psr/cache": "~1.0", 338 | "psr/log": "~1.0", 339 | "psr/simple-cache": "^1.0", 340 | "symfony/polyfill-apcu": "~1.1" 341 | }, 342 | "conflict": { 343 | "symfony/var-dumper": "<3.3" 344 | }, 345 | "provide": { 346 | "psr/cache-implementation": "1.0", 347 | "psr/simple-cache-implementation": "1.0" 348 | }, 349 | "require-dev": { 350 | "cache/integration-tests": "dev-master", 351 | "doctrine/cache": "~1.6", 352 | "doctrine/dbal": "~2.4", 353 | "predis/predis": "~1.0" 354 | }, 355 | "type": "library", 356 | "extra": { 357 | "branch-alias": { 358 | "dev-master": "3.3-dev" 359 | } 360 | }, 361 | "autoload": { 362 | "psr-4": { 363 | "Symfony\\Component\\Cache\\": "" 364 | }, 365 | "exclude-from-classmap": [ 366 | "/Tests/" 367 | ] 368 | }, 369 | "notification-url": "https://packagist.org/downloads/", 370 | "license": [ 371 | "MIT" 372 | ], 373 | "authors": [ 374 | { 375 | "name": "Nicolas Grekas", 376 | "email": "p@tchwork.com" 377 | }, 378 | { 379 | "name": "Symfony Community", 380 | "homepage": "https://symfony.com/contributors" 381 | } 382 | ], 383 | "description": "Symfony Cache component with PSR-6, PSR-16, and tags", 384 | "homepage": "https://symfony.com", 385 | "keywords": [ 386 | "caching", 387 | "psr6" 388 | ], 389 | "time": "2017-11-07T14:16:22+00:00" 390 | }, 391 | { 392 | "name": "symfony/class-loader", 393 | "version": "v3.3.13", 394 | "source": { 395 | "type": "git", 396 | "url": "https://github.com/symfony/class-loader.git", 397 | "reference": "df173ac2af96ce202bf8bb5a3fc0bec8a4fdd4d1" 398 | }, 399 | "dist": { 400 | "type": "zip", 401 | "url": "https://api.github.com/repos/symfony/class-loader/zipball/df173ac2af96ce202bf8bb5a3fc0bec8a4fdd4d1", 402 | "reference": "df173ac2af96ce202bf8bb5a3fc0bec8a4fdd4d1", 403 | "shasum": "" 404 | }, 405 | "require": { 406 | "php": "^5.5.9|>=7.0.8" 407 | }, 408 | "require-dev": { 409 | "symfony/finder": "~2.8|~3.0", 410 | "symfony/polyfill-apcu": "~1.1" 411 | }, 412 | "suggest": { 413 | "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM" 414 | }, 415 | "type": "library", 416 | "extra": { 417 | "branch-alias": { 418 | "dev-master": "3.3-dev" 419 | } 420 | }, 421 | "autoload": { 422 | "psr-4": { 423 | "Symfony\\Component\\ClassLoader\\": "" 424 | }, 425 | "exclude-from-classmap": [ 426 | "/Tests/" 427 | ] 428 | }, 429 | "notification-url": "https://packagist.org/downloads/", 430 | "license": [ 431 | "MIT" 432 | ], 433 | "authors": [ 434 | { 435 | "name": "Fabien Potencier", 436 | "email": "fabien@symfony.com" 437 | }, 438 | { 439 | "name": "Symfony Community", 440 | "homepage": "https://symfony.com/contributors" 441 | } 442 | ], 443 | "description": "Symfony ClassLoader Component", 444 | "homepage": "https://symfony.com", 445 | "time": "2017-11-05T15:47:03+00:00" 446 | }, 447 | { 448 | "name": "symfony/config", 449 | "version": "v3.3.13", 450 | "source": { 451 | "type": "git", 452 | "url": "https://github.com/symfony/config.git", 453 | "reference": "8d2649077dc54dfbaf521d31f217383d82303c5f" 454 | }, 455 | "dist": { 456 | "type": "zip", 457 | "url": "https://api.github.com/repos/symfony/config/zipball/8d2649077dc54dfbaf521d31f217383d82303c5f", 458 | "reference": "8d2649077dc54dfbaf521d31f217383d82303c5f", 459 | "shasum": "" 460 | }, 461 | "require": { 462 | "php": "^5.5.9|>=7.0.8", 463 | "symfony/filesystem": "~2.8|~3.0" 464 | }, 465 | "conflict": { 466 | "symfony/dependency-injection": "<3.3", 467 | "symfony/finder": "<3.3" 468 | }, 469 | "require-dev": { 470 | "symfony/dependency-injection": "~3.3", 471 | "symfony/finder": "~3.3", 472 | "symfony/yaml": "~3.0" 473 | }, 474 | "suggest": { 475 | "symfony/yaml": "To use the yaml reference dumper" 476 | }, 477 | "type": "library", 478 | "extra": { 479 | "branch-alias": { 480 | "dev-master": "3.3-dev" 481 | } 482 | }, 483 | "autoload": { 484 | "psr-4": { 485 | "Symfony\\Component\\Config\\": "" 486 | }, 487 | "exclude-from-classmap": [ 488 | "/Tests/" 489 | ] 490 | }, 491 | "notification-url": "https://packagist.org/downloads/", 492 | "license": [ 493 | "MIT" 494 | ], 495 | "authors": [ 496 | { 497 | "name": "Fabien Potencier", 498 | "email": "fabien@symfony.com" 499 | }, 500 | { 501 | "name": "Symfony Community", 502 | "homepage": "https://symfony.com/contributors" 503 | } 504 | ], 505 | "description": "Symfony Config Component", 506 | "homepage": "https://symfony.com", 507 | "time": "2017-11-07T14:16:22+00:00" 508 | }, 509 | { 510 | "name": "symfony/debug", 511 | "version": "v3.3.13", 512 | "source": { 513 | "type": "git", 514 | "url": "https://github.com/symfony/debug.git", 515 | "reference": "74557880e2846b5c84029faa96b834da37e29810" 516 | }, 517 | "dist": { 518 | "type": "zip", 519 | "url": "https://api.github.com/repos/symfony/debug/zipball/74557880e2846b5c84029faa96b834da37e29810", 520 | "reference": "74557880e2846b5c84029faa96b834da37e29810", 521 | "shasum": "" 522 | }, 523 | "require": { 524 | "php": "^5.5.9|>=7.0.8", 525 | "psr/log": "~1.0" 526 | }, 527 | "conflict": { 528 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 529 | }, 530 | "require-dev": { 531 | "symfony/http-kernel": "~2.8|~3.0" 532 | }, 533 | "type": "library", 534 | "extra": { 535 | "branch-alias": { 536 | "dev-master": "3.3-dev" 537 | } 538 | }, 539 | "autoload": { 540 | "psr-4": { 541 | "Symfony\\Component\\Debug\\": "" 542 | }, 543 | "exclude-from-classmap": [ 544 | "/Tests/" 545 | ] 546 | }, 547 | "notification-url": "https://packagist.org/downloads/", 548 | "license": [ 549 | "MIT" 550 | ], 551 | "authors": [ 552 | { 553 | "name": "Fabien Potencier", 554 | "email": "fabien@symfony.com" 555 | }, 556 | { 557 | "name": "Symfony Community", 558 | "homepage": "https://symfony.com/contributors" 559 | } 560 | ], 561 | "description": "Symfony Debug Component", 562 | "homepage": "https://symfony.com", 563 | "time": "2017-11-10T16:38:39+00:00" 564 | }, 565 | { 566 | "name": "symfony/dependency-injection", 567 | "version": "v3.3.13", 568 | "source": { 569 | "type": "git", 570 | "url": "https://github.com/symfony/dependency-injection.git", 571 | "reference": "4e84f5af2c2d51ee3dee72df40b7fc08f49b4ab8" 572 | }, 573 | "dist": { 574 | "type": "zip", 575 | "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/4e84f5af2c2d51ee3dee72df40b7fc08f49b4ab8", 576 | "reference": "4e84f5af2c2d51ee3dee72df40b7fc08f49b4ab8", 577 | "shasum": "" 578 | }, 579 | "require": { 580 | "php": "^5.5.9|>=7.0.8", 581 | "psr/container": "^1.0" 582 | }, 583 | "conflict": { 584 | "symfony/config": "<3.3.1", 585 | "symfony/finder": "<3.3", 586 | "symfony/yaml": "<3.3" 587 | }, 588 | "provide": { 589 | "psr/container-implementation": "1.0" 590 | }, 591 | "require-dev": { 592 | "symfony/config": "~3.3", 593 | "symfony/expression-language": "~2.8|~3.0", 594 | "symfony/yaml": "~3.3" 595 | }, 596 | "suggest": { 597 | "symfony/config": "", 598 | "symfony/expression-language": "For using expressions in service container configuration", 599 | "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", 600 | "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", 601 | "symfony/yaml": "" 602 | }, 603 | "type": "library", 604 | "extra": { 605 | "branch-alias": { 606 | "dev-master": "3.3-dev" 607 | } 608 | }, 609 | "autoload": { 610 | "psr-4": { 611 | "Symfony\\Component\\DependencyInjection\\": "" 612 | }, 613 | "exclude-from-classmap": [ 614 | "/Tests/" 615 | ] 616 | }, 617 | "notification-url": "https://packagist.org/downloads/", 618 | "license": [ 619 | "MIT" 620 | ], 621 | "authors": [ 622 | { 623 | "name": "Fabien Potencier", 624 | "email": "fabien@symfony.com" 625 | }, 626 | { 627 | "name": "Symfony Community", 628 | "homepage": "https://symfony.com/contributors" 629 | } 630 | ], 631 | "description": "Symfony DependencyInjection Component", 632 | "homepage": "https://symfony.com", 633 | "time": "2017-11-13T18:10:32+00:00" 634 | }, 635 | { 636 | "name": "symfony/event-dispatcher", 637 | "version": "v3.3.13", 638 | "source": { 639 | "type": "git", 640 | "url": "https://github.com/symfony/event-dispatcher.git", 641 | "reference": "271d8c27c3ec5ecee6e2ac06016232e249d638d9" 642 | }, 643 | "dist": { 644 | "type": "zip", 645 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/271d8c27c3ec5ecee6e2ac06016232e249d638d9", 646 | "reference": "271d8c27c3ec5ecee6e2ac06016232e249d638d9", 647 | "shasum": "" 648 | }, 649 | "require": { 650 | "php": "^5.5.9|>=7.0.8" 651 | }, 652 | "conflict": { 653 | "symfony/dependency-injection": "<3.3" 654 | }, 655 | "require-dev": { 656 | "psr/log": "~1.0", 657 | "symfony/config": "~2.8|~3.0", 658 | "symfony/dependency-injection": "~3.3", 659 | "symfony/expression-language": "~2.8|~3.0", 660 | "symfony/stopwatch": "~2.8|~3.0" 661 | }, 662 | "suggest": { 663 | "symfony/dependency-injection": "", 664 | "symfony/http-kernel": "" 665 | }, 666 | "type": "library", 667 | "extra": { 668 | "branch-alias": { 669 | "dev-master": "3.3-dev" 670 | } 671 | }, 672 | "autoload": { 673 | "psr-4": { 674 | "Symfony\\Component\\EventDispatcher\\": "" 675 | }, 676 | "exclude-from-classmap": [ 677 | "/Tests/" 678 | ] 679 | }, 680 | "notification-url": "https://packagist.org/downloads/", 681 | "license": [ 682 | "MIT" 683 | ], 684 | "authors": [ 685 | { 686 | "name": "Fabien Potencier", 687 | "email": "fabien@symfony.com" 688 | }, 689 | { 690 | "name": "Symfony Community", 691 | "homepage": "https://symfony.com/contributors" 692 | } 693 | ], 694 | "description": "Symfony EventDispatcher Component", 695 | "homepage": "https://symfony.com", 696 | "time": "2017-11-05T15:47:03+00:00" 697 | }, 698 | { 699 | "name": "symfony/filesystem", 700 | "version": "v3.3.13", 701 | "source": { 702 | "type": "git", 703 | "url": "https://github.com/symfony/filesystem.git", 704 | "reference": "77db266766b54db3ee982fe51868328b887ce15c" 705 | }, 706 | "dist": { 707 | "type": "zip", 708 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/77db266766b54db3ee982fe51868328b887ce15c", 709 | "reference": "77db266766b54db3ee982fe51868328b887ce15c", 710 | "shasum": "" 711 | }, 712 | "require": { 713 | "php": "^5.5.9|>=7.0.8" 714 | }, 715 | "type": "library", 716 | "extra": { 717 | "branch-alias": { 718 | "dev-master": "3.3-dev" 719 | } 720 | }, 721 | "autoload": { 722 | "psr-4": { 723 | "Symfony\\Component\\Filesystem\\": "" 724 | }, 725 | "exclude-from-classmap": [ 726 | "/Tests/" 727 | ] 728 | }, 729 | "notification-url": "https://packagist.org/downloads/", 730 | "license": [ 731 | "MIT" 732 | ], 733 | "authors": [ 734 | { 735 | "name": "Fabien Potencier", 736 | "email": "fabien@symfony.com" 737 | }, 738 | { 739 | "name": "Symfony Community", 740 | "homepage": "https://symfony.com/contributors" 741 | } 742 | ], 743 | "description": "Symfony Filesystem Component", 744 | "homepage": "https://symfony.com", 745 | "time": "2017-11-07T14:12:55+00:00" 746 | }, 747 | { 748 | "name": "symfony/finder", 749 | "version": "v3.3.13", 750 | "source": { 751 | "type": "git", 752 | "url": "https://github.com/symfony/finder.git", 753 | "reference": "138af5ec075d4b1d1bd19de08c38a34bb2d7d880" 754 | }, 755 | "dist": { 756 | "type": "zip", 757 | "url": "https://api.github.com/repos/symfony/finder/zipball/138af5ec075d4b1d1bd19de08c38a34bb2d7d880", 758 | "reference": "138af5ec075d4b1d1bd19de08c38a34bb2d7d880", 759 | "shasum": "" 760 | }, 761 | "require": { 762 | "php": "^5.5.9|>=7.0.8" 763 | }, 764 | "type": "library", 765 | "extra": { 766 | "branch-alias": { 767 | "dev-master": "3.3-dev" 768 | } 769 | }, 770 | "autoload": { 771 | "psr-4": { 772 | "Symfony\\Component\\Finder\\": "" 773 | }, 774 | "exclude-from-classmap": [ 775 | "/Tests/" 776 | ] 777 | }, 778 | "notification-url": "https://packagist.org/downloads/", 779 | "license": [ 780 | "MIT" 781 | ], 782 | "authors": [ 783 | { 784 | "name": "Fabien Potencier", 785 | "email": "fabien@symfony.com" 786 | }, 787 | { 788 | "name": "Symfony Community", 789 | "homepage": "https://symfony.com/contributors" 790 | } 791 | ], 792 | "description": "Symfony Finder Component", 793 | "homepage": "https://symfony.com", 794 | "time": "2017-11-05T15:47:03+00:00" 795 | }, 796 | { 797 | "name": "symfony/framework-bundle", 798 | "version": "v3.3.13", 799 | "source": { 800 | "type": "git", 801 | "url": "https://github.com/symfony/framework-bundle.git", 802 | "reference": "53f95fd6e248e7270cebd347b0e3bf22b2c8e480" 803 | }, 804 | "dist": { 805 | "type": "zip", 806 | "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/53f95fd6e248e7270cebd347b0e3bf22b2c8e480", 807 | "reference": "53f95fd6e248e7270cebd347b0e3bf22b2c8e480", 808 | "shasum": "" 809 | }, 810 | "require": { 811 | "doctrine/cache": "~1.0", 812 | "ext-xml": "*", 813 | "php": "^5.5.9|>=7.0.8", 814 | "symfony/cache": "~3.3", 815 | "symfony/class-loader": "~3.2", 816 | "symfony/config": "~3.3", 817 | "symfony/dependency-injection": "~3.3", 818 | "symfony/event-dispatcher": "^3.3.1", 819 | "symfony/filesystem": "~2.8|~3.0", 820 | "symfony/finder": "~2.8|~3.0", 821 | "symfony/http-foundation": "^3.3.11", 822 | "symfony/http-kernel": "~3.3", 823 | "symfony/polyfill-mbstring": "~1.0", 824 | "symfony/routing": "~3.3", 825 | "symfony/stopwatch": "~2.8|~3.0" 826 | }, 827 | "conflict": { 828 | "phpdocumentor/reflection-docblock": "<3.0", 829 | "phpdocumentor/type-resolver": "<0.2.1", 830 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 831 | "symfony/asset": "<3.3", 832 | "symfony/console": "<3.3", 833 | "symfony/form": "<3.3", 834 | "symfony/property-info": "<3.3", 835 | "symfony/serializer": "<3.3", 836 | "symfony/translation": "<3.2", 837 | "symfony/validator": "<3.3", 838 | "symfony/workflow": "<3.3" 839 | }, 840 | "require-dev": { 841 | "doctrine/annotations": "~1.0", 842 | "fig/link-util": "^1.0", 843 | "phpdocumentor/reflection-docblock": "^3.0|^4.0", 844 | "sensio/framework-extra-bundle": "^3.0.2", 845 | "symfony/asset": "~3.3", 846 | "symfony/browser-kit": "~2.8|~3.0", 847 | "symfony/console": "~3.3", 848 | "symfony/css-selector": "~2.8|~3.0", 849 | "symfony/dom-crawler": "~2.8|~3.0", 850 | "symfony/expression-language": "~2.8|~3.0", 851 | "symfony/form": "~3.3", 852 | "symfony/polyfill-intl-icu": "~1.0", 853 | "symfony/process": "~2.8|~3.0", 854 | "symfony/property-info": "~3.3", 855 | "symfony/security": "~2.8|~3.0", 856 | "symfony/security-core": "~3.2", 857 | "symfony/security-csrf": "~2.8|~3.0", 858 | "symfony/serializer": "~3.3", 859 | "symfony/templating": "~2.8|~3.0", 860 | "symfony/translation": "~3.2", 861 | "symfony/validator": "~3.3", 862 | "symfony/web-link": "~3.3", 863 | "symfony/workflow": "~3.3", 864 | "symfony/yaml": "~3.2", 865 | "twig/twig": "~1.34|~2.4" 866 | }, 867 | "suggest": { 868 | "ext-apcu": "For best performance of the system caches", 869 | "symfony/console": "For using the console commands", 870 | "symfony/form": "For using forms", 871 | "symfony/property-info": "For using the property_info service", 872 | "symfony/serializer": "For using the serializer service", 873 | "symfony/validator": "For using validation", 874 | "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", 875 | "symfony/yaml": "For using the debug:config and lint:yaml commands" 876 | }, 877 | "type": "symfony-bundle", 878 | "extra": { 879 | "branch-alias": { 880 | "dev-master": "3.3-dev" 881 | } 882 | }, 883 | "autoload": { 884 | "psr-4": { 885 | "Symfony\\Bundle\\FrameworkBundle\\": "" 886 | }, 887 | "exclude-from-classmap": [ 888 | "/Tests/" 889 | ] 890 | }, 891 | "notification-url": "https://packagist.org/downloads/", 892 | "license": [ 893 | "MIT" 894 | ], 895 | "authors": [ 896 | { 897 | "name": "Fabien Potencier", 898 | "email": "fabien@symfony.com" 899 | }, 900 | { 901 | "name": "Symfony Community", 902 | "homepage": "https://symfony.com/contributors" 903 | } 904 | ], 905 | "description": "Symfony FrameworkBundle", 906 | "homepage": "https://symfony.com", 907 | "time": "2017-11-16T15:24:32+00:00" 908 | }, 909 | { 910 | "name": "symfony/http-foundation", 911 | "version": "v3.3.13", 912 | "source": { 913 | "type": "git", 914 | "url": "https://github.com/symfony/http-foundation.git", 915 | "reference": "5943f0f19817a7e05992d20a90729b0dc93faf36" 916 | }, 917 | "dist": { 918 | "type": "zip", 919 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5943f0f19817a7e05992d20a90729b0dc93faf36", 920 | "reference": "5943f0f19817a7e05992d20a90729b0dc93faf36", 921 | "shasum": "" 922 | }, 923 | "require": { 924 | "php": "^5.5.9|>=7.0.8", 925 | "symfony/polyfill-mbstring": "~1.1" 926 | }, 927 | "require-dev": { 928 | "symfony/expression-language": "~2.8|~3.0" 929 | }, 930 | "type": "library", 931 | "extra": { 932 | "branch-alias": { 933 | "dev-master": "3.3-dev" 934 | } 935 | }, 936 | "autoload": { 937 | "psr-4": { 938 | "Symfony\\Component\\HttpFoundation\\": "" 939 | }, 940 | "exclude-from-classmap": [ 941 | "/Tests/" 942 | ] 943 | }, 944 | "notification-url": "https://packagist.org/downloads/", 945 | "license": [ 946 | "MIT" 947 | ], 948 | "authors": [ 949 | { 950 | "name": "Fabien Potencier", 951 | "email": "fabien@symfony.com" 952 | }, 953 | { 954 | "name": "Symfony Community", 955 | "homepage": "https://symfony.com/contributors" 956 | } 957 | ], 958 | "description": "Symfony HttpFoundation Component", 959 | "homepage": "https://symfony.com", 960 | "time": "2017-11-13T18:13:16+00:00" 961 | }, 962 | { 963 | "name": "symfony/http-kernel", 964 | "version": "v3.3.13", 965 | "source": { 966 | "type": "git", 967 | "url": "https://github.com/symfony/http-kernel.git", 968 | "reference": "a2a942172b742217ab2ccd9399494af2aa17c766" 969 | }, 970 | "dist": { 971 | "type": "zip", 972 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a2a942172b742217ab2ccd9399494af2aa17c766", 973 | "reference": "a2a942172b742217ab2ccd9399494af2aa17c766", 974 | "shasum": "" 975 | }, 976 | "require": { 977 | "php": "^5.5.9|>=7.0.8", 978 | "psr/log": "~1.0", 979 | "symfony/debug": "~2.8|~3.0", 980 | "symfony/event-dispatcher": "~2.8|~3.0", 981 | "symfony/http-foundation": "^3.3.11" 982 | }, 983 | "conflict": { 984 | "symfony/config": "<2.8", 985 | "symfony/dependency-injection": "<3.3", 986 | "symfony/var-dumper": "<3.3", 987 | "twig/twig": "<1.34|<2.4,>=2" 988 | }, 989 | "require-dev": { 990 | "psr/cache": "~1.0", 991 | "symfony/browser-kit": "~2.8|~3.0", 992 | "symfony/class-loader": "~2.8|~3.0", 993 | "symfony/config": "~2.8|~3.0", 994 | "symfony/console": "~2.8|~3.0", 995 | "symfony/css-selector": "~2.8|~3.0", 996 | "symfony/dependency-injection": "~3.3", 997 | "symfony/dom-crawler": "~2.8|~3.0", 998 | "symfony/expression-language": "~2.8|~3.0", 999 | "symfony/finder": "~2.8|~3.0", 1000 | "symfony/process": "~2.8|~3.0", 1001 | "symfony/routing": "~2.8|~3.0", 1002 | "symfony/stopwatch": "~2.8|~3.0", 1003 | "symfony/templating": "~2.8|~3.0", 1004 | "symfony/translation": "~2.8|~3.0", 1005 | "symfony/var-dumper": "~3.3" 1006 | }, 1007 | "suggest": { 1008 | "symfony/browser-kit": "", 1009 | "symfony/class-loader": "", 1010 | "symfony/config": "", 1011 | "symfony/console": "", 1012 | "symfony/dependency-injection": "", 1013 | "symfony/finder": "", 1014 | "symfony/var-dumper": "" 1015 | }, 1016 | "type": "library", 1017 | "extra": { 1018 | "branch-alias": { 1019 | "dev-master": "3.3-dev" 1020 | } 1021 | }, 1022 | "autoload": { 1023 | "psr-4": { 1024 | "Symfony\\Component\\HttpKernel\\": "" 1025 | }, 1026 | "exclude-from-classmap": [ 1027 | "/Tests/" 1028 | ] 1029 | }, 1030 | "notification-url": "https://packagist.org/downloads/", 1031 | "license": [ 1032 | "MIT" 1033 | ], 1034 | "authors": [ 1035 | { 1036 | "name": "Fabien Potencier", 1037 | "email": "fabien@symfony.com" 1038 | }, 1039 | { 1040 | "name": "Symfony Community", 1041 | "homepage": "https://symfony.com/contributors" 1042 | } 1043 | ], 1044 | "description": "Symfony HttpKernel Component", 1045 | "homepage": "https://symfony.com", 1046 | "time": "2017-11-16T18:14:43+00:00" 1047 | }, 1048 | { 1049 | "name": "symfony/inflector", 1050 | "version": "v3.3.13", 1051 | "source": { 1052 | "type": "git", 1053 | "url": "https://github.com/symfony/inflector.git", 1054 | "reference": "0474dc4d867c7efefd44017f7903465a7f368b6b" 1055 | }, 1056 | "dist": { 1057 | "type": "zip", 1058 | "url": "https://api.github.com/repos/symfony/inflector/zipball/0474dc4d867c7efefd44017f7903465a7f368b6b", 1059 | "reference": "0474dc4d867c7efefd44017f7903465a7f368b6b", 1060 | "shasum": "" 1061 | }, 1062 | "require": { 1063 | "php": "^5.5.9|>=7.0.8" 1064 | }, 1065 | "type": "library", 1066 | "extra": { 1067 | "branch-alias": { 1068 | "dev-master": "3.3-dev" 1069 | } 1070 | }, 1071 | "autoload": { 1072 | "psr-4": { 1073 | "Symfony\\Component\\Inflector\\": "" 1074 | }, 1075 | "exclude-from-classmap": [ 1076 | "/Tests/" 1077 | ] 1078 | }, 1079 | "notification-url": "https://packagist.org/downloads/", 1080 | "license": [ 1081 | "MIT" 1082 | ], 1083 | "authors": [ 1084 | { 1085 | "name": "Bernhard Schussek", 1086 | "email": "bschussek@gmail.com" 1087 | }, 1088 | { 1089 | "name": "Symfony Community", 1090 | "homepage": "https://symfony.com/contributors" 1091 | } 1092 | ], 1093 | "description": "Symfony Inflector Component", 1094 | "homepage": "https://symfony.com", 1095 | "keywords": [ 1096 | "inflection", 1097 | "pluralize", 1098 | "singularize", 1099 | "string", 1100 | "symfony", 1101 | "words" 1102 | ], 1103 | "time": "2017-07-29T21:54:42+00:00" 1104 | }, 1105 | { 1106 | "name": "symfony/polyfill-apcu", 1107 | "version": "v1.6.0", 1108 | "source": { 1109 | "type": "git", 1110 | "url": "https://github.com/symfony/polyfill-apcu.git", 1111 | "reference": "04f62674339602def515bff4bc6901fc1d4951e8" 1112 | }, 1113 | "dist": { 1114 | "type": "zip", 1115 | "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/04f62674339602def515bff4bc6901fc1d4951e8", 1116 | "reference": "04f62674339602def515bff4bc6901fc1d4951e8", 1117 | "shasum": "" 1118 | }, 1119 | "require": { 1120 | "php": ">=5.3.3" 1121 | }, 1122 | "type": "library", 1123 | "extra": { 1124 | "branch-alias": { 1125 | "dev-master": "1.6-dev" 1126 | } 1127 | }, 1128 | "autoload": { 1129 | "psr-4": { 1130 | "Symfony\\Polyfill\\Apcu\\": "" 1131 | }, 1132 | "files": [ 1133 | "bootstrap.php" 1134 | ] 1135 | }, 1136 | "notification-url": "https://packagist.org/downloads/", 1137 | "license": [ 1138 | "MIT" 1139 | ], 1140 | "authors": [ 1141 | { 1142 | "name": "Nicolas Grekas", 1143 | "email": "p@tchwork.com" 1144 | }, 1145 | { 1146 | "name": "Symfony Community", 1147 | "homepage": "https://symfony.com/contributors" 1148 | } 1149 | ], 1150 | "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", 1151 | "homepage": "https://symfony.com", 1152 | "keywords": [ 1153 | "apcu", 1154 | "compatibility", 1155 | "polyfill", 1156 | "portable", 1157 | "shim" 1158 | ], 1159 | "time": "2017-10-11T12:05:26+00:00" 1160 | }, 1161 | { 1162 | "name": "symfony/polyfill-mbstring", 1163 | "version": "v1.6.0", 1164 | "source": { 1165 | "type": "git", 1166 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1167 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" 1168 | }, 1169 | "dist": { 1170 | "type": "zip", 1171 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", 1172 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", 1173 | "shasum": "" 1174 | }, 1175 | "require": { 1176 | "php": ">=5.3.3" 1177 | }, 1178 | "suggest": { 1179 | "ext-mbstring": "For best performance" 1180 | }, 1181 | "type": "library", 1182 | "extra": { 1183 | "branch-alias": { 1184 | "dev-master": "1.6-dev" 1185 | } 1186 | }, 1187 | "autoload": { 1188 | "psr-4": { 1189 | "Symfony\\Polyfill\\Mbstring\\": "" 1190 | }, 1191 | "files": [ 1192 | "bootstrap.php" 1193 | ] 1194 | }, 1195 | "notification-url": "https://packagist.org/downloads/", 1196 | "license": [ 1197 | "MIT" 1198 | ], 1199 | "authors": [ 1200 | { 1201 | "name": "Nicolas Grekas", 1202 | "email": "p@tchwork.com" 1203 | }, 1204 | { 1205 | "name": "Symfony Community", 1206 | "homepage": "https://symfony.com/contributors" 1207 | } 1208 | ], 1209 | "description": "Symfony polyfill for the Mbstring extension", 1210 | "homepage": "https://symfony.com", 1211 | "keywords": [ 1212 | "compatibility", 1213 | "mbstring", 1214 | "polyfill", 1215 | "portable", 1216 | "shim" 1217 | ], 1218 | "time": "2017-10-11T12:05:26+00:00" 1219 | }, 1220 | { 1221 | "name": "symfony/polyfill-php56", 1222 | "version": "v1.6.0", 1223 | "source": { 1224 | "type": "git", 1225 | "url": "https://github.com/symfony/polyfill-php56.git", 1226 | "reference": "265fc96795492430762c29be291a371494ba3a5b" 1227 | }, 1228 | "dist": { 1229 | "type": "zip", 1230 | "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/265fc96795492430762c29be291a371494ba3a5b", 1231 | "reference": "265fc96795492430762c29be291a371494ba3a5b", 1232 | "shasum": "" 1233 | }, 1234 | "require": { 1235 | "php": ">=5.3.3", 1236 | "symfony/polyfill-util": "~1.0" 1237 | }, 1238 | "type": "library", 1239 | "extra": { 1240 | "branch-alias": { 1241 | "dev-master": "1.6-dev" 1242 | } 1243 | }, 1244 | "autoload": { 1245 | "psr-4": { 1246 | "Symfony\\Polyfill\\Php56\\": "" 1247 | }, 1248 | "files": [ 1249 | "bootstrap.php" 1250 | ] 1251 | }, 1252 | "notification-url": "https://packagist.org/downloads/", 1253 | "license": [ 1254 | "MIT" 1255 | ], 1256 | "authors": [ 1257 | { 1258 | "name": "Nicolas Grekas", 1259 | "email": "p@tchwork.com" 1260 | }, 1261 | { 1262 | "name": "Symfony Community", 1263 | "homepage": "https://symfony.com/contributors" 1264 | } 1265 | ], 1266 | "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", 1267 | "homepage": "https://symfony.com", 1268 | "keywords": [ 1269 | "compatibility", 1270 | "polyfill", 1271 | "portable", 1272 | "shim" 1273 | ], 1274 | "time": "2017-10-11T12:05:26+00:00" 1275 | }, 1276 | { 1277 | "name": "symfony/polyfill-php70", 1278 | "version": "v1.6.0", 1279 | "source": { 1280 | "type": "git", 1281 | "url": "https://github.com/symfony/polyfill-php70.git", 1282 | "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff" 1283 | }, 1284 | "dist": { 1285 | "type": "zip", 1286 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", 1287 | "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", 1288 | "shasum": "" 1289 | }, 1290 | "require": { 1291 | "paragonie/random_compat": "~1.0|~2.0", 1292 | "php": ">=5.3.3" 1293 | }, 1294 | "type": "library", 1295 | "extra": { 1296 | "branch-alias": { 1297 | "dev-master": "1.6-dev" 1298 | } 1299 | }, 1300 | "autoload": { 1301 | "psr-4": { 1302 | "Symfony\\Polyfill\\Php70\\": "" 1303 | }, 1304 | "files": [ 1305 | "bootstrap.php" 1306 | ], 1307 | "classmap": [ 1308 | "Resources/stubs" 1309 | ] 1310 | }, 1311 | "notification-url": "https://packagist.org/downloads/", 1312 | "license": [ 1313 | "MIT" 1314 | ], 1315 | "authors": [ 1316 | { 1317 | "name": "Nicolas Grekas", 1318 | "email": "p@tchwork.com" 1319 | }, 1320 | { 1321 | "name": "Symfony Community", 1322 | "homepage": "https://symfony.com/contributors" 1323 | } 1324 | ], 1325 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", 1326 | "homepage": "https://symfony.com", 1327 | "keywords": [ 1328 | "compatibility", 1329 | "polyfill", 1330 | "portable", 1331 | "shim" 1332 | ], 1333 | "time": "2017-10-11T12:05:26+00:00" 1334 | }, 1335 | { 1336 | "name": "symfony/polyfill-util", 1337 | "version": "v1.6.0", 1338 | "source": { 1339 | "type": "git", 1340 | "url": "https://github.com/symfony/polyfill-util.git", 1341 | "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176" 1342 | }, 1343 | "dist": { 1344 | "type": "zip", 1345 | "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/6e719200c8e540e0c0effeb31f96bdb344b94176", 1346 | "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176", 1347 | "shasum": "" 1348 | }, 1349 | "require": { 1350 | "php": ">=5.3.3" 1351 | }, 1352 | "type": "library", 1353 | "extra": { 1354 | "branch-alias": { 1355 | "dev-master": "1.6-dev" 1356 | } 1357 | }, 1358 | "autoload": { 1359 | "psr-4": { 1360 | "Symfony\\Polyfill\\Util\\": "" 1361 | } 1362 | }, 1363 | "notification-url": "https://packagist.org/downloads/", 1364 | "license": [ 1365 | "MIT" 1366 | ], 1367 | "authors": [ 1368 | { 1369 | "name": "Nicolas Grekas", 1370 | "email": "p@tchwork.com" 1371 | }, 1372 | { 1373 | "name": "Symfony Community", 1374 | "homepage": "https://symfony.com/contributors" 1375 | } 1376 | ], 1377 | "description": "Symfony utilities for portability of PHP codes", 1378 | "homepage": "https://symfony.com", 1379 | "keywords": [ 1380 | "compat", 1381 | "compatibility", 1382 | "polyfill", 1383 | "shim" 1384 | ], 1385 | "time": "2017-10-11T12:05:26+00:00" 1386 | }, 1387 | { 1388 | "name": "symfony/property-access", 1389 | "version": "v3.3.13", 1390 | "source": { 1391 | "type": "git", 1392 | "url": "https://github.com/symfony/property-access.git", 1393 | "reference": "abfaa3b9785eb4d6e7afb231915ad6c3d17471eb" 1394 | }, 1395 | "dist": { 1396 | "type": "zip", 1397 | "url": "https://api.github.com/repos/symfony/property-access/zipball/abfaa3b9785eb4d6e7afb231915ad6c3d17471eb", 1398 | "reference": "abfaa3b9785eb4d6e7afb231915ad6c3d17471eb", 1399 | "shasum": "" 1400 | }, 1401 | "require": { 1402 | "php": "^5.5.9|>=7.0.8", 1403 | "symfony/inflector": "~3.1", 1404 | "symfony/polyfill-php70": "~1.0" 1405 | }, 1406 | "require-dev": { 1407 | "symfony/cache": "~3.1" 1408 | }, 1409 | "suggest": { 1410 | "psr/cache-implementation": "To cache access methods." 1411 | }, 1412 | "type": "library", 1413 | "extra": { 1414 | "branch-alias": { 1415 | "dev-master": "3.3-dev" 1416 | } 1417 | }, 1418 | "autoload": { 1419 | "psr-4": { 1420 | "Symfony\\Component\\PropertyAccess\\": "" 1421 | }, 1422 | "exclude-from-classmap": [ 1423 | "/Tests/" 1424 | ] 1425 | }, 1426 | "notification-url": "https://packagist.org/downloads/", 1427 | "license": [ 1428 | "MIT" 1429 | ], 1430 | "authors": [ 1431 | { 1432 | "name": "Fabien Potencier", 1433 | "email": "fabien@symfony.com" 1434 | }, 1435 | { 1436 | "name": "Symfony Community", 1437 | "homepage": "https://symfony.com/contributors" 1438 | } 1439 | ], 1440 | "description": "Symfony PropertyAccess Component", 1441 | "homepage": "https://symfony.com", 1442 | "keywords": [ 1443 | "access", 1444 | "array", 1445 | "extraction", 1446 | "index", 1447 | "injection", 1448 | "object", 1449 | "property", 1450 | "property path", 1451 | "reflection" 1452 | ], 1453 | "time": "2017-11-05T15:47:03+00:00" 1454 | }, 1455 | { 1456 | "name": "symfony/routing", 1457 | "version": "v3.3.13", 1458 | "source": { 1459 | "type": "git", 1460 | "url": "https://github.com/symfony/routing.git", 1461 | "reference": "cf7fa1dfcfee2c96969bfa1c0341e5627ecb1e95" 1462 | }, 1463 | "dist": { 1464 | "type": "zip", 1465 | "url": "https://api.github.com/repos/symfony/routing/zipball/cf7fa1dfcfee2c96969bfa1c0341e5627ecb1e95", 1466 | "reference": "cf7fa1dfcfee2c96969bfa1c0341e5627ecb1e95", 1467 | "shasum": "" 1468 | }, 1469 | "require": { 1470 | "php": "^5.5.9|>=7.0.8" 1471 | }, 1472 | "conflict": { 1473 | "symfony/config": "<2.8", 1474 | "symfony/dependency-injection": "<3.3", 1475 | "symfony/yaml": "<3.3" 1476 | }, 1477 | "require-dev": { 1478 | "doctrine/annotations": "~1.0", 1479 | "doctrine/common": "~2.2", 1480 | "psr/log": "~1.0", 1481 | "symfony/config": "~2.8|~3.0", 1482 | "symfony/dependency-injection": "~3.3", 1483 | "symfony/expression-language": "~2.8|~3.0", 1484 | "symfony/http-foundation": "~2.8|~3.0", 1485 | "symfony/yaml": "~3.3" 1486 | }, 1487 | "suggest": { 1488 | "doctrine/annotations": "For using the annotation loader", 1489 | "symfony/config": "For using the all-in-one router or any loader", 1490 | "symfony/dependency-injection": "For loading routes from a service", 1491 | "symfony/expression-language": "For using expression matching", 1492 | "symfony/http-foundation": "For using a Symfony Request object", 1493 | "symfony/yaml": "For using the YAML loader" 1494 | }, 1495 | "type": "library", 1496 | "extra": { 1497 | "branch-alias": { 1498 | "dev-master": "3.3-dev" 1499 | } 1500 | }, 1501 | "autoload": { 1502 | "psr-4": { 1503 | "Symfony\\Component\\Routing\\": "" 1504 | }, 1505 | "exclude-from-classmap": [ 1506 | "/Tests/" 1507 | ] 1508 | }, 1509 | "notification-url": "https://packagist.org/downloads/", 1510 | "license": [ 1511 | "MIT" 1512 | ], 1513 | "authors": [ 1514 | { 1515 | "name": "Fabien Potencier", 1516 | "email": "fabien@symfony.com" 1517 | }, 1518 | { 1519 | "name": "Symfony Community", 1520 | "homepage": "https://symfony.com/contributors" 1521 | } 1522 | ], 1523 | "description": "Symfony Routing Component", 1524 | "homepage": "https://symfony.com", 1525 | "keywords": [ 1526 | "router", 1527 | "routing", 1528 | "uri", 1529 | "url" 1530 | ], 1531 | "time": "2017-11-07T14:16:22+00:00" 1532 | }, 1533 | { 1534 | "name": "symfony/security", 1535 | "version": "v3.3.13", 1536 | "source": { 1537 | "type": "git", 1538 | "url": "https://github.com/symfony/security.git", 1539 | "reference": "b3e577ea48e3e63c46d86dfd8f21f59ee0ff1d48" 1540 | }, 1541 | "dist": { 1542 | "type": "zip", 1543 | "url": "https://api.github.com/repos/symfony/security/zipball/b3e577ea48e3e63c46d86dfd8f21f59ee0ff1d48", 1544 | "reference": "b3e577ea48e3e63c46d86dfd8f21f59ee0ff1d48", 1545 | "shasum": "" 1546 | }, 1547 | "require": { 1548 | "php": "^5.5.9|>=7.0.8", 1549 | "symfony/event-dispatcher": "~2.8|~3.0", 1550 | "symfony/http-foundation": "^2.8.31|~3.3.13|~3.4-beta5", 1551 | "symfony/http-kernel": "~3.3", 1552 | "symfony/polyfill-php56": "~1.0", 1553 | "symfony/polyfill-php70": "~1.0", 1554 | "symfony/polyfill-util": "~1.0", 1555 | "symfony/property-access": "~2.8|~3.0" 1556 | }, 1557 | "replace": { 1558 | "symfony/security-core": "self.version", 1559 | "symfony/security-csrf": "self.version", 1560 | "symfony/security-guard": "self.version", 1561 | "symfony/security-http": "self.version" 1562 | }, 1563 | "require-dev": { 1564 | "psr/log": "~1.0", 1565 | "symfony/expression-language": "~2.8|~3.0", 1566 | "symfony/finder": "~2.8|~3.0", 1567 | "symfony/ldap": "~3.1", 1568 | "symfony/polyfill-intl-icu": "~1.0", 1569 | "symfony/routing": "~2.8|~3.0", 1570 | "symfony/validator": "^2.8.18|^3.2.5" 1571 | }, 1572 | "suggest": { 1573 | "symfony/expression-language": "For using the expression voter", 1574 | "symfony/form": "", 1575 | "symfony/ldap": "For using the LDAP user and authentication providers", 1576 | "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", 1577 | "symfony/validator": "For using the user password constraint" 1578 | }, 1579 | "type": "library", 1580 | "extra": { 1581 | "branch-alias": { 1582 | "dev-master": "3.3-dev" 1583 | } 1584 | }, 1585 | "autoload": { 1586 | "psr-4": { 1587 | "Symfony\\Component\\Security\\": "" 1588 | }, 1589 | "exclude-from-classmap": [ 1590 | "/Tests/" 1591 | ] 1592 | }, 1593 | "notification-url": "https://packagist.org/downloads/", 1594 | "license": [ 1595 | "MIT" 1596 | ], 1597 | "authors": [ 1598 | { 1599 | "name": "Fabien Potencier", 1600 | "email": "fabien@symfony.com" 1601 | }, 1602 | { 1603 | "name": "Symfony Community", 1604 | "homepage": "https://symfony.com/contributors" 1605 | } 1606 | ], 1607 | "description": "Symfony Security Component", 1608 | "homepage": "https://symfony.com", 1609 | "time": "2017-11-16T16:14:18+00:00" 1610 | }, 1611 | { 1612 | "name": "symfony/security-bundle", 1613 | "version": "v3.3.13", 1614 | "source": { 1615 | "type": "git", 1616 | "url": "https://github.com/symfony/security-bundle.git", 1617 | "reference": "8c1e84cc86fd71e74e61a9c3dbb6227fa7fcfb38" 1618 | }, 1619 | "dist": { 1620 | "type": "zip", 1621 | "url": "https://api.github.com/repos/symfony/security-bundle/zipball/8c1e84cc86fd71e74e61a9c3dbb6227fa7fcfb38", 1622 | "reference": "8c1e84cc86fd71e74e61a9c3dbb6227fa7fcfb38", 1623 | "shasum": "" 1624 | }, 1625 | "require": { 1626 | "ext-xml": "*", 1627 | "php": "^5.5.9|>=7.0.8", 1628 | "symfony/dependency-injection": "~3.3", 1629 | "symfony/http-kernel": "~3.3", 1630 | "symfony/polyfill-php70": "~1.0", 1631 | "symfony/security": "~3.3.13|~3.4-beta5" 1632 | }, 1633 | "conflict": { 1634 | "symfony/var-dumper": "<3.3" 1635 | }, 1636 | "require-dev": { 1637 | "doctrine/doctrine-bundle": "~1.4", 1638 | "symfony/asset": "~2.8|~3.0", 1639 | "symfony/browser-kit": "~2.8|~3.0", 1640 | "symfony/console": "~3.2", 1641 | "symfony/css-selector": "~2.8|~3.0", 1642 | "symfony/dom-crawler": "~2.8|~3.0", 1643 | "symfony/expression-language": "~2.8|~3.0", 1644 | "symfony/form": "^2.8.18|^3.2.5", 1645 | "symfony/framework-bundle": "^3.2.8", 1646 | "symfony/http-foundation": "~2.8|~3.0", 1647 | "symfony/process": "~2.8|~3.0", 1648 | "symfony/security-acl": "~2.8|~3.0", 1649 | "symfony/translation": "~2.8|~3.0", 1650 | "symfony/twig-bridge": "~2.8|~3.0", 1651 | "symfony/twig-bundle": "~2.8|~3.0", 1652 | "symfony/validator": "^3.2.5", 1653 | "symfony/var-dumper": "~3.3", 1654 | "symfony/yaml": "~2.8|~3.0", 1655 | "twig/twig": "~1.34|~2.4" 1656 | }, 1657 | "suggest": { 1658 | "symfony/security-acl": "For using the ACL functionality of this bundle" 1659 | }, 1660 | "type": "symfony-bundle", 1661 | "extra": { 1662 | "branch-alias": { 1663 | "dev-master": "3.3-dev" 1664 | } 1665 | }, 1666 | "autoload": { 1667 | "psr-4": { 1668 | "Symfony\\Bundle\\SecurityBundle\\": "" 1669 | }, 1670 | "exclude-from-classmap": [ 1671 | "/Tests/" 1672 | ] 1673 | }, 1674 | "notification-url": "https://packagist.org/downloads/", 1675 | "license": [ 1676 | "MIT" 1677 | ], 1678 | "authors": [ 1679 | { 1680 | "name": "Fabien Potencier", 1681 | "email": "fabien@symfony.com" 1682 | }, 1683 | { 1684 | "name": "Symfony Community", 1685 | "homepage": "https://symfony.com/contributors" 1686 | } 1687 | ], 1688 | "description": "Symfony SecurityBundle", 1689 | "homepage": "https://symfony.com", 1690 | "time": "2017-11-16T16:56:40+00:00" 1691 | }, 1692 | { 1693 | "name": "symfony/stopwatch", 1694 | "version": "v3.3.13", 1695 | "source": { 1696 | "type": "git", 1697 | "url": "https://github.com/symfony/stopwatch.git", 1698 | "reference": "1e93c3139ef6c799831fe03efd0fb1c7aecb3365" 1699 | }, 1700 | "dist": { 1701 | "type": "zip", 1702 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/1e93c3139ef6c799831fe03efd0fb1c7aecb3365", 1703 | "reference": "1e93c3139ef6c799831fe03efd0fb1c7aecb3365", 1704 | "shasum": "" 1705 | }, 1706 | "require": { 1707 | "php": "^5.5.9|>=7.0.8" 1708 | }, 1709 | "type": "library", 1710 | "extra": { 1711 | "branch-alias": { 1712 | "dev-master": "3.3-dev" 1713 | } 1714 | }, 1715 | "autoload": { 1716 | "psr-4": { 1717 | "Symfony\\Component\\Stopwatch\\": "" 1718 | }, 1719 | "exclude-from-classmap": [ 1720 | "/Tests/" 1721 | ] 1722 | }, 1723 | "notification-url": "https://packagist.org/downloads/", 1724 | "license": [ 1725 | "MIT" 1726 | ], 1727 | "authors": [ 1728 | { 1729 | "name": "Fabien Potencier", 1730 | "email": "fabien@symfony.com" 1731 | }, 1732 | { 1733 | "name": "Symfony Community", 1734 | "homepage": "https://symfony.com/contributors" 1735 | } 1736 | ], 1737 | "description": "Symfony Stopwatch Component", 1738 | "homepage": "https://symfony.com", 1739 | "time": "2017-11-10T19:02:53+00:00" 1740 | }, 1741 | { 1742 | "name": "zendframework/zend-ldap", 1743 | "version": "2.8.0", 1744 | "source": { 1745 | "type": "git", 1746 | "url": "https://github.com/zendframework/zend-ldap.git", 1747 | "reference": "a9284a7440e17ce0ba697670bb4db1baf2340acd" 1748 | }, 1749 | "dist": { 1750 | "type": "zip", 1751 | "url": "https://api.github.com/repos/zendframework/zend-ldap/zipball/a9284a7440e17ce0ba697670bb4db1baf2340acd", 1752 | "reference": "a9284a7440e17ce0ba697670bb4db1baf2340acd", 1753 | "shasum": "" 1754 | }, 1755 | "require": { 1756 | "ext-ldap": "*", 1757 | "php": "^5.5 || ^7.0" 1758 | }, 1759 | "require-dev": { 1760 | "php-mock/php-mock-phpunit": "~0.3", 1761 | "phpunit/phpunit": "^4.6", 1762 | "zendframework/zend-coding-standard": "~1.0.0", 1763 | "zendframework/zend-config": "^2.5", 1764 | "zendframework/zend-eventmanager": "^2.6.3 || ^3.0.1", 1765 | "zendframework/zend-stdlib": "^2.7 || ^3.0" 1766 | }, 1767 | "suggest": { 1768 | "zendframework/zend-eventmanager": "Zend\\EventManager component" 1769 | }, 1770 | "type": "library", 1771 | "extra": { 1772 | "branch-alias": { 1773 | "dev-master": "2.8-dev", 1774 | "dev-develop": "2.9-dev" 1775 | } 1776 | }, 1777 | "autoload": { 1778 | "psr-4": { 1779 | "Zend\\Ldap\\": "src/" 1780 | } 1781 | }, 1782 | "notification-url": "https://packagist.org/downloads/", 1783 | "license": [ 1784 | "BSD-3-Clause" 1785 | ], 1786 | "description": "provides support for LDAP operations including but not limited to binding, searching and modifying entries in an LDAP directory", 1787 | "homepage": "https://github.com/zendframework/zend-ldap", 1788 | "keywords": [ 1789 | "ldap", 1790 | "zf2" 1791 | ], 1792 | "time": "2017-03-06T20:39:12+00:00" 1793 | } 1794 | ], 1795 | "packages-dev": [ 1796 | { 1797 | "name": "composer/semver", 1798 | "version": "1.4.2", 1799 | "source": { 1800 | "type": "git", 1801 | "url": "https://github.com/composer/semver.git", 1802 | "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" 1803 | }, 1804 | "dist": { 1805 | "type": "zip", 1806 | "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", 1807 | "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", 1808 | "shasum": "" 1809 | }, 1810 | "require": { 1811 | "php": "^5.3.2 || ^7.0" 1812 | }, 1813 | "require-dev": { 1814 | "phpunit/phpunit": "^4.5 || ^5.0.5", 1815 | "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" 1816 | }, 1817 | "type": "library", 1818 | "extra": { 1819 | "branch-alias": { 1820 | "dev-master": "1.x-dev" 1821 | } 1822 | }, 1823 | "autoload": { 1824 | "psr-4": { 1825 | "Composer\\Semver\\": "src" 1826 | } 1827 | }, 1828 | "notification-url": "https://packagist.org/downloads/", 1829 | "license": [ 1830 | "MIT" 1831 | ], 1832 | "authors": [ 1833 | { 1834 | "name": "Nils Adermann", 1835 | "email": "naderman@naderman.de", 1836 | "homepage": "http://www.naderman.de" 1837 | }, 1838 | { 1839 | "name": "Jordi Boggiano", 1840 | "email": "j.boggiano@seld.be", 1841 | "homepage": "http://seld.be" 1842 | }, 1843 | { 1844 | "name": "Rob Bast", 1845 | "email": "rob.bast@gmail.com", 1846 | "homepage": "http://robbast.nl" 1847 | } 1848 | ], 1849 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 1850 | "keywords": [ 1851 | "semantic", 1852 | "semver", 1853 | "validation", 1854 | "versioning" 1855 | ], 1856 | "time": "2016-08-30T16:08:34+00:00" 1857 | }, 1858 | { 1859 | "name": "doctrine/annotations", 1860 | "version": "v1.5.0", 1861 | "source": { 1862 | "type": "git", 1863 | "url": "https://github.com/doctrine/annotations.git", 1864 | "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f" 1865 | }, 1866 | "dist": { 1867 | "type": "zip", 1868 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/5beebb01b025c94e93686b7a0ed3edae81fe3e7f", 1869 | "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f", 1870 | "shasum": "" 1871 | }, 1872 | "require": { 1873 | "doctrine/lexer": "1.*", 1874 | "php": "^7.1" 1875 | }, 1876 | "require-dev": { 1877 | "doctrine/cache": "1.*", 1878 | "phpunit/phpunit": "^5.7" 1879 | }, 1880 | "type": "library", 1881 | "extra": { 1882 | "branch-alias": { 1883 | "dev-master": "1.5.x-dev" 1884 | } 1885 | }, 1886 | "autoload": { 1887 | "psr-4": { 1888 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 1889 | } 1890 | }, 1891 | "notification-url": "https://packagist.org/downloads/", 1892 | "license": [ 1893 | "MIT" 1894 | ], 1895 | "authors": [ 1896 | { 1897 | "name": "Roman Borschel", 1898 | "email": "roman@code-factory.org" 1899 | }, 1900 | { 1901 | "name": "Benjamin Eberlei", 1902 | "email": "kontakt@beberlei.de" 1903 | }, 1904 | { 1905 | "name": "Guilherme Blanco", 1906 | "email": "guilhermeblanco@gmail.com" 1907 | }, 1908 | { 1909 | "name": "Jonathan Wage", 1910 | "email": "jonwage@gmail.com" 1911 | }, 1912 | { 1913 | "name": "Johannes Schmitt", 1914 | "email": "schmittjoh@gmail.com" 1915 | } 1916 | ], 1917 | "description": "Docblock Annotations Parser", 1918 | "homepage": "http://www.doctrine-project.org", 1919 | "keywords": [ 1920 | "annotations", 1921 | "docblock", 1922 | "parser" 1923 | ], 1924 | "time": "2017-07-22T10:58:02+00:00" 1925 | }, 1926 | { 1927 | "name": "doctrine/instantiator", 1928 | "version": "1.1.0", 1929 | "source": { 1930 | "type": "git", 1931 | "url": "https://github.com/doctrine/instantiator.git", 1932 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 1933 | }, 1934 | "dist": { 1935 | "type": "zip", 1936 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 1937 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 1938 | "shasum": "" 1939 | }, 1940 | "require": { 1941 | "php": "^7.1" 1942 | }, 1943 | "require-dev": { 1944 | "athletic/athletic": "~0.1.8", 1945 | "ext-pdo": "*", 1946 | "ext-phar": "*", 1947 | "phpunit/phpunit": "^6.2.3", 1948 | "squizlabs/php_codesniffer": "^3.0.2" 1949 | }, 1950 | "type": "library", 1951 | "extra": { 1952 | "branch-alias": { 1953 | "dev-master": "1.2.x-dev" 1954 | } 1955 | }, 1956 | "autoload": { 1957 | "psr-4": { 1958 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 1959 | } 1960 | }, 1961 | "notification-url": "https://packagist.org/downloads/", 1962 | "license": [ 1963 | "MIT" 1964 | ], 1965 | "authors": [ 1966 | { 1967 | "name": "Marco Pivetta", 1968 | "email": "ocramius@gmail.com", 1969 | "homepage": "http://ocramius.github.com/" 1970 | } 1971 | ], 1972 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 1973 | "homepage": "https://github.com/doctrine/instantiator", 1974 | "keywords": [ 1975 | "constructor", 1976 | "instantiate" 1977 | ], 1978 | "time": "2017-07-22T11:58:36+00:00" 1979 | }, 1980 | { 1981 | "name": "doctrine/lexer", 1982 | "version": "v1.0.1", 1983 | "source": { 1984 | "type": "git", 1985 | "url": "https://github.com/doctrine/lexer.git", 1986 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 1987 | }, 1988 | "dist": { 1989 | "type": "zip", 1990 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 1991 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 1992 | "shasum": "" 1993 | }, 1994 | "require": { 1995 | "php": ">=5.3.2" 1996 | }, 1997 | "type": "library", 1998 | "extra": { 1999 | "branch-alias": { 2000 | "dev-master": "1.0.x-dev" 2001 | } 2002 | }, 2003 | "autoload": { 2004 | "psr-0": { 2005 | "Doctrine\\Common\\Lexer\\": "lib/" 2006 | } 2007 | }, 2008 | "notification-url": "https://packagist.org/downloads/", 2009 | "license": [ 2010 | "MIT" 2011 | ], 2012 | "authors": [ 2013 | { 2014 | "name": "Roman Borschel", 2015 | "email": "roman@code-factory.org" 2016 | }, 2017 | { 2018 | "name": "Guilherme Blanco", 2019 | "email": "guilhermeblanco@gmail.com" 2020 | }, 2021 | { 2022 | "name": "Johannes Schmitt", 2023 | "email": "schmittjoh@gmail.com" 2024 | } 2025 | ], 2026 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 2027 | "homepage": "http://www.doctrine-project.org", 2028 | "keywords": [ 2029 | "lexer", 2030 | "parser" 2031 | ], 2032 | "time": "2014-09-09T13:34:57+00:00" 2033 | }, 2034 | { 2035 | "name": "friendsofphp/php-cs-fixer", 2036 | "version": "v2.8.3", 2037 | "source": { 2038 | "type": "git", 2039 | "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", 2040 | "reference": "d9ec9b848cbf930c31dea3693d34dbd8b9c95295" 2041 | }, 2042 | "dist": { 2043 | "type": "zip", 2044 | "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/d9ec9b848cbf930c31dea3693d34dbd8b9c95295", 2045 | "reference": "d9ec9b848cbf930c31dea3693d34dbd8b9c95295", 2046 | "shasum": "" 2047 | }, 2048 | "require": { 2049 | "composer/semver": "^1.4", 2050 | "doctrine/annotations": "^1.2", 2051 | "ext-json": "*", 2052 | "ext-tokenizer": "*", 2053 | "gecko-packages/gecko-php-unit": "^2.0 || ^3.0", 2054 | "php": "^5.6 || >=7.0 <7.3", 2055 | "php-cs-fixer/diff": "^1.2", 2056 | "symfony/console": "^3.2 || ^4.0", 2057 | "symfony/event-dispatcher": "^3.0 || ^4.0", 2058 | "symfony/filesystem": "^3.0 || ^4.0", 2059 | "symfony/finder": "^3.0 || ^4.0", 2060 | "symfony/options-resolver": "^3.0 || ^4.0", 2061 | "symfony/polyfill-php70": "^1.0", 2062 | "symfony/polyfill-php72": "^1.4", 2063 | "symfony/process": "^3.0 || ^4.0", 2064 | "symfony/stopwatch": "^3.0 || ^4.0" 2065 | }, 2066 | "conflict": { 2067 | "hhvm": "*" 2068 | }, 2069 | "require-dev": { 2070 | "johnkary/phpunit-speedtrap": "^1.1 || ^2.0@dev", 2071 | "justinrainbow/json-schema": "^5.0", 2072 | "php-coveralls/php-coveralls": "^1.0.2", 2073 | "php-cs-fixer/accessible-object": "^1.0", 2074 | "phpunit/phpunit": "^5.7.23 || ^6.4.3", 2075 | "symfony/phpunit-bridge": "^3.2.2 || ^4.0" 2076 | }, 2077 | "suggest": { 2078 | "ext-mbstring": "For handling non-UTF8 characters in cache signature.", 2079 | "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." 2080 | }, 2081 | "bin": [ 2082 | "php-cs-fixer" 2083 | ], 2084 | "type": "application", 2085 | "autoload": { 2086 | "psr-4": { 2087 | "PhpCsFixer\\": "src/" 2088 | }, 2089 | "classmap": [ 2090 | "tests/Test/Assert/AssertTokensTrait.php", 2091 | "tests/Test/AbstractFixerTestCase.php", 2092 | "tests/Test/AbstractIntegrationTestCase.php", 2093 | "tests/Test/IntegrationCase.php", 2094 | "tests/Test/IntegrationCaseFactory.php" 2095 | ] 2096 | }, 2097 | "notification-url": "https://packagist.org/downloads/", 2098 | "license": [ 2099 | "MIT" 2100 | ], 2101 | "authors": [ 2102 | { 2103 | "name": "Dariusz Rumiński", 2104 | "email": "dariusz.ruminski@gmail.com" 2105 | }, 2106 | { 2107 | "name": "Fabien Potencier", 2108 | "email": "fabien@symfony.com" 2109 | } 2110 | ], 2111 | "description": "A tool to automatically fix PHP code style", 2112 | "time": "2017-11-26T20:45:16+00:00" 2113 | }, 2114 | { 2115 | "name": "gecko-packages/gecko-php-unit", 2116 | "version": "v3.0", 2117 | "source": { 2118 | "type": "git", 2119 | "url": "https://github.com/GeckoPackages/GeckoPHPUnit.git", 2120 | "reference": "6a866551dffc2154c1b091bae3a7877d39c25ca3" 2121 | }, 2122 | "dist": { 2123 | "type": "zip", 2124 | "url": "https://api.github.com/repos/GeckoPackages/GeckoPHPUnit/zipball/6a866551dffc2154c1b091bae3a7877d39c25ca3", 2125 | "reference": "6a866551dffc2154c1b091bae3a7877d39c25ca3", 2126 | "shasum": "" 2127 | }, 2128 | "require": { 2129 | "php": "^7.0" 2130 | }, 2131 | "require-dev": { 2132 | "phpunit/phpunit": "^6.0" 2133 | }, 2134 | "suggest": { 2135 | "ext-dom": "When testing with xml.", 2136 | "ext-libxml": "When testing with xml.", 2137 | "phpunit/phpunit": "This is an extension for it so make sure you have it some way." 2138 | }, 2139 | "type": "library", 2140 | "extra": { 2141 | "branch-alias": { 2142 | "dev-master": "3.0-dev" 2143 | } 2144 | }, 2145 | "autoload": { 2146 | "psr-4": { 2147 | "GeckoPackages\\PHPUnit\\": "src/PHPUnit" 2148 | } 2149 | }, 2150 | "notification-url": "https://packagist.org/downloads/", 2151 | "license": [ 2152 | "MIT" 2153 | ], 2154 | "description": "Additional PHPUnit asserts and constraints.", 2155 | "homepage": "https://github.com/GeckoPackages", 2156 | "keywords": [ 2157 | "extension", 2158 | "filesystem", 2159 | "phpunit" 2160 | ], 2161 | "time": "2017-08-23T07:46:41+00:00" 2162 | }, 2163 | { 2164 | "name": "myclabs/deep-copy", 2165 | "version": "1.7.0", 2166 | "source": { 2167 | "type": "git", 2168 | "url": "https://github.com/myclabs/DeepCopy.git", 2169 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" 2170 | }, 2171 | "dist": { 2172 | "type": "zip", 2173 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 2174 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 2175 | "shasum": "" 2176 | }, 2177 | "require": { 2178 | "php": "^5.6 || ^7.0" 2179 | }, 2180 | "require-dev": { 2181 | "doctrine/collections": "^1.0", 2182 | "doctrine/common": "^2.6", 2183 | "phpunit/phpunit": "^4.1" 2184 | }, 2185 | "type": "library", 2186 | "autoload": { 2187 | "psr-4": { 2188 | "DeepCopy\\": "src/DeepCopy/" 2189 | }, 2190 | "files": [ 2191 | "src/DeepCopy/deep_copy.php" 2192 | ] 2193 | }, 2194 | "notification-url": "https://packagist.org/downloads/", 2195 | "license": [ 2196 | "MIT" 2197 | ], 2198 | "description": "Create deep copies (clones) of your objects", 2199 | "keywords": [ 2200 | "clone", 2201 | "copy", 2202 | "duplicate", 2203 | "object", 2204 | "object graph" 2205 | ], 2206 | "time": "2017-10-19T19:58:43+00:00" 2207 | }, 2208 | { 2209 | "name": "phar-io/manifest", 2210 | "version": "1.0.1", 2211 | "source": { 2212 | "type": "git", 2213 | "url": "https://github.com/phar-io/manifest.git", 2214 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" 2215 | }, 2216 | "dist": { 2217 | "type": "zip", 2218 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", 2219 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", 2220 | "shasum": "" 2221 | }, 2222 | "require": { 2223 | "ext-dom": "*", 2224 | "ext-phar": "*", 2225 | "phar-io/version": "^1.0.1", 2226 | "php": "^5.6 || ^7.0" 2227 | }, 2228 | "type": "library", 2229 | "extra": { 2230 | "branch-alias": { 2231 | "dev-master": "1.0.x-dev" 2232 | } 2233 | }, 2234 | "autoload": { 2235 | "classmap": [ 2236 | "src/" 2237 | ] 2238 | }, 2239 | "notification-url": "https://packagist.org/downloads/", 2240 | "license": [ 2241 | "BSD-3-Clause" 2242 | ], 2243 | "authors": [ 2244 | { 2245 | "name": "Arne Blankerts", 2246 | "email": "arne@blankerts.de", 2247 | "role": "Developer" 2248 | }, 2249 | { 2250 | "name": "Sebastian Heuer", 2251 | "email": "sebastian@phpeople.de", 2252 | "role": "Developer" 2253 | }, 2254 | { 2255 | "name": "Sebastian Bergmann", 2256 | "email": "sebastian@phpunit.de", 2257 | "role": "Developer" 2258 | } 2259 | ], 2260 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 2261 | "time": "2017-03-05T18:14:27+00:00" 2262 | }, 2263 | { 2264 | "name": "phar-io/version", 2265 | "version": "1.0.1", 2266 | "source": { 2267 | "type": "git", 2268 | "url": "https://github.com/phar-io/version.git", 2269 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" 2270 | }, 2271 | "dist": { 2272 | "type": "zip", 2273 | "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", 2274 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", 2275 | "shasum": "" 2276 | }, 2277 | "require": { 2278 | "php": "^5.6 || ^7.0" 2279 | }, 2280 | "type": "library", 2281 | "autoload": { 2282 | "classmap": [ 2283 | "src/" 2284 | ] 2285 | }, 2286 | "notification-url": "https://packagist.org/downloads/", 2287 | "license": [ 2288 | "BSD-3-Clause" 2289 | ], 2290 | "authors": [ 2291 | { 2292 | "name": "Arne Blankerts", 2293 | "email": "arne@blankerts.de", 2294 | "role": "Developer" 2295 | }, 2296 | { 2297 | "name": "Sebastian Heuer", 2298 | "email": "sebastian@phpeople.de", 2299 | "role": "Developer" 2300 | }, 2301 | { 2302 | "name": "Sebastian Bergmann", 2303 | "email": "sebastian@phpunit.de", 2304 | "role": "Developer" 2305 | } 2306 | ], 2307 | "description": "Library for handling version information and constraints", 2308 | "time": "2017-03-05T17:38:23+00:00" 2309 | }, 2310 | { 2311 | "name": "php-cs-fixer/diff", 2312 | "version": "v1.2.0", 2313 | "source": { 2314 | "type": "git", 2315 | "url": "https://github.com/PHP-CS-Fixer/diff.git", 2316 | "reference": "f0ef6133d674137e902fdf8a6f2e8e97e14a087b" 2317 | }, 2318 | "dist": { 2319 | "type": "zip", 2320 | "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/f0ef6133d674137e902fdf8a6f2e8e97e14a087b", 2321 | "reference": "f0ef6133d674137e902fdf8a6f2e8e97e14a087b", 2322 | "shasum": "" 2323 | }, 2324 | "require": { 2325 | "php": "^5.6 || ^7.0" 2326 | }, 2327 | "require-dev": { 2328 | "phpunit/phpunit": "^4.8.35 || ^5.4.3", 2329 | "symfony/process": "^3.3" 2330 | }, 2331 | "type": "library", 2332 | "autoload": { 2333 | "classmap": [ 2334 | "src/" 2335 | ] 2336 | }, 2337 | "notification-url": "https://packagist.org/downloads/", 2338 | "authors": [ 2339 | { 2340 | "name": "Kore Nordmann", 2341 | "email": "mail@kore-nordmann.de" 2342 | }, 2343 | { 2344 | "name": "Sebastian Bergmann", 2345 | "email": "sebastian@phpunit.de" 2346 | }, 2347 | { 2348 | "name": "SpacePossum" 2349 | } 2350 | ], 2351 | "description": "sebastian/diff v2 backport support for PHP5.6", 2352 | "homepage": "https://github.com/PHP-CS-Fixer", 2353 | "keywords": [ 2354 | "diff" 2355 | ], 2356 | "time": "2017-10-19T09:58:18+00:00" 2357 | }, 2358 | { 2359 | "name": "phpdocumentor/reflection-common", 2360 | "version": "1.0.1", 2361 | "source": { 2362 | "type": "git", 2363 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 2364 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 2365 | }, 2366 | "dist": { 2367 | "type": "zip", 2368 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2369 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2370 | "shasum": "" 2371 | }, 2372 | "require": { 2373 | "php": ">=5.5" 2374 | }, 2375 | "require-dev": { 2376 | "phpunit/phpunit": "^4.6" 2377 | }, 2378 | "type": "library", 2379 | "extra": { 2380 | "branch-alias": { 2381 | "dev-master": "1.0.x-dev" 2382 | } 2383 | }, 2384 | "autoload": { 2385 | "psr-4": { 2386 | "phpDocumentor\\Reflection\\": [ 2387 | "src" 2388 | ] 2389 | } 2390 | }, 2391 | "notification-url": "https://packagist.org/downloads/", 2392 | "license": [ 2393 | "MIT" 2394 | ], 2395 | "authors": [ 2396 | { 2397 | "name": "Jaap van Otterdijk", 2398 | "email": "opensource@ijaap.nl" 2399 | } 2400 | ], 2401 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 2402 | "homepage": "http://www.phpdoc.org", 2403 | "keywords": [ 2404 | "FQSEN", 2405 | "phpDocumentor", 2406 | "phpdoc", 2407 | "reflection", 2408 | "static analysis" 2409 | ], 2410 | "time": "2017-09-11T18:02:19+00:00" 2411 | }, 2412 | { 2413 | "name": "phpdocumentor/reflection-docblock", 2414 | "version": "4.2.0", 2415 | "source": { 2416 | "type": "git", 2417 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 2418 | "reference": "66465776cfc249844bde6d117abff1d22e06c2da" 2419 | }, 2420 | "dist": { 2421 | "type": "zip", 2422 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/66465776cfc249844bde6d117abff1d22e06c2da", 2423 | "reference": "66465776cfc249844bde6d117abff1d22e06c2da", 2424 | "shasum": "" 2425 | }, 2426 | "require": { 2427 | "php": "^7.0", 2428 | "phpdocumentor/reflection-common": "^1.0.0", 2429 | "phpdocumentor/type-resolver": "^0.4.0", 2430 | "webmozart/assert": "^1.0" 2431 | }, 2432 | "require-dev": { 2433 | "doctrine/instantiator": "~1.0.5", 2434 | "mockery/mockery": "^1.0", 2435 | "phpunit/phpunit": "^6.4" 2436 | }, 2437 | "type": "library", 2438 | "extra": { 2439 | "branch-alias": { 2440 | "dev-master": "4.x-dev" 2441 | } 2442 | }, 2443 | "autoload": { 2444 | "psr-4": { 2445 | "phpDocumentor\\Reflection\\": [ 2446 | "src/" 2447 | ] 2448 | } 2449 | }, 2450 | "notification-url": "https://packagist.org/downloads/", 2451 | "license": [ 2452 | "MIT" 2453 | ], 2454 | "authors": [ 2455 | { 2456 | "name": "Mike van Riel", 2457 | "email": "me@mikevanriel.com" 2458 | } 2459 | ], 2460 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 2461 | "time": "2017-11-27T17:38:31+00:00" 2462 | }, 2463 | { 2464 | "name": "phpdocumentor/type-resolver", 2465 | "version": "0.4.0", 2466 | "source": { 2467 | "type": "git", 2468 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 2469 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 2470 | }, 2471 | "dist": { 2472 | "type": "zip", 2473 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 2474 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 2475 | "shasum": "" 2476 | }, 2477 | "require": { 2478 | "php": "^5.5 || ^7.0", 2479 | "phpdocumentor/reflection-common": "^1.0" 2480 | }, 2481 | "require-dev": { 2482 | "mockery/mockery": "^0.9.4", 2483 | "phpunit/phpunit": "^5.2||^4.8.24" 2484 | }, 2485 | "type": "library", 2486 | "extra": { 2487 | "branch-alias": { 2488 | "dev-master": "1.0.x-dev" 2489 | } 2490 | }, 2491 | "autoload": { 2492 | "psr-4": { 2493 | "phpDocumentor\\Reflection\\": [ 2494 | "src/" 2495 | ] 2496 | } 2497 | }, 2498 | "notification-url": "https://packagist.org/downloads/", 2499 | "license": [ 2500 | "MIT" 2501 | ], 2502 | "authors": [ 2503 | { 2504 | "name": "Mike van Riel", 2505 | "email": "me@mikevanriel.com" 2506 | } 2507 | ], 2508 | "time": "2017-07-14T14:27:02+00:00" 2509 | }, 2510 | { 2511 | "name": "phpspec/prophecy", 2512 | "version": "1.7.3", 2513 | "source": { 2514 | "type": "git", 2515 | "url": "https://github.com/phpspec/prophecy.git", 2516 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf" 2517 | }, 2518 | "dist": { 2519 | "type": "zip", 2520 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", 2521 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", 2522 | "shasum": "" 2523 | }, 2524 | "require": { 2525 | "doctrine/instantiator": "^1.0.2", 2526 | "php": "^5.3|^7.0", 2527 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 2528 | "sebastian/comparator": "^1.1|^2.0", 2529 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 2530 | }, 2531 | "require-dev": { 2532 | "phpspec/phpspec": "^2.5|^3.2", 2533 | "phpunit/phpunit": "^4.8.35 || ^5.7" 2534 | }, 2535 | "type": "library", 2536 | "extra": { 2537 | "branch-alias": { 2538 | "dev-master": "1.7.x-dev" 2539 | } 2540 | }, 2541 | "autoload": { 2542 | "psr-0": { 2543 | "Prophecy\\": "src/" 2544 | } 2545 | }, 2546 | "notification-url": "https://packagist.org/downloads/", 2547 | "license": [ 2548 | "MIT" 2549 | ], 2550 | "authors": [ 2551 | { 2552 | "name": "Konstantin Kudryashov", 2553 | "email": "ever.zet@gmail.com", 2554 | "homepage": "http://everzet.com" 2555 | }, 2556 | { 2557 | "name": "Marcello Duarte", 2558 | "email": "marcello.duarte@gmail.com" 2559 | } 2560 | ], 2561 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2562 | "homepage": "https://github.com/phpspec/prophecy", 2563 | "keywords": [ 2564 | "Double", 2565 | "Dummy", 2566 | "fake", 2567 | "mock", 2568 | "spy", 2569 | "stub" 2570 | ], 2571 | "time": "2017-11-24T13:59:53+00:00" 2572 | }, 2573 | { 2574 | "name": "phpunit/php-code-coverage", 2575 | "version": "5.2.4", 2576 | "source": { 2577 | "type": "git", 2578 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2579 | "reference": "033ec97498cf530cc1be4199264cad568b19be26" 2580 | }, 2581 | "dist": { 2582 | "type": "zip", 2583 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/033ec97498cf530cc1be4199264cad568b19be26", 2584 | "reference": "033ec97498cf530cc1be4199264cad568b19be26", 2585 | "shasum": "" 2586 | }, 2587 | "require": { 2588 | "ext-dom": "*", 2589 | "ext-xmlwriter": "*", 2590 | "php": "^7.0", 2591 | "phpunit/php-file-iterator": "^1.4.2", 2592 | "phpunit/php-text-template": "^1.2.1", 2593 | "phpunit/php-token-stream": "^2.0.1", 2594 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 2595 | "sebastian/environment": "^3.0", 2596 | "sebastian/version": "^2.0.1", 2597 | "theseer/tokenizer": "^1.1" 2598 | }, 2599 | "require-dev": { 2600 | "ext-xdebug": "^2.5", 2601 | "phpunit/phpunit": "^6.0" 2602 | }, 2603 | "suggest": { 2604 | "ext-xdebug": "^2.5.5" 2605 | }, 2606 | "type": "library", 2607 | "extra": { 2608 | "branch-alias": { 2609 | "dev-master": "5.2.x-dev" 2610 | } 2611 | }, 2612 | "autoload": { 2613 | "classmap": [ 2614 | "src/" 2615 | ] 2616 | }, 2617 | "notification-url": "https://packagist.org/downloads/", 2618 | "license": [ 2619 | "BSD-3-Clause" 2620 | ], 2621 | "authors": [ 2622 | { 2623 | "name": "Sebastian Bergmann", 2624 | "email": "sb@sebastian-bergmann.de", 2625 | "role": "lead" 2626 | } 2627 | ], 2628 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2629 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2630 | "keywords": [ 2631 | "coverage", 2632 | "testing", 2633 | "xunit" 2634 | ], 2635 | "time": "2017-11-27T09:00:30+00:00" 2636 | }, 2637 | { 2638 | "name": "phpunit/php-file-iterator", 2639 | "version": "1.4.5", 2640 | "source": { 2641 | "type": "git", 2642 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2643 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" 2644 | }, 2645 | "dist": { 2646 | "type": "zip", 2647 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", 2648 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", 2649 | "shasum": "" 2650 | }, 2651 | "require": { 2652 | "php": ">=5.3.3" 2653 | }, 2654 | "type": "library", 2655 | "extra": { 2656 | "branch-alias": { 2657 | "dev-master": "1.4.x-dev" 2658 | } 2659 | }, 2660 | "autoload": { 2661 | "classmap": [ 2662 | "src/" 2663 | ] 2664 | }, 2665 | "notification-url": "https://packagist.org/downloads/", 2666 | "license": [ 2667 | "BSD-3-Clause" 2668 | ], 2669 | "authors": [ 2670 | { 2671 | "name": "Sebastian Bergmann", 2672 | "email": "sb@sebastian-bergmann.de", 2673 | "role": "lead" 2674 | } 2675 | ], 2676 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2677 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2678 | "keywords": [ 2679 | "filesystem", 2680 | "iterator" 2681 | ], 2682 | "time": "2017-11-27T13:52:08+00:00" 2683 | }, 2684 | { 2685 | "name": "phpunit/php-text-template", 2686 | "version": "1.2.1", 2687 | "source": { 2688 | "type": "git", 2689 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2690 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2691 | }, 2692 | "dist": { 2693 | "type": "zip", 2694 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2695 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2696 | "shasum": "" 2697 | }, 2698 | "require": { 2699 | "php": ">=5.3.3" 2700 | }, 2701 | "type": "library", 2702 | "autoload": { 2703 | "classmap": [ 2704 | "src/" 2705 | ] 2706 | }, 2707 | "notification-url": "https://packagist.org/downloads/", 2708 | "license": [ 2709 | "BSD-3-Clause" 2710 | ], 2711 | "authors": [ 2712 | { 2713 | "name": "Sebastian Bergmann", 2714 | "email": "sebastian@phpunit.de", 2715 | "role": "lead" 2716 | } 2717 | ], 2718 | "description": "Simple template engine.", 2719 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2720 | "keywords": [ 2721 | "template" 2722 | ], 2723 | "time": "2015-06-21T13:50:34+00:00" 2724 | }, 2725 | { 2726 | "name": "phpunit/php-timer", 2727 | "version": "1.0.9", 2728 | "source": { 2729 | "type": "git", 2730 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2731 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 2732 | }, 2733 | "dist": { 2734 | "type": "zip", 2735 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 2736 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 2737 | "shasum": "" 2738 | }, 2739 | "require": { 2740 | "php": "^5.3.3 || ^7.0" 2741 | }, 2742 | "require-dev": { 2743 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2744 | }, 2745 | "type": "library", 2746 | "extra": { 2747 | "branch-alias": { 2748 | "dev-master": "1.0-dev" 2749 | } 2750 | }, 2751 | "autoload": { 2752 | "classmap": [ 2753 | "src/" 2754 | ] 2755 | }, 2756 | "notification-url": "https://packagist.org/downloads/", 2757 | "license": [ 2758 | "BSD-3-Clause" 2759 | ], 2760 | "authors": [ 2761 | { 2762 | "name": "Sebastian Bergmann", 2763 | "email": "sb@sebastian-bergmann.de", 2764 | "role": "lead" 2765 | } 2766 | ], 2767 | "description": "Utility class for timing", 2768 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2769 | "keywords": [ 2770 | "timer" 2771 | ], 2772 | "time": "2017-02-26T11:10:40+00:00" 2773 | }, 2774 | { 2775 | "name": "phpunit/php-token-stream", 2776 | "version": "2.0.2", 2777 | "source": { 2778 | "type": "git", 2779 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 2780 | "reference": "791198a2c6254db10131eecfe8c06670700904db" 2781 | }, 2782 | "dist": { 2783 | "type": "zip", 2784 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", 2785 | "reference": "791198a2c6254db10131eecfe8c06670700904db", 2786 | "shasum": "" 2787 | }, 2788 | "require": { 2789 | "ext-tokenizer": "*", 2790 | "php": "^7.0" 2791 | }, 2792 | "require-dev": { 2793 | "phpunit/phpunit": "^6.2.4" 2794 | }, 2795 | "type": "library", 2796 | "extra": { 2797 | "branch-alias": { 2798 | "dev-master": "2.0-dev" 2799 | } 2800 | }, 2801 | "autoload": { 2802 | "classmap": [ 2803 | "src/" 2804 | ] 2805 | }, 2806 | "notification-url": "https://packagist.org/downloads/", 2807 | "license": [ 2808 | "BSD-3-Clause" 2809 | ], 2810 | "authors": [ 2811 | { 2812 | "name": "Sebastian Bergmann", 2813 | "email": "sebastian@phpunit.de" 2814 | } 2815 | ], 2816 | "description": "Wrapper around PHP's tokenizer extension.", 2817 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 2818 | "keywords": [ 2819 | "tokenizer" 2820 | ], 2821 | "time": "2017-11-27T05:48:46+00:00" 2822 | }, 2823 | { 2824 | "name": "phpunit/phpunit", 2825 | "version": "6.4.4", 2826 | "source": { 2827 | "type": "git", 2828 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2829 | "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932" 2830 | }, 2831 | "dist": { 2832 | "type": "zip", 2833 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/562f7dc75d46510a4ed5d16189ae57fbe45a9932", 2834 | "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932", 2835 | "shasum": "" 2836 | }, 2837 | "require": { 2838 | "ext-dom": "*", 2839 | "ext-json": "*", 2840 | "ext-libxml": "*", 2841 | "ext-mbstring": "*", 2842 | "ext-xml": "*", 2843 | "myclabs/deep-copy": "^1.6.1", 2844 | "phar-io/manifest": "^1.0.1", 2845 | "phar-io/version": "^1.0", 2846 | "php": "^7.0", 2847 | "phpspec/prophecy": "^1.7", 2848 | "phpunit/php-code-coverage": "^5.2.2", 2849 | "phpunit/php-file-iterator": "^1.4.2", 2850 | "phpunit/php-text-template": "^1.2.1", 2851 | "phpunit/php-timer": "^1.0.9", 2852 | "phpunit/phpunit-mock-objects": "^4.0.3", 2853 | "sebastian/comparator": "^2.0.2", 2854 | "sebastian/diff": "^2.0", 2855 | "sebastian/environment": "^3.1", 2856 | "sebastian/exporter": "^3.1", 2857 | "sebastian/global-state": "^2.0", 2858 | "sebastian/object-enumerator": "^3.0.3", 2859 | "sebastian/resource-operations": "^1.0", 2860 | "sebastian/version": "^2.0.1" 2861 | }, 2862 | "conflict": { 2863 | "phpdocumentor/reflection-docblock": "3.0.2", 2864 | "phpunit/dbunit": "<3.0" 2865 | }, 2866 | "require-dev": { 2867 | "ext-pdo": "*" 2868 | }, 2869 | "suggest": { 2870 | "ext-xdebug": "*", 2871 | "phpunit/php-invoker": "^1.1" 2872 | }, 2873 | "bin": [ 2874 | "phpunit" 2875 | ], 2876 | "type": "library", 2877 | "extra": { 2878 | "branch-alias": { 2879 | "dev-master": "6.4.x-dev" 2880 | } 2881 | }, 2882 | "autoload": { 2883 | "classmap": [ 2884 | "src/" 2885 | ] 2886 | }, 2887 | "notification-url": "https://packagist.org/downloads/", 2888 | "license": [ 2889 | "BSD-3-Clause" 2890 | ], 2891 | "authors": [ 2892 | { 2893 | "name": "Sebastian Bergmann", 2894 | "email": "sebastian@phpunit.de", 2895 | "role": "lead" 2896 | } 2897 | ], 2898 | "description": "The PHP Unit Testing framework.", 2899 | "homepage": "https://phpunit.de/", 2900 | "keywords": [ 2901 | "phpunit", 2902 | "testing", 2903 | "xunit" 2904 | ], 2905 | "time": "2017-11-08T11:26:09+00:00" 2906 | }, 2907 | { 2908 | "name": "phpunit/phpunit-mock-objects", 2909 | "version": "4.0.4", 2910 | "source": { 2911 | "type": "git", 2912 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 2913 | "reference": "2f789b59ab89669015ad984afa350c4ec577ade0" 2914 | }, 2915 | "dist": { 2916 | "type": "zip", 2917 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/2f789b59ab89669015ad984afa350c4ec577ade0", 2918 | "reference": "2f789b59ab89669015ad984afa350c4ec577ade0", 2919 | "shasum": "" 2920 | }, 2921 | "require": { 2922 | "doctrine/instantiator": "^1.0.5", 2923 | "php": "^7.0", 2924 | "phpunit/php-text-template": "^1.2.1", 2925 | "sebastian/exporter": "^3.0" 2926 | }, 2927 | "conflict": { 2928 | "phpunit/phpunit": "<6.0" 2929 | }, 2930 | "require-dev": { 2931 | "phpunit/phpunit": "^6.0" 2932 | }, 2933 | "suggest": { 2934 | "ext-soap": "*" 2935 | }, 2936 | "type": "library", 2937 | "extra": { 2938 | "branch-alias": { 2939 | "dev-master": "4.0.x-dev" 2940 | } 2941 | }, 2942 | "autoload": { 2943 | "classmap": [ 2944 | "src/" 2945 | ] 2946 | }, 2947 | "notification-url": "https://packagist.org/downloads/", 2948 | "license": [ 2949 | "BSD-3-Clause" 2950 | ], 2951 | "authors": [ 2952 | { 2953 | "name": "Sebastian Bergmann", 2954 | "email": "sb@sebastian-bergmann.de", 2955 | "role": "lead" 2956 | } 2957 | ], 2958 | "description": "Mock Object library for PHPUnit", 2959 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 2960 | "keywords": [ 2961 | "mock", 2962 | "xunit" 2963 | ], 2964 | "time": "2017-08-03T14:08:16+00:00" 2965 | }, 2966 | { 2967 | "name": "sebastian/code-unit-reverse-lookup", 2968 | "version": "1.0.1", 2969 | "source": { 2970 | "type": "git", 2971 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2972 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 2973 | }, 2974 | "dist": { 2975 | "type": "zip", 2976 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2977 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2978 | "shasum": "" 2979 | }, 2980 | "require": { 2981 | "php": "^5.6 || ^7.0" 2982 | }, 2983 | "require-dev": { 2984 | "phpunit/phpunit": "^5.7 || ^6.0" 2985 | }, 2986 | "type": "library", 2987 | "extra": { 2988 | "branch-alias": { 2989 | "dev-master": "1.0.x-dev" 2990 | } 2991 | }, 2992 | "autoload": { 2993 | "classmap": [ 2994 | "src/" 2995 | ] 2996 | }, 2997 | "notification-url": "https://packagist.org/downloads/", 2998 | "license": [ 2999 | "BSD-3-Clause" 3000 | ], 3001 | "authors": [ 3002 | { 3003 | "name": "Sebastian Bergmann", 3004 | "email": "sebastian@phpunit.de" 3005 | } 3006 | ], 3007 | "description": "Looks up which function or method a line of code belongs to", 3008 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 3009 | "time": "2017-03-04T06:30:41+00:00" 3010 | }, 3011 | { 3012 | "name": "sebastian/comparator", 3013 | "version": "2.1.0", 3014 | "source": { 3015 | "type": "git", 3016 | "url": "https://github.com/sebastianbergmann/comparator.git", 3017 | "reference": "1174d9018191e93cb9d719edec01257fc05f8158" 3018 | }, 3019 | "dist": { 3020 | "type": "zip", 3021 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1174d9018191e93cb9d719edec01257fc05f8158", 3022 | "reference": "1174d9018191e93cb9d719edec01257fc05f8158", 3023 | "shasum": "" 3024 | }, 3025 | "require": { 3026 | "php": "^7.0", 3027 | "sebastian/diff": "^2.0", 3028 | "sebastian/exporter": "^3.1" 3029 | }, 3030 | "require-dev": { 3031 | "phpunit/phpunit": "^6.4" 3032 | }, 3033 | "type": "library", 3034 | "extra": { 3035 | "branch-alias": { 3036 | "dev-master": "2.1.x-dev" 3037 | } 3038 | }, 3039 | "autoload": { 3040 | "classmap": [ 3041 | "src/" 3042 | ] 3043 | }, 3044 | "notification-url": "https://packagist.org/downloads/", 3045 | "license": [ 3046 | "BSD-3-Clause" 3047 | ], 3048 | "authors": [ 3049 | { 3050 | "name": "Jeff Welch", 3051 | "email": "whatthejeff@gmail.com" 3052 | }, 3053 | { 3054 | "name": "Volker Dusch", 3055 | "email": "github@wallbash.com" 3056 | }, 3057 | { 3058 | "name": "Bernhard Schussek", 3059 | "email": "bschussek@2bepublished.at" 3060 | }, 3061 | { 3062 | "name": "Sebastian Bergmann", 3063 | "email": "sebastian@phpunit.de" 3064 | } 3065 | ], 3066 | "description": "Provides the functionality to compare PHP values for equality", 3067 | "homepage": "https://github.com/sebastianbergmann/comparator", 3068 | "keywords": [ 3069 | "comparator", 3070 | "compare", 3071 | "equality" 3072 | ], 3073 | "time": "2017-11-03T07:16:52+00:00" 3074 | }, 3075 | { 3076 | "name": "sebastian/diff", 3077 | "version": "2.0.1", 3078 | "source": { 3079 | "type": "git", 3080 | "url": "https://github.com/sebastianbergmann/diff.git", 3081 | "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" 3082 | }, 3083 | "dist": { 3084 | "type": "zip", 3085 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", 3086 | "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", 3087 | "shasum": "" 3088 | }, 3089 | "require": { 3090 | "php": "^7.0" 3091 | }, 3092 | "require-dev": { 3093 | "phpunit/phpunit": "^6.2" 3094 | }, 3095 | "type": "library", 3096 | "extra": { 3097 | "branch-alias": { 3098 | "dev-master": "2.0-dev" 3099 | } 3100 | }, 3101 | "autoload": { 3102 | "classmap": [ 3103 | "src/" 3104 | ] 3105 | }, 3106 | "notification-url": "https://packagist.org/downloads/", 3107 | "license": [ 3108 | "BSD-3-Clause" 3109 | ], 3110 | "authors": [ 3111 | { 3112 | "name": "Kore Nordmann", 3113 | "email": "mail@kore-nordmann.de" 3114 | }, 3115 | { 3116 | "name": "Sebastian Bergmann", 3117 | "email": "sebastian@phpunit.de" 3118 | } 3119 | ], 3120 | "description": "Diff implementation", 3121 | "homepage": "https://github.com/sebastianbergmann/diff", 3122 | "keywords": [ 3123 | "diff" 3124 | ], 3125 | "time": "2017-08-03T08:09:46+00:00" 3126 | }, 3127 | { 3128 | "name": "sebastian/environment", 3129 | "version": "3.1.0", 3130 | "source": { 3131 | "type": "git", 3132 | "url": "https://github.com/sebastianbergmann/environment.git", 3133 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" 3134 | }, 3135 | "dist": { 3136 | "type": "zip", 3137 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 3138 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 3139 | "shasum": "" 3140 | }, 3141 | "require": { 3142 | "php": "^7.0" 3143 | }, 3144 | "require-dev": { 3145 | "phpunit/phpunit": "^6.1" 3146 | }, 3147 | "type": "library", 3148 | "extra": { 3149 | "branch-alias": { 3150 | "dev-master": "3.1.x-dev" 3151 | } 3152 | }, 3153 | "autoload": { 3154 | "classmap": [ 3155 | "src/" 3156 | ] 3157 | }, 3158 | "notification-url": "https://packagist.org/downloads/", 3159 | "license": [ 3160 | "BSD-3-Clause" 3161 | ], 3162 | "authors": [ 3163 | { 3164 | "name": "Sebastian Bergmann", 3165 | "email": "sebastian@phpunit.de" 3166 | } 3167 | ], 3168 | "description": "Provides functionality to handle HHVM/PHP environments", 3169 | "homepage": "http://www.github.com/sebastianbergmann/environment", 3170 | "keywords": [ 3171 | "Xdebug", 3172 | "environment", 3173 | "hhvm" 3174 | ], 3175 | "time": "2017-07-01T08:51:00+00:00" 3176 | }, 3177 | { 3178 | "name": "sebastian/exporter", 3179 | "version": "3.1.0", 3180 | "source": { 3181 | "type": "git", 3182 | "url": "https://github.com/sebastianbergmann/exporter.git", 3183 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" 3184 | }, 3185 | "dist": { 3186 | "type": "zip", 3187 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", 3188 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", 3189 | "shasum": "" 3190 | }, 3191 | "require": { 3192 | "php": "^7.0", 3193 | "sebastian/recursion-context": "^3.0" 3194 | }, 3195 | "require-dev": { 3196 | "ext-mbstring": "*", 3197 | "phpunit/phpunit": "^6.0" 3198 | }, 3199 | "type": "library", 3200 | "extra": { 3201 | "branch-alias": { 3202 | "dev-master": "3.1.x-dev" 3203 | } 3204 | }, 3205 | "autoload": { 3206 | "classmap": [ 3207 | "src/" 3208 | ] 3209 | }, 3210 | "notification-url": "https://packagist.org/downloads/", 3211 | "license": [ 3212 | "BSD-3-Clause" 3213 | ], 3214 | "authors": [ 3215 | { 3216 | "name": "Jeff Welch", 3217 | "email": "whatthejeff@gmail.com" 3218 | }, 3219 | { 3220 | "name": "Volker Dusch", 3221 | "email": "github@wallbash.com" 3222 | }, 3223 | { 3224 | "name": "Bernhard Schussek", 3225 | "email": "bschussek@2bepublished.at" 3226 | }, 3227 | { 3228 | "name": "Sebastian Bergmann", 3229 | "email": "sebastian@phpunit.de" 3230 | }, 3231 | { 3232 | "name": "Adam Harvey", 3233 | "email": "aharvey@php.net" 3234 | } 3235 | ], 3236 | "description": "Provides the functionality to export PHP variables for visualization", 3237 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 3238 | "keywords": [ 3239 | "export", 3240 | "exporter" 3241 | ], 3242 | "time": "2017-04-03T13:19:02+00:00" 3243 | }, 3244 | { 3245 | "name": "sebastian/global-state", 3246 | "version": "2.0.0", 3247 | "source": { 3248 | "type": "git", 3249 | "url": "https://github.com/sebastianbergmann/global-state.git", 3250 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 3251 | }, 3252 | "dist": { 3253 | "type": "zip", 3254 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 3255 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 3256 | "shasum": "" 3257 | }, 3258 | "require": { 3259 | "php": "^7.0" 3260 | }, 3261 | "require-dev": { 3262 | "phpunit/phpunit": "^6.0" 3263 | }, 3264 | "suggest": { 3265 | "ext-uopz": "*" 3266 | }, 3267 | "type": "library", 3268 | "extra": { 3269 | "branch-alias": { 3270 | "dev-master": "2.0-dev" 3271 | } 3272 | }, 3273 | "autoload": { 3274 | "classmap": [ 3275 | "src/" 3276 | ] 3277 | }, 3278 | "notification-url": "https://packagist.org/downloads/", 3279 | "license": [ 3280 | "BSD-3-Clause" 3281 | ], 3282 | "authors": [ 3283 | { 3284 | "name": "Sebastian Bergmann", 3285 | "email": "sebastian@phpunit.de" 3286 | } 3287 | ], 3288 | "description": "Snapshotting of global state", 3289 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 3290 | "keywords": [ 3291 | "global state" 3292 | ], 3293 | "time": "2017-04-27T15:39:26+00:00" 3294 | }, 3295 | { 3296 | "name": "sebastian/object-enumerator", 3297 | "version": "3.0.3", 3298 | "source": { 3299 | "type": "git", 3300 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 3301 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 3302 | }, 3303 | "dist": { 3304 | "type": "zip", 3305 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 3306 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 3307 | "shasum": "" 3308 | }, 3309 | "require": { 3310 | "php": "^7.0", 3311 | "sebastian/object-reflector": "^1.1.1", 3312 | "sebastian/recursion-context": "^3.0" 3313 | }, 3314 | "require-dev": { 3315 | "phpunit/phpunit": "^6.0" 3316 | }, 3317 | "type": "library", 3318 | "extra": { 3319 | "branch-alias": { 3320 | "dev-master": "3.0.x-dev" 3321 | } 3322 | }, 3323 | "autoload": { 3324 | "classmap": [ 3325 | "src/" 3326 | ] 3327 | }, 3328 | "notification-url": "https://packagist.org/downloads/", 3329 | "license": [ 3330 | "BSD-3-Clause" 3331 | ], 3332 | "authors": [ 3333 | { 3334 | "name": "Sebastian Bergmann", 3335 | "email": "sebastian@phpunit.de" 3336 | } 3337 | ], 3338 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 3339 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 3340 | "time": "2017-08-03T12:35:26+00:00" 3341 | }, 3342 | { 3343 | "name": "sebastian/object-reflector", 3344 | "version": "1.1.1", 3345 | "source": { 3346 | "type": "git", 3347 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 3348 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 3349 | }, 3350 | "dist": { 3351 | "type": "zip", 3352 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 3353 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 3354 | "shasum": "" 3355 | }, 3356 | "require": { 3357 | "php": "^7.0" 3358 | }, 3359 | "require-dev": { 3360 | "phpunit/phpunit": "^6.0" 3361 | }, 3362 | "type": "library", 3363 | "extra": { 3364 | "branch-alias": { 3365 | "dev-master": "1.1-dev" 3366 | } 3367 | }, 3368 | "autoload": { 3369 | "classmap": [ 3370 | "src/" 3371 | ] 3372 | }, 3373 | "notification-url": "https://packagist.org/downloads/", 3374 | "license": [ 3375 | "BSD-3-Clause" 3376 | ], 3377 | "authors": [ 3378 | { 3379 | "name": "Sebastian Bergmann", 3380 | "email": "sebastian@phpunit.de" 3381 | } 3382 | ], 3383 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 3384 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 3385 | "time": "2017-03-29T09:07:27+00:00" 3386 | }, 3387 | { 3388 | "name": "sebastian/recursion-context", 3389 | "version": "3.0.0", 3390 | "source": { 3391 | "type": "git", 3392 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 3393 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 3394 | }, 3395 | "dist": { 3396 | "type": "zip", 3397 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 3398 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 3399 | "shasum": "" 3400 | }, 3401 | "require": { 3402 | "php": "^7.0" 3403 | }, 3404 | "require-dev": { 3405 | "phpunit/phpunit": "^6.0" 3406 | }, 3407 | "type": "library", 3408 | "extra": { 3409 | "branch-alias": { 3410 | "dev-master": "3.0.x-dev" 3411 | } 3412 | }, 3413 | "autoload": { 3414 | "classmap": [ 3415 | "src/" 3416 | ] 3417 | }, 3418 | "notification-url": "https://packagist.org/downloads/", 3419 | "license": [ 3420 | "BSD-3-Clause" 3421 | ], 3422 | "authors": [ 3423 | { 3424 | "name": "Jeff Welch", 3425 | "email": "whatthejeff@gmail.com" 3426 | }, 3427 | { 3428 | "name": "Sebastian Bergmann", 3429 | "email": "sebastian@phpunit.de" 3430 | }, 3431 | { 3432 | "name": "Adam Harvey", 3433 | "email": "aharvey@php.net" 3434 | } 3435 | ], 3436 | "description": "Provides functionality to recursively process PHP variables", 3437 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 3438 | "time": "2017-03-03T06:23:57+00:00" 3439 | }, 3440 | { 3441 | "name": "sebastian/resource-operations", 3442 | "version": "1.0.0", 3443 | "source": { 3444 | "type": "git", 3445 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 3446 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 3447 | }, 3448 | "dist": { 3449 | "type": "zip", 3450 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3451 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3452 | "shasum": "" 3453 | }, 3454 | "require": { 3455 | "php": ">=5.6.0" 3456 | }, 3457 | "type": "library", 3458 | "extra": { 3459 | "branch-alias": { 3460 | "dev-master": "1.0.x-dev" 3461 | } 3462 | }, 3463 | "autoload": { 3464 | "classmap": [ 3465 | "src/" 3466 | ] 3467 | }, 3468 | "notification-url": "https://packagist.org/downloads/", 3469 | "license": [ 3470 | "BSD-3-Clause" 3471 | ], 3472 | "authors": [ 3473 | { 3474 | "name": "Sebastian Bergmann", 3475 | "email": "sebastian@phpunit.de" 3476 | } 3477 | ], 3478 | "description": "Provides a list of PHP built-in functions that operate on resources", 3479 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3480 | "time": "2015-07-28T20:34:47+00:00" 3481 | }, 3482 | { 3483 | "name": "sebastian/version", 3484 | "version": "2.0.1", 3485 | "source": { 3486 | "type": "git", 3487 | "url": "https://github.com/sebastianbergmann/version.git", 3488 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 3489 | }, 3490 | "dist": { 3491 | "type": "zip", 3492 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 3493 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 3494 | "shasum": "" 3495 | }, 3496 | "require": { 3497 | "php": ">=5.6" 3498 | }, 3499 | "type": "library", 3500 | "extra": { 3501 | "branch-alias": { 3502 | "dev-master": "2.0.x-dev" 3503 | } 3504 | }, 3505 | "autoload": { 3506 | "classmap": [ 3507 | "src/" 3508 | ] 3509 | }, 3510 | "notification-url": "https://packagist.org/downloads/", 3511 | "license": [ 3512 | "BSD-3-Clause" 3513 | ], 3514 | "authors": [ 3515 | { 3516 | "name": "Sebastian Bergmann", 3517 | "email": "sebastian@phpunit.de", 3518 | "role": "lead" 3519 | } 3520 | ], 3521 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3522 | "homepage": "https://github.com/sebastianbergmann/version", 3523 | "time": "2016-10-03T07:35:21+00:00" 3524 | }, 3525 | { 3526 | "name": "symfony/console", 3527 | "version": "v3.3.13", 3528 | "source": { 3529 | "type": "git", 3530 | "url": "https://github.com/symfony/console.git", 3531 | "reference": "63cd7960a0a522c3537f6326706d7f3b8de65805" 3532 | }, 3533 | "dist": { 3534 | "type": "zip", 3535 | "url": "https://api.github.com/repos/symfony/console/zipball/63cd7960a0a522c3537f6326706d7f3b8de65805", 3536 | "reference": "63cd7960a0a522c3537f6326706d7f3b8de65805", 3537 | "shasum": "" 3538 | }, 3539 | "require": { 3540 | "php": "^5.5.9|>=7.0.8", 3541 | "symfony/debug": "~2.8|~3.0", 3542 | "symfony/polyfill-mbstring": "~1.0" 3543 | }, 3544 | "conflict": { 3545 | "symfony/dependency-injection": "<3.3" 3546 | }, 3547 | "require-dev": { 3548 | "psr/log": "~1.0", 3549 | "symfony/config": "~3.3", 3550 | "symfony/dependency-injection": "~3.3", 3551 | "symfony/event-dispatcher": "~2.8|~3.0", 3552 | "symfony/filesystem": "~2.8|~3.0", 3553 | "symfony/process": "~2.8|~3.0" 3554 | }, 3555 | "suggest": { 3556 | "psr/log": "For using the console logger", 3557 | "symfony/event-dispatcher": "", 3558 | "symfony/filesystem": "", 3559 | "symfony/process": "" 3560 | }, 3561 | "type": "library", 3562 | "extra": { 3563 | "branch-alias": { 3564 | "dev-master": "3.3-dev" 3565 | } 3566 | }, 3567 | "autoload": { 3568 | "psr-4": { 3569 | "Symfony\\Component\\Console\\": "" 3570 | }, 3571 | "exclude-from-classmap": [ 3572 | "/Tests/" 3573 | ] 3574 | }, 3575 | "notification-url": "https://packagist.org/downloads/", 3576 | "license": [ 3577 | "MIT" 3578 | ], 3579 | "authors": [ 3580 | { 3581 | "name": "Fabien Potencier", 3582 | "email": "fabien@symfony.com" 3583 | }, 3584 | { 3585 | "name": "Symfony Community", 3586 | "homepage": "https://symfony.com/contributors" 3587 | } 3588 | ], 3589 | "description": "Symfony Console Component", 3590 | "homepage": "https://symfony.com", 3591 | "time": "2017-11-16T15:24:32+00:00" 3592 | }, 3593 | { 3594 | "name": "symfony/options-resolver", 3595 | "version": "v3.3.13", 3596 | "source": { 3597 | "type": "git", 3598 | "url": "https://github.com/symfony/options-resolver.git", 3599 | "reference": "623d9c210a137205f7e6e98166105625402cbb2f" 3600 | }, 3601 | "dist": { 3602 | "type": "zip", 3603 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/623d9c210a137205f7e6e98166105625402cbb2f", 3604 | "reference": "623d9c210a137205f7e6e98166105625402cbb2f", 3605 | "shasum": "" 3606 | }, 3607 | "require": { 3608 | "php": "^5.5.9|>=7.0.8" 3609 | }, 3610 | "type": "library", 3611 | "extra": { 3612 | "branch-alias": { 3613 | "dev-master": "3.3-dev" 3614 | } 3615 | }, 3616 | "autoload": { 3617 | "psr-4": { 3618 | "Symfony\\Component\\OptionsResolver\\": "" 3619 | }, 3620 | "exclude-from-classmap": [ 3621 | "/Tests/" 3622 | ] 3623 | }, 3624 | "notification-url": "https://packagist.org/downloads/", 3625 | "license": [ 3626 | "MIT" 3627 | ], 3628 | "authors": [ 3629 | { 3630 | "name": "Fabien Potencier", 3631 | "email": "fabien@symfony.com" 3632 | }, 3633 | { 3634 | "name": "Symfony Community", 3635 | "homepage": "https://symfony.com/contributors" 3636 | } 3637 | ], 3638 | "description": "Symfony OptionsResolver Component", 3639 | "homepage": "https://symfony.com", 3640 | "keywords": [ 3641 | "config", 3642 | "configuration", 3643 | "options" 3644 | ], 3645 | "time": "2017-11-05T15:47:03+00:00" 3646 | }, 3647 | { 3648 | "name": "symfony/polyfill-php72", 3649 | "version": "v1.6.0", 3650 | "source": { 3651 | "type": "git", 3652 | "url": "https://github.com/symfony/polyfill-php72.git", 3653 | "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254" 3654 | }, 3655 | "dist": { 3656 | "type": "zip", 3657 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/6de4f4884b97abbbed9f0a84a95ff2ff77254254", 3658 | "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254", 3659 | "shasum": "" 3660 | }, 3661 | "require": { 3662 | "php": ">=5.3.3" 3663 | }, 3664 | "type": "library", 3665 | "extra": { 3666 | "branch-alias": { 3667 | "dev-master": "1.6-dev" 3668 | } 3669 | }, 3670 | "autoload": { 3671 | "psr-4": { 3672 | "Symfony\\Polyfill\\Php72\\": "" 3673 | }, 3674 | "files": [ 3675 | "bootstrap.php" 3676 | ] 3677 | }, 3678 | "notification-url": "https://packagist.org/downloads/", 3679 | "license": [ 3680 | "MIT" 3681 | ], 3682 | "authors": [ 3683 | { 3684 | "name": "Nicolas Grekas", 3685 | "email": "p@tchwork.com" 3686 | }, 3687 | { 3688 | "name": "Symfony Community", 3689 | "homepage": "https://symfony.com/contributors" 3690 | } 3691 | ], 3692 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 3693 | "homepage": "https://symfony.com", 3694 | "keywords": [ 3695 | "compatibility", 3696 | "polyfill", 3697 | "portable", 3698 | "shim" 3699 | ], 3700 | "time": "2017-10-11T12:05:26+00:00" 3701 | }, 3702 | { 3703 | "name": "symfony/process", 3704 | "version": "v3.3.13", 3705 | "source": { 3706 | "type": "git", 3707 | "url": "https://github.com/symfony/process.git", 3708 | "reference": "a56a3989fb762d7b19a0cf8e7693ee99a6ffb78d" 3709 | }, 3710 | "dist": { 3711 | "type": "zip", 3712 | "url": "https://api.github.com/repos/symfony/process/zipball/a56a3989fb762d7b19a0cf8e7693ee99a6ffb78d", 3713 | "reference": "a56a3989fb762d7b19a0cf8e7693ee99a6ffb78d", 3714 | "shasum": "" 3715 | }, 3716 | "require": { 3717 | "php": "^5.5.9|>=7.0.8" 3718 | }, 3719 | "type": "library", 3720 | "extra": { 3721 | "branch-alias": { 3722 | "dev-master": "3.3-dev" 3723 | } 3724 | }, 3725 | "autoload": { 3726 | "psr-4": { 3727 | "Symfony\\Component\\Process\\": "" 3728 | }, 3729 | "exclude-from-classmap": [ 3730 | "/Tests/" 3731 | ] 3732 | }, 3733 | "notification-url": "https://packagist.org/downloads/", 3734 | "license": [ 3735 | "MIT" 3736 | ], 3737 | "authors": [ 3738 | { 3739 | "name": "Fabien Potencier", 3740 | "email": "fabien@symfony.com" 3741 | }, 3742 | { 3743 | "name": "Symfony Community", 3744 | "homepage": "https://symfony.com/contributors" 3745 | } 3746 | ], 3747 | "description": "Symfony Process Component", 3748 | "homepage": "https://symfony.com", 3749 | "time": "2017-11-13T15:31:11+00:00" 3750 | }, 3751 | { 3752 | "name": "theseer/tokenizer", 3753 | "version": "1.1.0", 3754 | "source": { 3755 | "type": "git", 3756 | "url": "https://github.com/theseer/tokenizer.git", 3757 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 3758 | }, 3759 | "dist": { 3760 | "type": "zip", 3761 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 3762 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 3763 | "shasum": "" 3764 | }, 3765 | "require": { 3766 | "ext-dom": "*", 3767 | "ext-tokenizer": "*", 3768 | "ext-xmlwriter": "*", 3769 | "php": "^7.0" 3770 | }, 3771 | "type": "library", 3772 | "autoload": { 3773 | "classmap": [ 3774 | "src/" 3775 | ] 3776 | }, 3777 | "notification-url": "https://packagist.org/downloads/", 3778 | "license": [ 3779 | "BSD-3-Clause" 3780 | ], 3781 | "authors": [ 3782 | { 3783 | "name": "Arne Blankerts", 3784 | "email": "arne@blankerts.de", 3785 | "role": "Developer" 3786 | } 3787 | ], 3788 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3789 | "time": "2017-04-07T12:08:54+00:00" 3790 | }, 3791 | { 3792 | "name": "webmozart/assert", 3793 | "version": "1.2.0", 3794 | "source": { 3795 | "type": "git", 3796 | "url": "https://github.com/webmozart/assert.git", 3797 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 3798 | }, 3799 | "dist": { 3800 | "type": "zip", 3801 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 3802 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 3803 | "shasum": "" 3804 | }, 3805 | "require": { 3806 | "php": "^5.3.3 || ^7.0" 3807 | }, 3808 | "require-dev": { 3809 | "phpunit/phpunit": "^4.6", 3810 | "sebastian/version": "^1.0.1" 3811 | }, 3812 | "type": "library", 3813 | "extra": { 3814 | "branch-alias": { 3815 | "dev-master": "1.3-dev" 3816 | } 3817 | }, 3818 | "autoload": { 3819 | "psr-4": { 3820 | "Webmozart\\Assert\\": "src/" 3821 | } 3822 | }, 3823 | "notification-url": "https://packagist.org/downloads/", 3824 | "license": [ 3825 | "MIT" 3826 | ], 3827 | "authors": [ 3828 | { 3829 | "name": "Bernhard Schussek", 3830 | "email": "bschussek@gmail.com" 3831 | } 3832 | ], 3833 | "description": "Assertions to validate method input/output with nice error messages.", 3834 | "keywords": [ 3835 | "assert", 3836 | "check", 3837 | "validate" 3838 | ], 3839 | "time": "2016-11-23T20:04:58+00:00" 3840 | } 3841 | ], 3842 | "aliases": [], 3843 | "minimum-stability": "stable", 3844 | "stability-flags": [], 3845 | "prefer-stable": false, 3846 | "prefer-lowest": false, 3847 | "platform": { 3848 | "php": ">=7.0" 3849 | }, 3850 | "platform-dev": [] 3851 | } 3852 | --------------------------------------------------------------------------------