├── .gitignore ├── tests ├── bootstrap.php ├── common │ └── TestCase.php └── functional │ └── SilexApplicationTest.php ├── .travis.yml ├── phpunit.xml.dist ├── LICENSE ├── composer.json ├── examples └── simple.php ├── README.md ├── src └── Dflydev │ └── Stack │ └── BasicAuthentication.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | add('common', __DIR__); 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.4 5 | - 5.5 6 | 7 | before_script: 8 | - composer install 9 | 10 | script: vendor/bin/phpunit --coverage-text --verbose 11 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | ./tests/functional/ 10 | 11 | 12 | 13 | 14 | 15 | ./src/ 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/common/TestCase.php: -------------------------------------------------------------------------------- 1 | credentials = ['username1234', 'password1234', 'token1234']; 16 | } 17 | 18 | protected function basicify(HttpKernelInterface $app, array $config = []) 19 | { 20 | $config = array_merge([ 21 | 'authenticator' => function ($username = null, $password = null) { 22 | if ($this->credentials[0] === $username && $this->credentials[1] === $password) { 23 | return $this->credentials[2]; 24 | } 25 | } 26 | ], $config); 27 | 28 | return new BasicAuthentication($app, $config); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Dragonfly Development Inc. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is furnished 8 | to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dflydev/stack-basic-authentication", 3 | "description": "HTTP Basic Authentication Stack middleware", 4 | "keywords": ["stack", "stack-2", "authentication"], 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Dragonfly Development Inc.", 9 | "email": "info@dflydev.com", 10 | "homepage": "http://dflydev.com" 11 | }, 12 | { 13 | "name": "Beau Simensen", 14 | "email": "beau@dflydev.com", 15 | "homepage": "http://beausimensen.com" 16 | } 17 | ], 18 | "autoload": { 19 | "psr-0": { 20 | "Dflydev\\Stack": "src" 21 | } 22 | }, 23 | "require": { 24 | "php": ">=5.4.0", 25 | "dflydev/stack-authentication": "1.0.*@dev", 26 | "dflydev/stack-firewall": "1.0.*@dev", 27 | "symfony/http-foundation": "~2.1", 28 | "symfony/http-kernel": "~2.1", 29 | "pimple/pimple": " 1.*" 30 | }, 31 | "require-dev": { 32 | "phpunit/phpunit": "3.7.21", 33 | "silex/silex": "1.1.*@dev", 34 | "stack/builder": "~1.0@dev", 35 | "stack/callable-http-kernel": "~1.0@dev", 36 | "stack/inline": "~1.0@dev", 37 | "symfony/browser-kit": "~2.1" 38 | }, 39 | "extra": { 40 | "branch-alias": { 41 | "dev-master": "1.0-dev" 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /examples/simple.php: -------------------------------------------------------------------------------- 1 | register(new Silex\Provider\UrlGeneratorServiceProvider()); 10 | 11 | $app['debug'] = true; 12 | $app['env'] = 'dev'; 13 | 14 | $app->get('/', function (Request $request) use ($app) { 15 | $output = 'Hello!'; 16 | if ($request->attributes->has('stack.authn.token')) { 17 | $output .= ' Your token is '. $request->attributes->get('stack.authn.token'); 18 | } else { 19 | $output .= ' Login'; 20 | } 21 | 22 | return $output; 23 | })->bind('home'); 24 | 25 | $app->get('/login', function (Request $request) use ($app) { 26 | return $app->redirect($app['url_generator']->generate('home')); 27 | })->bind('login'); 28 | 29 | $app = (new Stack\Builder()) 30 | ->push('Dflydev\Stack\BasicAuthentication', [ 31 | 'firewall' => [ 32 | ['path' => '/', 'anonymous' => true], 33 | ['path' => '/login'], 34 | ], 35 | 'authenticator' => function ($username, $password) { 36 | if ('admin' === $username && 'default' === $password) { 37 | return 'admin-user-token'; 38 | } 39 | }, 40 | 'realm' => 'here there be dragons', 41 | ]) 42 | ->resolve($app); 43 | 44 | $request = Request::createFromGlobals(); 45 | $response = $app->handle($request)->send(); 46 | $app->terminate($request, $response); 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | HTTP Basic Authentication Stack Middleware 2 | ========================================== 3 | 4 | A [Stack][0] middleware to enable [HTTP Basic Authentication][1] following the 5 | [STACK-2 Authentication][2] conventions. 6 | 7 | 8 | Installation 9 | ------------ 10 | 11 | Through [Composer][3] as [dflydev/stack-basic-authentication][4]. 12 | 13 | 14 | Usage 15 | ----- 16 | 17 | The BasicAuthentication middleware accepts the following options: 18 | 19 | * **authenticator**: *(required)* A callback used to ensure that the specified 20 | credentials are correct. 21 | * **realm**: The HTTP Basic Authentication realm as defined by [RFC1945][5]. 22 | * **firewall**: A firewall configuration compatible with 23 | [dflydev/stack-firewall][6]. 24 | 25 | ```php 26 | [ 39 | ['path' => '/', 'anonymous' => true], 40 | ['path' => '/login'], 41 | ], 42 | 'authenticator' => $authenticator, 43 | 'realm' => 'here there be dragons', 44 | ]); 45 | ``` 46 | 47 | Examples 48 | -------- 49 | 50 | See the `examples/` directory for some live examples of this middleware in 51 | action. 52 | 53 | 54 | License 55 | ------- 56 | 57 | MIT, see LICENSE. 58 | 59 | 60 | Community 61 | --------- 62 | 63 | If you have questions or want to help out, join us in the **#stackphp** or **#dflydev** channels on **irc.freenode.net**. 64 | 65 | 66 | [0]: http://stackphp.com/ 67 | [1]: http://en.wikipedia.org/wiki/Basic_access_authentication 68 | [2]: http://stackphp.com/specs/STACK-2/ 69 | [3]: http://getcomposer.org 70 | [4]: https://packagist.org/packages/dflydev/stack-basic-authentication 71 | [5]: http://tools.ietf.org/html/rfc1945#section-11 72 | [6]: https://packagist.org/packages/dflydev/stack-firewall 73 | -------------------------------------------------------------------------------- /src/Dflydev/Stack/BasicAuthentication.php: -------------------------------------------------------------------------------- 1 | app = $app; 18 | $this->container = $this->setupContainer($options); 19 | } 20 | 21 | public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) 22 | { 23 | // The challenge callback is called if a 401 response is detected that 24 | // has a "WWW-Authenticate: Stack" header. This is per the Stack 25 | // Authentication and Authorization proposals. It is passed the existing 26 | // response object. 27 | $challenge = function (Response $response) { 28 | $parts = ['Basic']; 29 | if (isset($this->container['realm'])) { 30 | $parts[] = 'realm="'.$this->container['realm'].'"'; 31 | } 32 | 33 | $response->headers->set('WWW-Authenticate', implode(' ', $parts)); 34 | 35 | return $response; 36 | }; 37 | 38 | // The authenticate callback is called if the request has no Stack 39 | // authentication token but there is an authorization header. It is 40 | // passed an app we should delegate to (assuming we do not return 41 | // beforehand) and a boolean value indicating whether or not anonymous 42 | // requests should be allowed. 43 | $authenticate = function ($app, $anonymous) use ($request, $type, $catch, $challenge) { 44 | if (false === $username = $request->headers->get('PHP_AUTH_USER', false)) { 45 | if ($anonymous) { 46 | // This is not a Basic Auth request but the firewall allows 47 | // anonymous requests so we should wrap the application 48 | // so that we might be able to challenge if authorization 49 | // fails. 50 | return (new WwwAuthenticateStackChallenge($app, $challenge)) 51 | ->handle($request, $type, $catch); 52 | } 53 | 54 | // Anonymous requests are not allowed so we should challenge 55 | // immediately. 56 | return call_user_func($challenge, (new Response)->setStatusCode(401)); 57 | } 58 | 59 | $token = $this->container['authenticator']($username, $request->headers->get('PHP_AUTH_PW')); 60 | 61 | if (null === $token) { 62 | if ($anonymous) { 63 | // Authentication faild but anonymous requests are allowed 64 | // so we will pass this on. If authorization fails, we have 65 | // wrapped the app in a challenge middleware that will let 66 | // us challenge for basic auth. 67 | return (new WwwAuthenticateStackChallenge($app, $challenge)) 68 | ->handle($request, $type, $catch); 69 | } 70 | 71 | // We should challenge immediately if anonymous requests are not 72 | // allowed. 73 | return call_user_func($challenge, (new Response)->setStatusCode(401)); 74 | } 75 | 76 | $request->attributes->set('stack.authn.token', $token); 77 | 78 | return $app->handle($request, $type, $catch); 79 | }; 80 | 81 | return (new Firewall($this->app, [ 82 | 'challenge' => $challenge, 83 | 'authenticate' => $authenticate, 84 | 'firewall' => $this->container['firewall'], 85 | ])) 86 | ->handle($request, $type, $catch); 87 | } 88 | 89 | private function setupContainer(array $options = array()) 90 | { 91 | if (!isset($options['authenticator'])) { 92 | throw new \InvalidArgumentException( 93 | "The 'authenticator' service must be set" 94 | ); 95 | } 96 | 97 | $c = new Pimple([ 98 | 'firewall' => [], 99 | ]); 100 | 101 | foreach ($options as $name => $value) { 102 | if (in_array($name, ['authenticator'])) { 103 | $c[$name] = $c->protect($value); 104 | 105 | continue; 106 | } 107 | 108 | $c[$name] = $value; 109 | } 110 | 111 | return $c; 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /tests/functional/SilexApplicationTest.php: -------------------------------------------------------------------------------- 1 | basicify($this->createTestApp(), ['firewall' => [ 20 | ['path' => '/', 'anonymous' => true], 21 | ]]); 22 | 23 | $client = new Client($app); 24 | 25 | $client->request('GET', '/'); 26 | $this->assertEquals('Root.', $client->getResponse()->getContent()); 27 | } 28 | 29 | /** @test */ 30 | public function shouldChallengeForProtectedResourceNoHeader() 31 | { 32 | $app = $this->basicify($this->createTestApp(), ['firewall' => [ 33 | ['path' => '/', 'anonymous' => true], 34 | ]]); 35 | 36 | $client = new Client($app); 37 | 38 | $client->request('GET', '/protected/resource'); 39 | $this->assertEquals(401, $client->getResponse()->getStatusCode()); 40 | $this->assertEquals('Basic', $client->getResponse()->headers->get('www-authenticate')); 41 | } 42 | 43 | /** @test */ 44 | public function shouldChallengeWithExpectedRealm() 45 | { 46 | $app = $this->basicify($this->createTestApp(), ['realm' => 'here there be dragons']); 47 | 48 | $client = new Client($app); 49 | 50 | $client->request('GET', '/protected/resource'); 51 | $this->assertEquals(401, $client->getResponse()->getStatusCode()); 52 | $this->assertEquals('Basic realm="here there be dragons"', $client->getResponse()->headers->get('www-authenticate')); 53 | } 54 | 55 | /** @test */ 56 | public function shouldGetExpectedToken() 57 | { 58 | $app = $this->basicify($this->createTestApp()); 59 | 60 | $client = new Client($app); 61 | 62 | $client->request('GET', '/protected/token', [], [], [ 63 | 'PHP_AUTH_USER' => $this->credentials[0], 64 | 'PHP_AUTH_PW' => $this->credentials[1], 65 | ]); 66 | 67 | $this->assertEquals($this->credentials[2], $client->getResponse()->getContent()); 68 | } 69 | 70 | /** 71 | * @test 72 | * @dataProvider protectedAndUnprotectedResources 73 | */ 74 | public function shouldAllowAccessToResource($resource, $expectedContent) 75 | { 76 | $app = $this->basicify($this->createTestApp()); 77 | 78 | $client = new Client($app); 79 | 80 | $client->request('GET', $resource, [], [], [ 81 | 'PHP_AUTH_USER' => $this->credentials[0], 82 | 'PHP_AUTH_PW' => $this->credentials[1], 83 | ]); 84 | 85 | $this->assertEquals($expectedContent, $client->getResponse()->getContent()); 86 | } 87 | 88 | /** @test */ 89 | public function shouldNotClobberExistingToken() 90 | { 91 | $authnMiddleware = function( 92 | HttpKernelInterface $app, 93 | Request $request, 94 | $type = HttpKernelInterface::MASTER_REQUEST, 95 | $catch = true 96 | ) { 97 | // We are going to claim that we authenticated... 98 | $request->attributes->set('stack.authn.token', 'foo'); 99 | 100 | // Hawk should actually capture the WWW-Authenticate: Stack response 101 | // and challenge on its own. 102 | return $app->handle($request, $type, $catch); 103 | }; 104 | 105 | $app = new Inline($this->basicify($this->createTestApp()), $authnMiddleware); 106 | 107 | $client = new Client($app); 108 | 109 | $client->request('GET', '/protected/token'); 110 | $this->assertEquals('foo', $client->getResponse()->getContent()); 111 | } 112 | 113 | /** @test */ 114 | public function shouldChallengeOnAuthorizationEvenIfOtherMiddlewareAuthenticated() 115 | { 116 | $authnMiddleware = function( 117 | HttpKernelInterface $app, 118 | Request $request, 119 | $type = HttpKernelInterface::MASTER_REQUEST, 120 | $catch = true 121 | ) { 122 | // We are going to claim that we authenticated... 123 | $request->attributes->set('stack.authn.token', 'foo'); 124 | 125 | // Hawk should actually capture the WWW-Authenticate: Stack response 126 | // and challenge on its own. 127 | return $app->handle($request, $type, $catch); 128 | }; 129 | 130 | $authzMiddleware = function( 131 | HttpKernelInterface $app, 132 | Request $request, 133 | $type = HttpKernelInterface::MASTER_REQUEST, 134 | $catch = true 135 | ) { 136 | // Simulate Authorization failure by returning 401 status 137 | // code with WWW-Authenticate: Stack. 138 | $response = (new Response)->setStatusCode(401); 139 | $response->headers->set('WWW-Authenticate', 'Stack'); 140 | return $response; 141 | }; 142 | 143 | $app = new Inline($this->basicify(new Inline($this->createTestApp(), $authzMiddleware)), $authnMiddleware); 144 | 145 | $client = new Client($app); 146 | 147 | $client->request('GET', '/protected/token'); 148 | $this->assertEquals(401, $client->getResponse()->getStatusCode()); 149 | $this->assertEquals('Basic', $client->getResponse()->headers->get('www-authenticate')); 150 | } 151 | 152 | protected function createTestApp() 153 | { 154 | $app = new Application; 155 | $app['exception_handler']->disable(); 156 | 157 | $app->get('/', function () { 158 | return 'Root.'; 159 | }); 160 | 161 | $app->get('/protected/resource', function () { 162 | return 'Protected Resource.'; 163 | }); 164 | 165 | $app->get('/protected/token', function (Request $request) { 166 | return $request->attributes->get('stack.authn.token'); 167 | }); 168 | 169 | // Simple Silex middleware to always let certain requests go through 170 | // and to always throw 401 responses in all other cases *unless* 171 | // stack.authn.token has been set correctly. 172 | $app->before(function (Request $request) { 173 | if (in_array($request->getRequestUri(), array('/'))) { 174 | return; 175 | } 176 | 177 | if (!$request->attributes->has('stack.authn.token')) { 178 | $response = (new Response)->setStatusCode(401); 179 | $response->headers->set('WWW-Authenticate', 'Stack'); 180 | 181 | return $response; 182 | } 183 | }); 184 | 185 | return $app; 186 | } 187 | 188 | public function protectedAndUnprotectedResources() 189 | { 190 | return [ 191 | ['/', 'Root.'], 192 | ['/protected/resource', 'Protected Resource.'], 193 | ]; 194 | } 195 | } 196 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "hash": "f5fdb2a3c85775f674472b0148cd78ea", 8 | "packages": [ 9 | { 10 | "name": "dflydev/stack-authentication", 11 | "version": "dev-master", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/dflydev/dflydev-stack-authentication.git", 15 | "reference": "d50425d672755b35d3b94ff546bd2b5510425554" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/dflydev/dflydev-stack-authentication/zipball/d50425d672755b35d3b94ff546bd2b5510425554", 20 | "reference": "d50425d672755b35d3b94ff546bd2b5510425554", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.4.0", 25 | "symfony/http-foundation": "~2.1", 26 | "symfony/http-kernel": "~2.1" 27 | }, 28 | "require-dev": { 29 | "phpunit/phpunit": "3.7.21", 30 | "silex/silex": "1.1.*@dev", 31 | "stack/builder": "~1.0@dev", 32 | "stack/callable-http-kernel": "~1.0@dev", 33 | "stack/inline": "~1.0@dev", 34 | "symfony/browser-kit": "~2.1" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "1.0-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "psr-0": { 44 | "Dflydev\\Stack": "src" 45 | } 46 | }, 47 | "notification-url": "https://packagist.org/downloads/", 48 | "license": [ 49 | "MIT" 50 | ], 51 | "authors": [ 52 | { 53 | "name": "Dragonfly Development Inc.", 54 | "email": "info@dflydev.com", 55 | "homepage": "http://dflydev.com" 56 | }, 57 | { 58 | "name": "Beau Simensen", 59 | "email": "beau@dflydev.com", 60 | "homepage": "http://beausimensen.com" 61 | } 62 | ], 63 | "description": "STACK-2 Authentication Middlewares", 64 | "keywords": [ 65 | "stack", 66 | "stack-2" 67 | ], 68 | "time": "2013-08-02 03:27:21" 69 | }, 70 | { 71 | "name": "dflydev/stack-firewall", 72 | "version": "dev-master", 73 | "source": { 74 | "type": "git", 75 | "url": "https://github.com/dflydev/dflydev-stack-firewall.git", 76 | "reference": "f9dcdc7a63fc2ac3e456f499e2c156d1b0dbbf9d" 77 | }, 78 | "dist": { 79 | "type": "zip", 80 | "url": "https://api.github.com/repos/dflydev/dflydev-stack-firewall/zipball/f9dcdc7a63fc2ac3e456f499e2c156d1b0dbbf9d", 81 | "reference": "f9dcdc7a63fc2ac3e456f499e2c156d1b0dbbf9d", 82 | "shasum": "" 83 | }, 84 | "require": { 85 | "dflydev/stack-authentication": "1.0.*@dev", 86 | "php": ">=5.4.0", 87 | "symfony/http-foundation": "~2.1", 88 | "symfony/http-kernel": "~2.1" 89 | }, 90 | "require-dev": { 91 | "phpunit/phpunit": "3.7.21", 92 | "silex/silex": "1.1.*@dev", 93 | "stack/builder": "~1.0@dev", 94 | "stack/callable-http-kernel": "~1.0@dev", 95 | "stack/inline": "~1.0@dev", 96 | "symfony/browser-kit": "~2.1" 97 | }, 98 | "type": "library", 99 | "extra": { 100 | "branch-alias": { 101 | "dev-master": "1.0-dev" 102 | } 103 | }, 104 | "autoload": { 105 | "psr-0": { 106 | "Dflydev\\Stack": "src" 107 | } 108 | }, 109 | "notification-url": "https://packagist.org/downloads/", 110 | "license": [ 111 | "MIT" 112 | ], 113 | "authors": [ 114 | { 115 | "name": "Dragonfly Development Inc.", 116 | "email": "info@dflydev.com", 117 | "homepage": "http://dflydev.com" 118 | }, 119 | { 120 | "name": "Beau Simensen", 121 | "email": "beau@dflydev.com", 122 | "homepage": "http://beausimensen.com" 123 | } 124 | ], 125 | "description": "Firewall Stack middleware", 126 | "keywords": [ 127 | "stack", 128 | "stack-2" 129 | ], 130 | "time": "2013-08-02 02:37:55" 131 | }, 132 | { 133 | "name": "pimple/pimple", 134 | "version": "v1.1.1", 135 | "source": { 136 | "type": "git", 137 | "url": "https://github.com/silexphp/Pimple.git", 138 | "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" 139 | }, 140 | "dist": { 141 | "type": "zip", 142 | "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", 143 | "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", 144 | "shasum": "" 145 | }, 146 | "require": { 147 | "php": ">=5.3.0" 148 | }, 149 | "type": "library", 150 | "extra": { 151 | "branch-alias": { 152 | "dev-master": "1.1.x-dev" 153 | } 154 | }, 155 | "autoload": { 156 | "psr-0": { 157 | "Pimple": "lib/" 158 | } 159 | }, 160 | "notification-url": "https://packagist.org/downloads/", 161 | "license": [ 162 | "MIT" 163 | ], 164 | "authors": [ 165 | { 166 | "name": "Fabien Potencier", 167 | "email": "fabien@symfony.com" 168 | } 169 | ], 170 | "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", 171 | "homepage": "http://pimple.sensiolabs.org", 172 | "keywords": [ 173 | "container", 174 | "dependency injection" 175 | ], 176 | "time": "2013-11-22 08:30:29" 177 | }, 178 | { 179 | "name": "psr/log", 180 | "version": "1.0.0", 181 | "source": { 182 | "type": "git", 183 | "url": "https://github.com/php-fig/log", 184 | "reference": "1.0.0" 185 | }, 186 | "dist": { 187 | "type": "zip", 188 | "url": "https://github.com/php-fig/log/archive/1.0.0.zip", 189 | "reference": "1.0.0", 190 | "shasum": "" 191 | }, 192 | "type": "library", 193 | "autoload": { 194 | "psr-0": { 195 | "Psr\\Log\\": "" 196 | } 197 | }, 198 | "notification-url": "https://packagist.org/downloads/", 199 | "license": [ 200 | "MIT" 201 | ], 202 | "authors": [ 203 | { 204 | "name": "PHP-FIG", 205 | "homepage": "http://www.php-fig.org/" 206 | } 207 | ], 208 | "description": "Common interface for logging libraries", 209 | "keywords": [ 210 | "log", 211 | "psr", 212 | "psr-3" 213 | ], 214 | "time": "2012-12-21 11:40:51" 215 | }, 216 | { 217 | "name": "symfony/debug", 218 | "version": "v2.3.2", 219 | "target-dir": "Symfony/Component/Debug", 220 | "source": { 221 | "type": "git", 222 | "url": "https://github.com/symfony/Debug.git", 223 | "reference": "v2.3.2" 224 | }, 225 | "dist": { 226 | "type": "zip", 227 | "url": "https://api.github.com/repos/symfony/Debug/zipball/v2.3.2", 228 | "reference": "v2.3.2", 229 | "shasum": "" 230 | }, 231 | "require": { 232 | "php": ">=5.3.3" 233 | }, 234 | "require-dev": { 235 | "symfony/http-foundation": "~2.1", 236 | "symfony/http-kernel": "~2.1" 237 | }, 238 | "suggest": { 239 | "symfony/class-loader": "", 240 | "symfony/http-foundation": "", 241 | "symfony/http-kernel": "" 242 | }, 243 | "type": "library", 244 | "extra": { 245 | "branch-alias": { 246 | "dev-master": "2.3-dev" 247 | } 248 | }, 249 | "autoload": { 250 | "psr-0": { 251 | "Symfony\\Component\\Debug\\": "" 252 | } 253 | }, 254 | "notification-url": "https://packagist.org/downloads/", 255 | "license": [ 256 | "MIT" 257 | ], 258 | "authors": [ 259 | { 260 | "name": "Fabien Potencier", 261 | "email": "fabien@symfony.com" 262 | }, 263 | { 264 | "name": "Symfony Community", 265 | "homepage": "http://symfony.com/contributors" 266 | } 267 | ], 268 | "description": "Symfony Debug Component", 269 | "homepage": "http://symfony.com", 270 | "time": "2013-07-01 12:24:43" 271 | }, 272 | { 273 | "name": "symfony/event-dispatcher", 274 | "version": "v2.3.2", 275 | "target-dir": "Symfony/Component/EventDispatcher", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/symfony/EventDispatcher.git", 279 | "reference": "v2.3.2" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/v2.3.2", 284 | "reference": "v2.3.2", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "php": ">=5.3.3" 289 | }, 290 | "require-dev": { 291 | "symfony/dependency-injection": "~2.0" 292 | }, 293 | "suggest": { 294 | "symfony/dependency-injection": "", 295 | "symfony/http-kernel": "" 296 | }, 297 | "type": "library", 298 | "extra": { 299 | "branch-alias": { 300 | "dev-master": "2.3-dev" 301 | } 302 | }, 303 | "autoload": { 304 | "psr-0": { 305 | "Symfony\\Component\\EventDispatcher\\": "" 306 | } 307 | }, 308 | "notification-url": "https://packagist.org/downloads/", 309 | "license": [ 310 | "MIT" 311 | ], 312 | "authors": [ 313 | { 314 | "name": "Fabien Potencier", 315 | "email": "fabien@symfony.com" 316 | }, 317 | { 318 | "name": "Symfony Community", 319 | "homepage": "http://symfony.com/contributors" 320 | } 321 | ], 322 | "description": "Symfony EventDispatcher Component", 323 | "homepage": "http://symfony.com", 324 | "time": "2013-05-13 14:36:40" 325 | }, 326 | { 327 | "name": "symfony/http-foundation", 328 | "version": "v2.3.2", 329 | "target-dir": "Symfony/Component/HttpFoundation", 330 | "source": { 331 | "type": "git", 332 | "url": "https://github.com/symfony/HttpFoundation.git", 333 | "reference": "v2.3.2" 334 | }, 335 | "dist": { 336 | "type": "zip", 337 | "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/v2.3.2", 338 | "reference": "v2.3.2", 339 | "shasum": "" 340 | }, 341 | "require": { 342 | "php": ">=5.3.3" 343 | }, 344 | "type": "library", 345 | "extra": { 346 | "branch-alias": { 347 | "dev-master": "2.3-dev" 348 | } 349 | }, 350 | "autoload": { 351 | "psr-0": { 352 | "Symfony\\Component\\HttpFoundation\\": "" 353 | }, 354 | "classmap": [ 355 | "Symfony/Component/HttpFoundation/Resources/stubs" 356 | ] 357 | }, 358 | "notification-url": "https://packagist.org/downloads/", 359 | "license": [ 360 | "MIT" 361 | ], 362 | "authors": [ 363 | { 364 | "name": "Fabien Potencier", 365 | "email": "fabien@symfony.com" 366 | }, 367 | { 368 | "name": "Symfony Community", 369 | "homepage": "http://symfony.com/contributors" 370 | } 371 | ], 372 | "description": "Symfony HttpFoundation Component", 373 | "homepage": "http://symfony.com", 374 | "time": "2013-07-17 05:57:53" 375 | }, 376 | { 377 | "name": "symfony/http-kernel", 378 | "version": "v2.3.2", 379 | "target-dir": "Symfony/Component/HttpKernel", 380 | "source": { 381 | "type": "git", 382 | "url": "https://github.com/symfony/HttpKernel.git", 383 | "reference": "v2.3.2" 384 | }, 385 | "dist": { 386 | "type": "zip", 387 | "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/v2.3.2", 388 | "reference": "v2.3.2", 389 | "shasum": "" 390 | }, 391 | "require": { 392 | "php": ">=5.3.3", 393 | "psr/log": "~1.0", 394 | "symfony/debug": "~2.3", 395 | "symfony/event-dispatcher": "~2.1", 396 | "symfony/http-foundation": "~2.2" 397 | }, 398 | "require-dev": { 399 | "symfony/browser-kit": "2.2.*", 400 | "symfony/class-loader": "~2.1", 401 | "symfony/config": "~2.0", 402 | "symfony/console": "2.2.*", 403 | "symfony/dependency-injection": "~2.0", 404 | "symfony/finder": "~2.0", 405 | "symfony/process": "~2.0", 406 | "symfony/routing": "~2.2", 407 | "symfony/stopwatch": "~2.2" 408 | }, 409 | "suggest": { 410 | "symfony/browser-kit": "", 411 | "symfony/class-loader": "", 412 | "symfony/config": "", 413 | "symfony/console": "", 414 | "symfony/dependency-injection": "", 415 | "symfony/finder": "" 416 | }, 417 | "type": "library", 418 | "extra": { 419 | "branch-alias": { 420 | "dev-master": "2.3-dev" 421 | } 422 | }, 423 | "autoload": { 424 | "psr-0": { 425 | "Symfony\\Component\\HttpKernel\\": "" 426 | } 427 | }, 428 | "notification-url": "https://packagist.org/downloads/", 429 | "license": [ 430 | "MIT" 431 | ], 432 | "authors": [ 433 | { 434 | "name": "Fabien Potencier", 435 | "email": "fabien@symfony.com" 436 | }, 437 | { 438 | "name": "Symfony Community", 439 | "homepage": "http://symfony.com/contributors" 440 | } 441 | ], 442 | "description": "Symfony HttpKernel Component", 443 | "homepage": "http://symfony.com", 444 | "time": "2013-07-17 06:22:21" 445 | } 446 | ], 447 | "packages-dev": [ 448 | { 449 | "name": "phpunit/php-code-coverage", 450 | "version": "1.2.12", 451 | "source": { 452 | "type": "git", 453 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 454 | "reference": "1.2.12" 455 | }, 456 | "dist": { 457 | "type": "zip", 458 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1.2.12", 459 | "reference": "1.2.12", 460 | "shasum": "" 461 | }, 462 | "require": { 463 | "php": ">=5.3.3", 464 | "phpunit/php-file-iterator": ">=1.3.0@stable", 465 | "phpunit/php-text-template": ">=1.1.1@stable", 466 | "phpunit/php-token-stream": ">=1.1.3@stable" 467 | }, 468 | "require-dev": { 469 | "phpunit/phpunit": "3.7.*@dev" 470 | }, 471 | "suggest": { 472 | "ext-dom": "*", 473 | "ext-xdebug": ">=2.0.5" 474 | }, 475 | "type": "library", 476 | "extra": { 477 | "branch-alias": { 478 | "dev-master": "1.2.x-dev" 479 | } 480 | }, 481 | "autoload": { 482 | "classmap": [ 483 | "PHP/" 484 | ] 485 | }, 486 | "notification-url": "https://packagist.org/downloads/", 487 | "include-path": [ 488 | "" 489 | ], 490 | "license": [ 491 | "BSD-3-Clause" 492 | ], 493 | "authors": [ 494 | { 495 | "name": "Sebastian Bergmann", 496 | "email": "sb@sebastian-bergmann.de", 497 | "role": "lead" 498 | } 499 | ], 500 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 501 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 502 | "keywords": [ 503 | "coverage", 504 | "testing", 505 | "xunit" 506 | ], 507 | "time": "2013-07-06 06:26:16" 508 | }, 509 | { 510 | "name": "phpunit/php-file-iterator", 511 | "version": "1.3.3", 512 | "source": { 513 | "type": "git", 514 | "url": "git://github.com/sebastianbergmann/php-file-iterator.git", 515 | "reference": "1.3.3" 516 | }, 517 | "dist": { 518 | "type": "zip", 519 | "url": "https://github.com/sebastianbergmann/php-file-iterator/zipball/1.3.3", 520 | "reference": "1.3.3", 521 | "shasum": "" 522 | }, 523 | "require": { 524 | "php": ">=5.3.3" 525 | }, 526 | "type": "library", 527 | "autoload": { 528 | "classmap": [ 529 | "File/" 530 | ] 531 | }, 532 | "notification-url": "https://packagist.org/downloads/", 533 | "include-path": [ 534 | "" 535 | ], 536 | "license": [ 537 | "BSD-3-Clause" 538 | ], 539 | "authors": [ 540 | { 541 | "name": "Sebastian Bergmann", 542 | "email": "sb@sebastian-bergmann.de", 543 | "role": "lead" 544 | } 545 | ], 546 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 547 | "homepage": "http://www.phpunit.de/", 548 | "keywords": [ 549 | "filesystem", 550 | "iterator" 551 | ], 552 | "time": "2012-10-11 04:44:38" 553 | }, 554 | { 555 | "name": "phpunit/php-text-template", 556 | "version": "1.1.4", 557 | "source": { 558 | "type": "git", 559 | "url": "git://github.com/sebastianbergmann/php-text-template.git", 560 | "reference": "1.1.4" 561 | }, 562 | "dist": { 563 | "type": "zip", 564 | "url": "https://github.com/sebastianbergmann/php-text-template/zipball/1.1.4", 565 | "reference": "1.1.4", 566 | "shasum": "" 567 | }, 568 | "require": { 569 | "php": ">=5.3.3" 570 | }, 571 | "type": "library", 572 | "autoload": { 573 | "classmap": [ 574 | "Text/" 575 | ] 576 | }, 577 | "notification-url": "https://packagist.org/downloads/", 578 | "include-path": [ 579 | "" 580 | ], 581 | "license": [ 582 | "BSD-3-Clause" 583 | ], 584 | "authors": [ 585 | { 586 | "name": "Sebastian Bergmann", 587 | "email": "sb@sebastian-bergmann.de", 588 | "role": "lead" 589 | } 590 | ], 591 | "description": "Simple template engine.", 592 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 593 | "keywords": [ 594 | "template" 595 | ], 596 | "time": "2012-10-31 11:15:28" 597 | }, 598 | { 599 | "name": "phpunit/php-timer", 600 | "version": "1.0.4", 601 | "source": { 602 | "type": "git", 603 | "url": "git://github.com/sebastianbergmann/php-timer.git", 604 | "reference": "1.0.4" 605 | }, 606 | "dist": { 607 | "type": "zip", 608 | "url": "https://github.com/sebastianbergmann/php-timer/zipball/1.0.4", 609 | "reference": "1.0.4", 610 | "shasum": "" 611 | }, 612 | "require": { 613 | "php": ">=5.3.3" 614 | }, 615 | "type": "library", 616 | "autoload": { 617 | "classmap": [ 618 | "PHP/" 619 | ] 620 | }, 621 | "notification-url": "https://packagist.org/downloads/", 622 | "include-path": [ 623 | "" 624 | ], 625 | "license": [ 626 | "BSD-3-Clause" 627 | ], 628 | "authors": [ 629 | { 630 | "name": "Sebastian Bergmann", 631 | "email": "sb@sebastian-bergmann.de", 632 | "role": "lead" 633 | } 634 | ], 635 | "description": "Utility class for timing", 636 | "homepage": "http://www.phpunit.de/", 637 | "keywords": [ 638 | "timer" 639 | ], 640 | "time": "2012-10-11 04:45:58" 641 | }, 642 | { 643 | "name": "phpunit/php-token-stream", 644 | "version": "1.1.7", 645 | "source": { 646 | "type": "git", 647 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 648 | "reference": "1.1.7" 649 | }, 650 | "dist": { 651 | "type": "zip", 652 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1.1.7", 653 | "reference": "1.1.7", 654 | "shasum": "" 655 | }, 656 | "require": { 657 | "ext-tokenizer": "*", 658 | "php": ">=5.3.3" 659 | }, 660 | "type": "library", 661 | "autoload": { 662 | "classmap": [ 663 | "PHP/" 664 | ] 665 | }, 666 | "notification-url": "https://packagist.org/downloads/", 667 | "include-path": [ 668 | "" 669 | ], 670 | "license": [ 671 | "BSD-3-Clause" 672 | ], 673 | "authors": [ 674 | { 675 | "name": "Sebastian Bergmann", 676 | "email": "sb@sebastian-bergmann.de", 677 | "role": "lead" 678 | } 679 | ], 680 | "description": "Wrapper around PHP's tokenizer extension.", 681 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 682 | "keywords": [ 683 | "tokenizer" 684 | ], 685 | "time": "2013-07-29 14:27:06" 686 | }, 687 | { 688 | "name": "phpunit/phpunit", 689 | "version": "3.7.21", 690 | "source": { 691 | "type": "git", 692 | "url": "https://github.com/sebastianbergmann/phpunit.git", 693 | "reference": "3.7.21" 694 | }, 695 | "dist": { 696 | "type": "zip", 697 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3.7.21", 698 | "reference": "3.7.21", 699 | "shasum": "" 700 | }, 701 | "require": { 702 | "ext-dom": "*", 703 | "ext-pcre": "*", 704 | "ext-reflection": "*", 705 | "ext-spl": "*", 706 | "php": ">=5.3.3", 707 | "phpunit/php-code-coverage": ">=1.2.1,<1.3.0", 708 | "phpunit/php-file-iterator": ">=1.3.1", 709 | "phpunit/php-text-template": ">=1.1.1", 710 | "phpunit/php-timer": ">=1.0.2,<1.1.0", 711 | "phpunit/phpunit-mock-objects": ">=1.2.0,<1.3.0", 712 | "symfony/yaml": ">=2.0,<3.0" 713 | }, 714 | "require-dev": { 715 | "pear-pear/pear": "1.9.4" 716 | }, 717 | "suggest": { 718 | "ext-json": "*", 719 | "ext-simplexml": "*", 720 | "ext-tokenizer": "*", 721 | "phpunit/php-invoker": ">=1.1.0,<1.2.0" 722 | }, 723 | "bin": [ 724 | "composer/bin/phpunit" 725 | ], 726 | "type": "library", 727 | "extra": { 728 | "branch-alias": { 729 | "dev-master": "3.7.x-dev" 730 | } 731 | }, 732 | "autoload": { 733 | "classmap": [ 734 | "PHPUnit/" 735 | ] 736 | }, 737 | "notification-url": "https://packagist.org/downloads/", 738 | "include-path": [ 739 | "", 740 | "../../symfony/yaml/" 741 | ], 742 | "license": [ 743 | "BSD-3-Clause" 744 | ], 745 | "authors": [ 746 | { 747 | "name": "Sebastian Bergmann", 748 | "email": "sebastian@phpunit.de", 749 | "role": "lead" 750 | } 751 | ], 752 | "description": "The PHP Unit Testing framework.", 753 | "homepage": "http://www.phpunit.de/", 754 | "keywords": [ 755 | "phpunit", 756 | "testing", 757 | "xunit" 758 | ], 759 | "time": "2013-05-23 18:54:29" 760 | }, 761 | { 762 | "name": "phpunit/phpunit-mock-objects", 763 | "version": "1.2.3", 764 | "source": { 765 | "type": "git", 766 | "url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git", 767 | "reference": "1.2.3" 768 | }, 769 | "dist": { 770 | "type": "zip", 771 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects/archive/1.2.3.zip", 772 | "reference": "1.2.3", 773 | "shasum": "" 774 | }, 775 | "require": { 776 | "php": ">=5.3.3", 777 | "phpunit/php-text-template": ">=1.1.1@stable" 778 | }, 779 | "suggest": { 780 | "ext-soap": "*" 781 | }, 782 | "type": "library", 783 | "autoload": { 784 | "classmap": [ 785 | "PHPUnit/" 786 | ] 787 | }, 788 | "notification-url": "https://packagist.org/downloads/", 789 | "include-path": [ 790 | "" 791 | ], 792 | "license": [ 793 | "BSD-3-Clause" 794 | ], 795 | "authors": [ 796 | { 797 | "name": "Sebastian Bergmann", 798 | "email": "sb@sebastian-bergmann.de", 799 | "role": "lead" 800 | } 801 | ], 802 | "description": "Mock Object library for PHPUnit", 803 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 804 | "keywords": [ 805 | "mock", 806 | "xunit" 807 | ], 808 | "time": "2013-01-13 10:24:48" 809 | }, 810 | { 811 | "name": "silex/silex", 812 | "version": "dev-master", 813 | "source": { 814 | "type": "git", 815 | "url": "https://github.com/fabpot/Silex.git", 816 | "reference": "e9bedd65873d6e20e2dd9eee9cde4723f10bcdb0" 817 | }, 818 | "dist": { 819 | "type": "zip", 820 | "url": "https://api.github.com/repos/fabpot/Silex/zipball/e9bedd65873d6e20e2dd9eee9cde4723f10bcdb0", 821 | "reference": "e9bedd65873d6e20e2dd9eee9cde4723f10bcdb0", 822 | "shasum": "" 823 | }, 824 | "require": { 825 | "php": ">=5.3.3", 826 | "pimple/pimple": "1.*", 827 | "symfony/event-dispatcher": ">=2.3,<2.4-dev", 828 | "symfony/http-foundation": ">=2.3,<2.4-dev", 829 | "symfony/http-kernel": ">=2.3,<2.4-dev", 830 | "symfony/routing": ">=2.3,<2.4-dev" 831 | }, 832 | "require-dev": { 833 | "doctrine/dbal": ">=2.2.0,<2.4.0-dev", 834 | "monolog/monolog": "~1.4,>=1.4.1", 835 | "phpunit/phpunit": "~3.7", 836 | "swiftmailer/swiftmailer": "5.*", 837 | "symfony/browser-kit": ">=2.3,<2.4-dev", 838 | "symfony/config": ">=2.3,<2.4-dev", 839 | "symfony/css-selector": ">=2.3,<2.4-dev", 840 | "symfony/dom-crawler": ">=2.3,<2.4-dev", 841 | "symfony/finder": ">=2.3,<2.4-dev", 842 | "symfony/form": ">=2.3,<2.4-dev", 843 | "symfony/locale": ">=2.3,<2.4-dev", 844 | "symfony/monolog-bridge": ">=2.3,<2.4-dev", 845 | "symfony/options-resolver": ">=2.3,<2.4-dev", 846 | "symfony/process": ">=2.3,<2.4-dev", 847 | "symfony/security": ">=2.3,<2.4-dev", 848 | "symfony/serializer": ">=2.3,<2.4-dev", 849 | "symfony/translation": ">=2.3,<2.4-dev", 850 | "symfony/twig-bridge": ">=2.3,<2.4-dev", 851 | "symfony/validator": ">=2.3,<2.4-dev", 852 | "twig/twig": ">=1.8.0,<2.0-dev" 853 | }, 854 | "suggest": { 855 | "symfony/browser-kit": ">=2.3,<2.4-dev", 856 | "symfony/css-selector": ">=2.3,<2.4-dev", 857 | "symfony/dom-crawler": ">=2.3,<2.4-dev", 858 | "symfony/form": ">=2.3,<2.4-dev" 859 | }, 860 | "type": "library", 861 | "extra": { 862 | "branch-alias": { 863 | "dev-master": "1.1.x-dev" 864 | } 865 | }, 866 | "autoload": { 867 | "psr-0": { 868 | "Silex": "src/" 869 | } 870 | }, 871 | "notification-url": "https://packagist.org/downloads/", 872 | "license": [ 873 | "MIT" 874 | ], 875 | "authors": [ 876 | { 877 | "name": "Fabien Potencier", 878 | "email": "fabien@symfony.com" 879 | }, 880 | { 881 | "name": "Igor Wiedler", 882 | "email": "igor@wiedler.ch", 883 | "homepage": "http://wiedler.ch/igor/" 884 | } 885 | ], 886 | "description": "The PHP micro-framework based on the Symfony2 Components", 887 | "homepage": "http://silex.sensiolabs.org", 888 | "keywords": [ 889 | "microframework" 890 | ], 891 | "time": "2013-07-27 05:29:38" 892 | }, 893 | { 894 | "name": "stack/builder", 895 | "version": "dev-master", 896 | "source": { 897 | "type": "git", 898 | "url": "https://github.com/stackphp/builder.git", 899 | "reference": "d438b2aeb1f3dfa2c16497c68b7016ab7998748d" 900 | }, 901 | "dist": { 902 | "type": "zip", 903 | "url": "https://api.github.com/repos/stackphp/builder/zipball/d438b2aeb1f3dfa2c16497c68b7016ab7998748d", 904 | "reference": "d438b2aeb1f3dfa2c16497c68b7016ab7998748d", 905 | "shasum": "" 906 | }, 907 | "require": { 908 | "php": ">=5.4.0", 909 | "symfony/http-foundation": "~2.1", 910 | "symfony/http-kernel": "~2.1" 911 | }, 912 | "require-dev": { 913 | "silex/silex": "1.0.*@dev" 914 | }, 915 | "type": "library", 916 | "extra": { 917 | "branch-alias": { 918 | "dev-master": "1.0-dev" 919 | } 920 | }, 921 | "autoload": { 922 | "psr-0": { 923 | "Stack": "src" 924 | } 925 | }, 926 | "notification-url": "https://packagist.org/downloads/", 927 | "license": [ 928 | "MIT" 929 | ], 930 | "authors": [ 931 | { 932 | "name": "Igor Wiedler", 933 | "email": "igor@wiedler.ch", 934 | "homepage": "http://wiedler.ch/igor/" 935 | } 936 | ], 937 | "description": "Builder for stack middlewares based on HttpKernelInterface.", 938 | "keywords": [ 939 | "stack" 940 | ], 941 | "time": "2013-04-29 12:20:08" 942 | }, 943 | { 944 | "name": "stack/callable-http-kernel", 945 | "version": "dev-master", 946 | "source": { 947 | "type": "git", 948 | "url": "https://github.com/stackphp/CallableHttpKernel.git", 949 | "reference": "2cea2eab2c3a618bd378f1a2fa05917cf934b518" 950 | }, 951 | "dist": { 952 | "type": "zip", 953 | "url": "https://api.github.com/repos/stackphp/CallableHttpKernel/zipball/2cea2eab2c3a618bd378f1a2fa05917cf934b518", 954 | "reference": "2cea2eab2c3a618bd378f1a2fa05917cf934b518", 955 | "shasum": "" 956 | }, 957 | "require": { 958 | "php": ">=5.4.0", 959 | "symfony/http-foundation": "~2.1", 960 | "symfony/http-kernel": "~2.1" 961 | }, 962 | "type": "library", 963 | "extra": { 964 | "branch-alias": { 965 | "dev-master": "1.0-dev" 966 | } 967 | }, 968 | "autoload": { 969 | "psr-0": { 970 | "Stack": "src" 971 | } 972 | }, 973 | "notification-url": "https://packagist.org/downloads/", 974 | "license": [ 975 | "MIT" 976 | ], 977 | "authors": [ 978 | { 979 | "name": "Igor Wiedler", 980 | "email": "igor@wiedler.ch", 981 | "homepage": "http://wiedler.ch/igor/" 982 | } 983 | ], 984 | "description": "HttpKernelInterface implementation based on callables.", 985 | "keywords": [ 986 | "stack" 987 | ], 988 | "time": "2013-05-17 16:07:54" 989 | }, 990 | { 991 | "name": "stack/inline", 992 | "version": "dev-master", 993 | "source": { 994 | "type": "git", 995 | "url": "https://github.com/stackphp/inline.git", 996 | "reference": "31d8ca1efaa8680c20bc3229e441c8733ce84899" 997 | }, 998 | "dist": { 999 | "type": "zip", 1000 | "url": "https://api.github.com/repos/stackphp/inline/zipball/31d8ca1efaa8680c20bc3229e441c8733ce84899", 1001 | "reference": "31d8ca1efaa8680c20bc3229e441c8733ce84899", 1002 | "shasum": "" 1003 | }, 1004 | "require": { 1005 | "php": ">=5.4.0", 1006 | "symfony/http-foundation": "~2.1", 1007 | "symfony/http-kernel": "~2.1" 1008 | }, 1009 | "require-dev": { 1010 | "silex/silex": "~1.0@dev", 1011 | "stack/builder": "~1.0@dev", 1012 | "stack/callable-http-kernel": "~1.0@dev" 1013 | }, 1014 | "type": "library", 1015 | "extra": { 1016 | "branch-alias": { 1017 | "dev-master": "1.0-dev" 1018 | } 1019 | }, 1020 | "autoload": { 1021 | "psr-0": { 1022 | "Stack": "src" 1023 | } 1024 | }, 1025 | "notification-url": "https://packagist.org/downloads/", 1026 | "license": [ 1027 | "MIT" 1028 | ], 1029 | "authors": [ 1030 | { 1031 | "name": "Igor Wiedler", 1032 | "email": "igor@wiedler.ch", 1033 | "homepage": "http://wiedler.ch/igor/" 1034 | } 1035 | ], 1036 | "description": "Inline stack middleware.", 1037 | "keywords": [ 1038 | "callable", 1039 | "inline", 1040 | "stack" 1041 | ], 1042 | "time": "2013-04-09 15:57:37" 1043 | }, 1044 | { 1045 | "name": "symfony/browser-kit", 1046 | "version": "v2.3.2", 1047 | "target-dir": "Symfony/Component/BrowserKit", 1048 | "source": { 1049 | "type": "git", 1050 | "url": "https://github.com/symfony/BrowserKit.git", 1051 | "reference": "v2.3.2" 1052 | }, 1053 | "dist": { 1054 | "type": "zip", 1055 | "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/v2.3.2", 1056 | "reference": "v2.3.2", 1057 | "shasum": "" 1058 | }, 1059 | "require": { 1060 | "php": ">=5.3.3", 1061 | "symfony/dom-crawler": "~2.0" 1062 | }, 1063 | "require-dev": { 1064 | "symfony/css-selector": "~2.0", 1065 | "symfony/process": "~2.0" 1066 | }, 1067 | "suggest": { 1068 | "symfony/process": "" 1069 | }, 1070 | "type": "library", 1071 | "extra": { 1072 | "branch-alias": { 1073 | "dev-master": "2.3-dev" 1074 | } 1075 | }, 1076 | "autoload": { 1077 | "psr-0": { 1078 | "Symfony\\Component\\BrowserKit\\": "" 1079 | } 1080 | }, 1081 | "notification-url": "https://packagist.org/downloads/", 1082 | "license": [ 1083 | "MIT" 1084 | ], 1085 | "authors": [ 1086 | { 1087 | "name": "Fabien Potencier", 1088 | "email": "fabien@symfony.com" 1089 | }, 1090 | { 1091 | "name": "Symfony Community", 1092 | "homepage": "http://symfony.com/contributors" 1093 | } 1094 | ], 1095 | "description": "Symfony BrowserKit Component", 1096 | "homepage": "http://symfony.com", 1097 | "time": "2013-07-07 15:48:29" 1098 | }, 1099 | { 1100 | "name": "symfony/dom-crawler", 1101 | "version": "v2.3.2", 1102 | "target-dir": "Symfony/Component/DomCrawler", 1103 | "source": { 1104 | "type": "git", 1105 | "url": "https://github.com/symfony/DomCrawler.git", 1106 | "reference": "v2.3.2" 1107 | }, 1108 | "dist": { 1109 | "type": "zip", 1110 | "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/v2.3.2", 1111 | "reference": "v2.3.2", 1112 | "shasum": "" 1113 | }, 1114 | "require": { 1115 | "php": ">=5.3.3" 1116 | }, 1117 | "require-dev": { 1118 | "symfony/css-selector": "~2.0" 1119 | }, 1120 | "suggest": { 1121 | "symfony/css-selector": "" 1122 | }, 1123 | "type": "library", 1124 | "extra": { 1125 | "branch-alias": { 1126 | "dev-master": "2.3-dev" 1127 | } 1128 | }, 1129 | "autoload": { 1130 | "psr-0": { 1131 | "Symfony\\Component\\DomCrawler\\": "" 1132 | } 1133 | }, 1134 | "notification-url": "https://packagist.org/downloads/", 1135 | "license": [ 1136 | "MIT" 1137 | ], 1138 | "authors": [ 1139 | { 1140 | "name": "Fabien Potencier", 1141 | "email": "fabien@symfony.com" 1142 | }, 1143 | { 1144 | "name": "Symfony Community", 1145 | "homepage": "http://symfony.com/contributors" 1146 | } 1147 | ], 1148 | "description": "Symfony DomCrawler Component", 1149 | "homepage": "http://symfony.com", 1150 | "time": "2013-07-01 12:24:43" 1151 | }, 1152 | { 1153 | "name": "symfony/routing", 1154 | "version": "v2.3.2", 1155 | "target-dir": "Symfony/Component/Routing", 1156 | "source": { 1157 | "type": "git", 1158 | "url": "https://github.com/symfony/Routing.git", 1159 | "reference": "v2.3.2" 1160 | }, 1161 | "dist": { 1162 | "type": "zip", 1163 | "url": "https://api.github.com/repos/symfony/Routing/zipball/v2.3.2", 1164 | "reference": "v2.3.2", 1165 | "shasum": "" 1166 | }, 1167 | "require": { 1168 | "php": ">=5.3.3" 1169 | }, 1170 | "require-dev": { 1171 | "doctrine/common": "~2.2", 1172 | "psr/log": "~1.0", 1173 | "symfony/config": "~2.2", 1174 | "symfony/yaml": "~2.0" 1175 | }, 1176 | "suggest": { 1177 | "doctrine/common": "", 1178 | "symfony/config": "", 1179 | "symfony/yaml": "" 1180 | }, 1181 | "type": "library", 1182 | "extra": { 1183 | "branch-alias": { 1184 | "dev-master": "2.3-dev" 1185 | } 1186 | }, 1187 | "autoload": { 1188 | "psr-0": { 1189 | "Symfony\\Component\\Routing\\": "" 1190 | } 1191 | }, 1192 | "notification-url": "https://packagist.org/downloads/", 1193 | "license": [ 1194 | "MIT" 1195 | ], 1196 | "authors": [ 1197 | { 1198 | "name": "Fabien Potencier", 1199 | "email": "fabien@symfony.com" 1200 | }, 1201 | { 1202 | "name": "Symfony Community", 1203 | "homepage": "http://symfony.com/contributors" 1204 | } 1205 | ], 1206 | "description": "Symfony Routing Component", 1207 | "homepage": "http://symfony.com", 1208 | "time": "2013-06-23 08:16:02" 1209 | }, 1210 | { 1211 | "name": "symfony/yaml", 1212 | "version": "v2.3.2", 1213 | "target-dir": "Symfony/Component/Yaml", 1214 | "source": { 1215 | "type": "git", 1216 | "url": "https://github.com/symfony/Yaml.git", 1217 | "reference": "v2.3.2" 1218 | }, 1219 | "dist": { 1220 | "type": "zip", 1221 | "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.3.2", 1222 | "reference": "v2.3.2", 1223 | "shasum": "" 1224 | }, 1225 | "require": { 1226 | "php": ">=5.3.3" 1227 | }, 1228 | "type": "library", 1229 | "extra": { 1230 | "branch-alias": { 1231 | "dev-master": "2.3-dev" 1232 | } 1233 | }, 1234 | "autoload": { 1235 | "psr-0": { 1236 | "Symfony\\Component\\Yaml\\": "" 1237 | } 1238 | }, 1239 | "notification-url": "https://packagist.org/downloads/", 1240 | "license": [ 1241 | "MIT" 1242 | ], 1243 | "authors": [ 1244 | { 1245 | "name": "Fabien Potencier", 1246 | "email": "fabien@symfony.com" 1247 | }, 1248 | { 1249 | "name": "Symfony Community", 1250 | "homepage": "http://symfony.com/contributors" 1251 | } 1252 | ], 1253 | "description": "Symfony Yaml Component", 1254 | "homepage": "http://symfony.com", 1255 | "time": "2013-07-11 19:36:36" 1256 | } 1257 | ], 1258 | "aliases": [], 1259 | "minimum-stability": "stable", 1260 | "stability-flags": { 1261 | "dflydev/stack-authentication": 20, 1262 | "dflydev/stack-firewall": 20, 1263 | "silex/silex": 20, 1264 | "stack/builder": 20, 1265 | "stack/callable-http-kernel": 20, 1266 | "stack/inline": 20 1267 | }, 1268 | "prefer-stable": false, 1269 | "platform": { 1270 | "php": ">=5.4.0" 1271 | }, 1272 | "platform-dev": [] 1273 | } 1274 | --------------------------------------------------------------------------------