├── .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 |
--------------------------------------------------------------------------------