diff --git a/.gitignore b/.gitignore
index d89f9757ed..61eea7bb2e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,10 +7,13 @@ channel/.htaccess
*.sln
*.v11.suo
*.suo
-logs
+logs/
/nbproject/private/
.pc
-/tmp
+tmp/
log/
*~
-*#
\ No newline at end of file
+*#
+*.log
+/lib/vendor/
+/lib/components/
diff --git a/.php_cs b/.php_cs
index 8d80bfcb1c..23a0088f87 100644
--- a/.php_cs
+++ b/.php_cs
@@ -3,6 +3,8 @@
use Symfony\CS\FixerInterface;
$finder = Symfony\CS\Finder\DefaultFinder::create()
+ ->exclude('lib/components')
+ ->exclude('lib/vendor')
->exclude('modules')
->exclude('nbproject')
->in(__DIR__)
diff --git a/.scrutinizer.yml b/.scrutinizer.yml
index 5de5f40c75..92e013c73c 100644
--- a/.scrutinizer.yml
+++ b/.scrutinizer.yml
@@ -1,5 +1,7 @@
filter:
excluded_paths:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
paths: { }
@@ -8,6 +10,8 @@ tools:
enabled: true
filter:
excluded_paths:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
- 'themes/*'
paths: { }
@@ -21,6 +25,8 @@ tools:
excluded_dirs: { }
filter:
excluded_paths:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
paths: { }
php_analyzer:
@@ -28,9 +34,13 @@ tools:
extensions:
- php
dependency_paths:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
filter:
excluded_paths:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
- 'themes/*'
paths: { }
@@ -44,16 +54,22 @@ tools:
- '\bimplement(?:s|ed)?\b'
filter:
excluded_paths:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
paths: { }
php_loc:
enabled: true
excluded_dirs:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
php_cpd:
enabled: true
excluded_dirs: { }
filter:
excluded_paths:
+ - 'lib/components/*'
+ - 'lib/vendor/*'
- 'modules/*'
paths: { }
\ No newline at end of file
diff --git a/README.md b/README.md
index 73b9418925..8ed293a562 100755
--- a/README.md
+++ b/README.md
@@ -83,7 +83,6 @@ Ampache includes some external modules that carry their own licensing.
* [PHPMailer](https://github.com/PHPMailer/PHPMailer): LGPL v2.1
* [jQuery](http://jquery.org): MIT
* [Requests](http://requests.ryanmccue.info): ISC Licensed
-* [Whatever:hover](http://www.xs4all.nl/~peterned): LGPL v2.1
* [xbmc-php-rpc](https://github.com/karlrixon/xbmc-php-rpc): GPL v3
* [Dropbox SDK](https://github.com/dropbox/dropbox-sdk-php): MIT
* [jPlayer](http://jplayer.org): MIT
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000000..cf6937dc50
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,331 @@
+{
+ "name": "ampache/ampache",
+ "description": "A web based audio/video streaming application and file manager allowing you to access your music & videos from anywhere, using almost any internet enabled device.",
+ "homepage": "http://ampache.org",
+ "keywords": ["php", "music", "video", "player", "stream"],
+ "type": "project",
+ "license": "GPL-2.0",
+ "config":
+ {
+ "vendor-dir": "lib/vendor",
+ "component-dir": "lib/components"
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "james-heinrich/getid3": "1.9.*",
+ "mikealmond/musicbrainz": "0.2.*",
+ "guzzlehttp/guzzle": "5.*",
+ "phpmailer/phpmailer": "5.2.*",
+ "rmccue/requests": "1.6.*",
+ "react/react": "0.4.*",
+ "cboden/ratchet": "0.3.*",
+ "symfony/event-dispatcher": "2.7.*",
+ "symfony/routing": "2.7.*",
+ "symfony/http-foundation": "2.7.*",
+ "szymach/c-pchart": "1.*",
+ "evenement/evenement": "2.*",
+ "happyworm/jplayer": "2.*",
+ "needim/noty": "2.3.*",
+ "openid/php-openid": "2.*",
+ "dropbox/dropbox-sdk": "1.*",
+ "sabre/dav": "3.*",
+ "maennchen/zipstream-php": "0.*",
+ "php-tmdb/api": "2.*",
+ "moinax/tvdb": "1.*",
+
+ "jamiebicknell/Growl-GNTP": "1.*",
+ "bshaffer/php-echonest-api": "dev-master",
+ "krixon/xbmc-php-rpc": "dev-master",
+ "mptre/php-soundcloud": "2.*",
+
+ "components/jquery": "2.0.*",
+ "components/jqueryui": "1.*",
+ "vakata/jstree": "3.*",
+ "components/bootstrap": "3.*",
+ "aehlke/tag-it": "2.*",
+ "scaron/prettyphoto": "3.*",
+ "jeromeetienne/jquery-qrcode": "dev-master",
+ "carhartl/jquery-cookie": "1.*",
+ "xdan/datetimepicker": "2.*",
+ "blueimp/jQuery-File-Upload": "9.*",
+ "aterrien/jQuery-Knob": "1.2.*",
+ "pklauzinski/jscroll": "2.*",
+ "kumailht/responsive-elements": "dev-master"
+ },
+
+ "repositories":
+ [
+ {
+ "type": "package",
+ "package": {
+ "name": "jamiebicknell/Growl-GNTP",
+ "version": "1.0.0",
+ "source": {
+ "url": "https://github.com/jamiebicknell/Growl-GNTP.git",
+ "type": "git",
+ "reference": "1.0.0"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "bshaffer/php-echonest-api",
+ "version": "dev-master",
+ "source": {
+ "url": "https://github.com/bshaffer/php-echonest-api.git",
+ "type": "git",
+ "reference": "master"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "krixon/xbmc-php-rpc",
+ "version": "dev-master",
+ "source": {
+ "url": "https://github.com/krixon/xbmc-php-rpc.git",
+ "type": "git",
+ "reference": "master"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "mptre/php-soundcloud",
+ "version": "2.3.2",
+ "source": {
+ "url": "https://github.com/mptre/php-soundcloud.git",
+ "type": "git",
+ "reference": "v2.3.2"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "jeromeetienne/jquery-qrcode",
+ "type": "component",
+ "version": "dev-master",
+ "source": {
+ "url": "https://github.com/jeromeetienne/jquery-qrcode.git",
+ "type": "git",
+ "reference": "master"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "src/jquery.qrcode.js",
+ "src/qrcode.js"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "carhartl/jquery-cookie",
+ "type": "component",
+ "version": "1.4.1",
+ "source": {
+ "url": "https://github.com/carhartl/jquery-cookie.git",
+ "type": "git",
+ "reference": "v1.4.1"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "jquery.cookie.js"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "aehlke/tag-it",
+ "type": "component",
+ "version": "2.0",
+ "source": {
+ "url": "https://github.com/aehlke/tag-it.git",
+ "type": "git",
+ "reference": "v2.0"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/tag-it.js"
+ ],
+ "styles": [
+ "css/jquery.tagit.css"
+ ],
+ "files": [
+ "js/tag-it.min.js"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "scaron/prettyphoto",
+ "type": "component",
+ "version": "3.1.6",
+ "source": {
+ "url": "https://github.com/scaron/prettyphoto.git",
+ "type": "git",
+ "reference": "3.1.6"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/jquery.prettyPhoto.js"
+ ],
+ "styles": [
+ "css/prettyPhoto.css"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "xdan/datetimepicker",
+ "type": "component",
+ "version": "2.4.5",
+ "source": {
+ "url": "https://github.com/xdan/datetimepicker.git",
+ "type": "git",
+ "reference": "2.4.5"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "jquery.datetimepicker.js"
+ ],
+ "styles": [
+ "jquery.datetimepicker.css"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "blueimp/jQuery-File-Upload",
+ "type": "component",
+ "version": "9.11.2",
+ "source": {
+ "url": "https://github.com/blueimp/jQuery-File-Upload.git",
+ "type": "git",
+ "reference": "9.11.2"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/jquery.fileupload.js",
+ "js/jquery.iframe-transport.js"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "aterrien/jQuery-Knob",
+ "type": "component",
+ "version": "1.2.11",
+ "source": {
+ "url": "https://github.com/aterrien/jQuery-Knob.git",
+ "type": "git",
+ "reference": "1.2.11"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/jquery.knob.js"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "pklauzinski/jscroll",
+ "type": "component",
+ "version": "2.3.4",
+ "source": {
+ "url": "https://github.com/pklauzinski/jscroll.git",
+ "type": "git",
+ "reference": "v2.3.4"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "jquery.jscroll.js"
+ ],
+ "files": [
+ "jquery.jscroll.min.js"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "kumailht/responsive-elements",
+ "type": "component",
+ "version": "dev-master",
+ "source": {
+ "url": "https://github.com/kumailht/responsive-elements.git",
+ "type": "git",
+ "reference": "master"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "responsive-elements.js"
+ ]
+ }
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ }
+ }
+ }
+ ]
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000000..a45327dd93
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,3184 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "a44f06d93118a38a89dd38d6bd18b71e",
+ "packages": [
+ {
+ "name": "aehlke/tag-it",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/aehlke/tag-it.git",
+ "reference": "v2.0"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/tag-it.js"
+ ],
+ "styles": [
+ "css/jquery.tagit.css"
+ ],
+ "files": [
+ "js/tag-it.min.js"
+ ]
+ }
+ }
+ },
+ {
+ "name": "aterrien/jQuery-Knob",
+ "version": "1.2.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/aterrien/jQuery-Knob.git",
+ "reference": "1.2.11"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/jquery.knob.js"
+ ]
+ }
+ }
+ },
+ {
+ "name": "blueimp/jQuery-File-Upload",
+ "version": "9.11.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/blueimp/jQuery-File-Upload.git",
+ "reference": "9.11.2"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/jquery.fileupload.js",
+ "js/jquery.iframe-transport.js"
+ ]
+ }
+ }
+ },
+ {
+ "name": "bshaffer/php-echonest-api",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bshaffer/php-echonest-api.git",
+ "reference": "master"
+ },
+ "type": "library",
+ "time": "2012-11-19 06:40:23"
+ },
+ {
+ "name": "carhartl/jquery-cookie",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/carhartl/jquery-cookie.git",
+ "reference": "v1.4.1"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "jquery.cookie.js"
+ ]
+ }
+ }
+ },
+ {
+ "name": "cboden/ratchet",
+ "version": "v0.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ratchetphp/Ratchet.git",
+ "reference": "6b247c05251b4b5cbd14243366b649f99a0e5681"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ratchetphp/Ratchet/zipball/6b247c05251b4b5cbd14243366b649f99a0e5681",
+ "reference": "6b247c05251b4b5cbd14243366b649f99a0e5681",
+ "shasum": ""
+ },
+ "require": {
+ "guzzle/http": "^3.6",
+ "php": ">=5.3.9",
+ "react/socket": "^0.3 || ^0.4",
+ "symfony/http-foundation": "^2.2",
+ "symfony/routing": "^2.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ratchet\\": "src/Ratchet"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP WebSocket library",
+ "homepage": "http://socketo.me",
+ "keywords": [
+ "Ratchet",
+ "WebSockets",
+ "server",
+ "sockets"
+ ],
+ "time": "2015-05-27 12:51:05"
+ },
+ {
+ "name": "components/bootstrap",
+ "version": "3.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/components/bootstrap.git",
+ "reference": "d71c2a234c61f53f1109a26ba8155902a51f8ca5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/components/bootstrap/zipball/d71c2a234c61f53f1109a26ba8155902a51f8ca5",
+ "reference": "d71c2a234c61f53f1109a26ba8155902a51f8ca5",
+ "shasum": ""
+ },
+ "require": {
+ "components/jquery": ">=1.9.1 <3.0"
+ },
+ "suggest": {
+ "components/bootstrap-default": "Provide a theme for Bootstrap as components/bootstrap only provides the CSS as file assets"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/bootstrap.js"
+ ],
+ "files": [
+ "js/*.js",
+ "css/*.css",
+ "css/*.map",
+ "fonts/*",
+ "less/mixins/*.less",
+ "less/*.less"
+ ],
+ "shim": {
+ "deps": [
+ "jquery"
+ ]
+ }
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jacob Thornton",
+ "email": "jacobthornton@gmail.com"
+ },
+ {
+ "name": "Mark Otto",
+ "email": "markdotto@gmail.com"
+ }
+ ],
+ "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
+ "homepage": "http://getbootstrap.com",
+ "keywords": [
+ "css",
+ "framework",
+ "front-end",
+ "less",
+ "mobile-first",
+ "responsive",
+ "web"
+ ],
+ "time": "2015-06-17 06:08:09"
+ },
+ {
+ "name": "components/jquery",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/components/jquery.git",
+ "reference": "452a56b52b8f4a032256cdb8b6838f25f0bdb3d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/components/jquery/zipball/452a56b52b8f4a032256cdb8b6838f25f0bdb3d2",
+ "reference": "452a56b52b8f4a032256cdb8b6838f25f0bdb3d2",
+ "shasum": ""
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "jquery.js"
+ ],
+ "files": [
+ "jquery.min.js",
+ "jquery-migrate.js",
+ "jquery-migrate.min.js"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Resig",
+ "email": "jeresig@gmail.com",
+ "homepage": "http://ejohn.org/"
+ }
+ ],
+ "description": "jQuery JavaScript Library",
+ "homepage": "http://jquery.com",
+ "time": "2013-07-12 08:48:34"
+ },
+ {
+ "name": "components/jqueryui",
+ "version": "1.11.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/components/jqueryui.git",
+ "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1",
+ "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1",
+ "shasum": ""
+ },
+ "require": {
+ "components/jquery": ">=1.6"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "name": "jquery-ui",
+ "scripts": [
+ "jquery-ui.js"
+ ],
+ "files": [
+ "ui/**",
+ "themes/**",
+ "jquery-ui.min.js"
+ ],
+ "shim": {
+ "deps": [
+ "jquery"
+ ],
+ "exports": "jQuery"
+ }
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "jQuery UI Team",
+ "homepage": "http://jqueryui.com/about"
+ },
+ {
+ "name": "Joern Zaefferer",
+ "email": "joern.zaefferer@gmail.com",
+ "homepage": "http://bassistance.de"
+ },
+ {
+ "name": "Scott Gonzalez",
+ "email": "scott.gonzalez@gmail.com",
+ "homepage": "http://scottgonzalez.com"
+ },
+ {
+ "name": "Kris Borchers",
+ "email": "kris.borchers@gmail.com",
+ "homepage": "http://krisborchers.com"
+ },
+ {
+ "name": "Mike Sherov",
+ "email": "mike.sherov@gmail.com",
+ "homepage": "http://mike.sherov.com"
+ },
+ {
+ "name": "TJ VanToll",
+ "email": "tj.vantoll@gmail.com",
+ "homepage": "http://tjvantoll.com"
+ },
+ {
+ "name": "Corey Frang",
+ "email": "gnarf37@gmail.com",
+ "homepage": "http://gnarf.net"
+ },
+ {
+ "name": "Felix Nagel",
+ "email": "info@felixnagel.com",
+ "homepage": "http://www.felixnagel.com"
+ }
+ ],
+ "description": "jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.",
+ "time": "2015-03-13 14:48:12"
+ },
+ {
+ "name": "doctrine/cache",
+ "version": "v1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/8c434000f420ade76a07c64cbe08ca47e5c101ca",
+ "reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": ">=3.7",
+ "predis/predis": "~1.0",
+ "satooshi/php-coveralls": "~0.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Cache\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Caching library offering an object-oriented API for many cache backends",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "cache",
+ "caching"
+ ],
+ "time": "2015-08-31 12:36:41"
+ },
+ {
+ "name": "dropbox/dropbox-sdk",
+ "version": "v1.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dropbox/dropbox-sdk-php.git",
+ "reference": "6901f8122458e0ce7e391468c0cf6cca465bd0ee"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dropbox/dropbox-sdk-php/zipball/6901f8122458e0ce7e391468c0cf6cca465bd0ee",
+ "reference": "6901f8122458e0ce7e391468c0cf6cca465bd0ee",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": ">= 5.3"
+ },
+ "require-dev": {
+ "apigen/apigen": "2.8.2",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "2.0.0RC3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Dropbox": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Dropbox SDK for PHP",
+ "keywords": [
+ "dropbox"
+ ],
+ "time": "2015-06-29 21:47:57"
+ },
+ {
+ "name": "evenement/evenement",
+ "version": "v2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/igorw/evenement.git",
+ "reference": "f6e843799fd4f4184d54d8fc7b5b3551c9fa803e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/f6e843799fd4f4184d54d8fc7b5b3551c9fa803e",
+ "reference": "f6e843799fd4f4184d54d8fc7b5b3551c9fa803e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Evenement": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch",
+ "homepage": "http://wiedler.ch/igor/"
+ }
+ ],
+ "description": "Événement is a very simple event dispatching library for PHP",
+ "keywords": [
+ "event-dispatcher",
+ "event-emitter"
+ ],
+ "time": "2012-11-02 14:49:47"
+ },
+ {
+ "name": "guzzle/common",
+ "version": "v3.9.2",
+ "target-dir": "Guzzle/Common",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Guzzle3/common.git",
+ "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Guzzle3/common/zipball/2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc",
+ "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2",
+ "symfony/event-dispatcher": ">=2.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Guzzle\\Common": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Common libraries used by Guzzle",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "collection",
+ "common",
+ "event",
+ "exception"
+ ],
+ "abandoned": "guzzle/guzzle",
+ "time": "2014-08-11 04:32:36"
+ },
+ {
+ "name": "guzzle/http",
+ "version": "v3.9.2",
+ "target-dir": "Guzzle/Http",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Guzzle3/http.git",
+ "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Guzzle3/http/zipball/1e8dd1e2ba9dc42332396f39fbfab950b2301dc5",
+ "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5",
+ "shasum": ""
+ },
+ "require": {
+ "guzzle/common": "self.version",
+ "guzzle/parser": "self.version",
+ "guzzle/stream": "self.version",
+ "php": ">=5.3.2"
+ },
+ "suggest": {
+ "ext-curl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Guzzle\\Http": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "HTTP libraries used by Guzzle",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "client",
+ "curl",
+ "http",
+ "http client"
+ ],
+ "abandoned": "guzzle/guzzle",
+ "time": "2014-08-11 04:32:36"
+ },
+ {
+ "name": "guzzle/parser",
+ "version": "v3.9.2",
+ "target-dir": "Guzzle/Parser",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Guzzle3/parser.git",
+ "reference": "6874d171318a8e93eb6d224cf85e4678490b625c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Guzzle3/parser/zipball/6874d171318a8e93eb6d224cf85e4678490b625c",
+ "reference": "6874d171318a8e93eb6d224cf85e4678490b625c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Guzzle\\Parser": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Interchangeable parsers used by Guzzle",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "URI Template",
+ "cookie",
+ "http",
+ "message",
+ "url"
+ ],
+ "abandoned": "guzzle/guzzle",
+ "time": "2014-02-05 18:29:46"
+ },
+ {
+ "name": "guzzle/stream",
+ "version": "v3.9.2",
+ "target-dir": "Guzzle/Stream",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Guzzle3/stream.git",
+ "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Guzzle3/stream/zipball/60c7fed02e98d2c518dae8f97874c8f4622100f0",
+ "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0",
+ "shasum": ""
+ },
+ "require": {
+ "guzzle/common": "self.version",
+ "php": ">=5.3.2"
+ },
+ "suggest": {
+ "guzzle/http": "To convert Guzzle request objects to PHP streams"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Guzzle\\Stream": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle stream wrapper component",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "component",
+ "stream"
+ ],
+ "abandoned": "guzzle/guzzle",
+ "time": "2014-05-01 21:36:02"
+ },
+ {
+ "name": "guzzlehttp/cache-subscriber",
+ "version": "0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/cache-subscriber.git",
+ "reference": "ecb903f6e11b5ca9f2cdbc460e2e68deea9e8858"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/cache-subscriber/zipball/ecb903f6e11b5ca9f2cdbc460e2e68deea9e8858",
+ "reference": "ecb903f6e11b5ca9f2cdbc460e2e68deea9e8858",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/cache": "~1.3",
+ "guzzlehttp/guzzle": "~5.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Subscriber\\Cache\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle HTTP cache subscriber",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "cache"
+ ],
+ "time": "2014-10-29 21:06:25"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "5.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "f3c8c22471cb55475105c14769644a49c3262b93"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f3c8c22471cb55475105c14769644a49c3262b93",
+ "reference": "f3c8c22471cb55475105c14769644a49c3262b93",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/ringphp": "^1.1",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.0",
+ "psr/log": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2015-05-20 03:47:55"
+ },
+ {
+ "name": "guzzlehttp/log-subscriber",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/log-subscriber.git",
+ "reference": "99c3c0004165db721d8ef7bbef60c996210e538a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/log-subscriber/zipball/99c3c0004165db721d8ef7bbef60c996210e538a",
+ "reference": "99c3c0004165db721d8ef7bbef60c996210e538a",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "~4.0 | ~5.0",
+ "php": ">=5.4.0",
+ "psr/log": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Subscriber\\Log\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Logs HTTP requests and responses as they are sent over the wire (Guzzle 4+)",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "log",
+ "plugin"
+ ],
+ "time": "2014-10-13 03:31:43"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
+ "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "PSR-7 message implementation",
+ "keywords": [
+ "http",
+ "message",
+ "stream",
+ "uri"
+ ],
+ "time": "2015-08-15 19:32:36"
+ },
+ {
+ "name": "guzzlehttp/retry-subscriber",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/retry-subscriber.git",
+ "reference": "f13a4c640b823e9eaf06975d8e8981f9551250e8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/retry-subscriber/zipball/f13a4c640b823e9eaf06975d8e8981f9551250e8",
+ "reference": "f13a4c640b823e9eaf06975d8e8981f9551250e8",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "~5.1",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "guzzlehttp/log-subscriber": "~1.0",
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Subscriber\\Retry\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Retries failed HTTP requests using customizable retry strategies (Guzzle 4+)",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "http",
+ "retry"
+ ],
+ "time": "2014-12-19 20:42:37"
+ },
+ {
+ "name": "guzzlehttp/ringphp",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/RingPHP.git",
+ "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
+ "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/streams": "~3.0",
+ "php": ">=5.4.0",
+ "react/promise": "~2.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "ext-curl": "Guzzle will use specific adapters if cURL is present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Ring\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.",
+ "time": "2015-05-20 03:37:09"
+ },
+ {
+ "name": "guzzlehttp/streams",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/streams.git",
+ "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+ "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Stream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Provides a simple abstraction over streams of data",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "stream"
+ ],
+ "time": "2014-10-12 19:18:40"
+ },
+ {
+ "name": "happyworm/jplayer",
+ "version": "2.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/happyworm/jPlayer.git",
+ "reference": "34e55cd7694552447bd0dbc38d886fdc96df0d06"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/happyworm/jPlayer/zipball/34e55cd7694552447bd0dbc38d886fdc96df0d06",
+ "reference": "34e55cd7694552447bd0dbc38d886fdc96df0d06",
+ "shasum": ""
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "suggest": {
+ "components/jquery": ">=1.7.2"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "dist/jplayer/jquery.jplayer.js"
+ ],
+ "files": [
+ "dist"
+ ],
+ "shim": {
+ "deps": [
+ "jquery"
+ ]
+ }
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark J Panaghiston",
+ "email": "markp@happyworm.com"
+ }
+ ],
+ "description": "jPlayer allows you to create a media player with a consistent interface and experience across all browsers.",
+ "homepage": "http://jplayer.org/",
+ "keywords": [
+ "HTML5",
+ "audio",
+ "jplayer",
+ "media",
+ "player",
+ "streaming",
+ "video"
+ ],
+ "time": "2014-12-15 00:55:35"
+ },
+ {
+ "name": "james-heinrich/getid3",
+ "version": "v1.9.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JamesHeinrich/getID3.git",
+ "reference": "c34fb84e295477cc1865b2ea4dad2d13452058d1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/c34fb84e295477cc1865b2ea4dad2d13452058d1",
+ "reference": "c34fb84e295477cc1865b2ea4dad2d13452058d1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "getid3/getid3.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "GPL"
+ ],
+ "description": "PHP script that extracts useful information from popular multimedia file formats",
+ "homepage": "http://www.getid3.org/",
+ "keywords": [
+ "codecs",
+ "php",
+ "tags"
+ ],
+ "time": "2014-12-18 16:39:41"
+ },
+ {
+ "name": "jamiebicknell/Growl-GNTP",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jamiebicknell/Growl-GNTP.git",
+ "reference": "1.0.0"
+ },
+ "type": "library"
+ },
+ {
+ "name": "jeromeetienne/jquery-qrcode",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jeromeetienne/jquery-qrcode.git",
+ "reference": "master"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "src/jquery.qrcode.js",
+ "src/qrcode.js"
+ ]
+ }
+ },
+ "time": "2015-04-15 13:47:34"
+ },
+ {
+ "name": "kriswallsmith/assetic",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kriswallsmith/assetic.git",
+ "reference": "56cb5d6dec9e7a68a4da2fa89844f39d41092f31"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/56cb5d6dec9e7a68a4da2fa89844f39d41092f31",
+ "reference": "56cb5d6dec9e7a68a4da2fa89844f39d41092f31",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1",
+ "symfony/process": "~2.1"
+ },
+ "conflict": {
+ "twig/twig": "<1.12"
+ },
+ "require-dev": {
+ "cssmin/cssmin": "*",
+ "joliclic/javascript-packer": "*",
+ "kamicane/packager": "*",
+ "leafo/lessphp": "^0.3.7",
+ "leafo/scssphp": "*@dev",
+ "leafo/scssphp-compass": "*@dev",
+ "mrclay/minify": "*",
+ "patchwork/jsqueeze": "~1.0|~2.0",
+ "phpunit/phpunit": "~4.8",
+ "psr/log": "~1.0",
+ "ptachoire/cssembed": "*",
+ "symfony/phpunit-bridge": "~2.7",
+ "twig/twig": "~1.8|~2.0"
+ },
+ "suggest": {
+ "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler",
+ "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler",
+ "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin",
+ "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor",
+ "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris",
+ "twig/twig": "Assetic provides the integration with the Twig templating engine"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Assetic": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kris Wallsmith",
+ "email": "kris.wallsmith@gmail.com",
+ "homepage": "http://kriswallsmith.net/"
+ }
+ ],
+ "description": "Asset Management for PHP",
+ "homepage": "https://github.com/kriswallsmith/assetic",
+ "keywords": [
+ "assets",
+ "compression",
+ "minification"
+ ],
+ "time": "2015-08-31 19:07:16"
+ },
+ {
+ "name": "krixon/xbmc-php-rpc",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/krixon/xbmc-php-rpc.git",
+ "reference": "master"
+ },
+ "type": "library",
+ "time": "2013-06-18 13:13:19"
+ },
+ {
+ "name": "kumailht/responsive-elements",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kumailht/responsive-elements.git",
+ "reference": "master"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "responsive-elements.js"
+ ]
+ }
+ },
+ "time": "2015-06-13 00:50:21"
+ },
+ {
+ "name": "maennchen/zipstream-php",
+ "version": "0.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maennchen/ZipStream-PHP.git",
+ "reference": "6ef77339a768f5066310a1c908cd50cf6a5b05d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6ef77339a768f5066310a1c908cd50cf6a5b05d7",
+ "reference": "6ef77339a768f5066310a1c908cd50cf6a5b05d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">= 5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.3.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ZipStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paul Duncan",
+ "email": "pabs@pablotron.org"
+ },
+ {
+ "name": "Jesse Donat",
+ "email": "donatj@gmail.com"
+ },
+ {
+ "name": "Jonatan Männchen",
+ "email": "jonatan@maennchen.ch"
+ }
+ ],
+ "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+ "keywords": [
+ "stream",
+ "zip"
+ ],
+ "time": "2015-01-15 19:43:13"
+ },
+ {
+ "name": "mikealmond/musicbrainz",
+ "version": "v0.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mikealmond/MusicBrainz.git",
+ "reference": "8d482e3e7c46e81f7ddebc43018d7cc3555cfc96"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mikealmond/MusicBrainz/zipball/8d482e3e7c46e81f7ddebc43018d7cc3555cfc96",
+ "reference": "8d482e3e7c46e81f7ddebc43018d7cc3555cfc96",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.8"
+ },
+ "require-dev": {
+ "guzzle/guzzle": "~3.8.0",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "suggest": {
+ "guzzle/guzzle": "Allows you to use the GuzzleHttpAdapter. You must install one of the supported adapters.",
+ "rmccue/requests": "Allows you to use the RequestsHttpAdapter. You must install one of the supported adapters."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "MusicBrainz": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike Almond",
+ "email": "mike.almond@gmail.com",
+ "homepage": "http://mikealmond.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A PHP library for accessing the MusicBrainz API",
+ "homepage": "https://github.com/mikealmond/musicbrainz",
+ "keywords": [
+ "api",
+ "library",
+ "musicbrainz",
+ "php"
+ ],
+ "time": "2014-02-19 19:45:27"
+ },
+ {
+ "name": "moinax/tvdb",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Moinax/TvDb.git",
+ "reference": "278c9e7d40b3e96717a0d317d9b9e8e676815deb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Moinax/TvDb/zipball/278c9e7d40b3e96717a0d317d9b9e8e676815deb",
+ "reference": "278c9e7d40b3e96717a0d317d9b9e8e676815deb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Moinax\\TvDb": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Moinax",
+ "email": "moinax@gmail.com"
+ }
+ ],
+ "description": "PHPTVDB is a PHP library for accessing TV show information such as episodes, actors, showtimes and descriptions.",
+ "homepage": "http://moinax.github.io/TvDb/",
+ "keywords": [
+ "api"
+ ],
+ "time": "2014-11-22 10:42:41"
+ },
+ {
+ "name": "mptre/php-soundcloud",
+ "version": "2.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mptre/php-soundcloud.git",
+ "reference": "v2.3.2"
+ },
+ "type": "library"
+ },
+ {
+ "name": "needim/noty",
+ "version": "v2.3.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/needim/noty.git",
+ "reference": "e3b341ed49e349336f061c40d3ee103924371adb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/needim/noty/zipball/e3b341ed49e349336f061c40d3ee103924371adb",
+ "reference": "e3b341ed49e349336f061c40d3ee103924371adb",
+ "shasum": ""
+ },
+ "suggest": {
+ "components/jquery": ">=1.8",
+ "twbs/bootstrap": "~3.0.0"
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nedim Arabaci",
+ "homepage": "https://github.com/needim",
+ "role": "Developer"
+ }
+ ],
+ "description": "noty is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog.",
+ "homepage": "https://github.com/needim/noty",
+ "keywords": [
+ "notification",
+ "noty"
+ ],
+ "time": "2015-08-13 10:59:24"
+ },
+ {
+ "name": "openid/php-openid",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/openid/php-openid.git",
+ "reference": "924f9aa42453cd0f9dba72587b4e2cdf7f4de874"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/openid/php-openid/zipball/924f9aa42453cd0f9dba72587b4e2cdf7f4de874",
+ "reference": "924f9aa42453cd0f9dba72587b4e2cdf7f4de874",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "ext-dom": "*",
+ "ext-gmp": "*",
+ "php": ">=4.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Auth"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ "."
+ ],
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "JanRain Inc.",
+ "homepage": "http://www.openidenabled.com"
+ }
+ ],
+ "description": "OpenID library for PHP5",
+ "homepage": "http://github.com/openid/php-openid",
+ "keywords": [
+ "Authentication",
+ "OpenId",
+ "auth",
+ "yadis"
+ ],
+ "time": "2015-07-30 18:07:43"
+ },
+ {
+ "name": "php-tmdb/api",
+ "version": "v2.0.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-tmdb/api.git",
+ "reference": "55dc12fec4c18679099761ca23a062a89a4a05ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-tmdb/api/zipball/55dc12fec4c18679099761ca23a062a89a4a05ac",
+ "reference": "55dc12fec4c18679099761ca23a062a89a4a05ac",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "guzzlehttp/cache-subscriber": "~0.1@dev",
+ "guzzlehttp/guzzle": "~5.0",
+ "guzzlehttp/log-subscriber": "~1.0",
+ "guzzlehttp/retry-subscriber": "~2.0",
+ "php": ">=5.4.0",
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.4",
+ "symfony/options-resolver": "~2.6"
+ },
+ "require-dev": {
+ "monolog/monolog": ">=1.11.0",
+ "phpunit/phpunit": "~4.1"
+ },
+ "suggest": {
+ "monolog/monolog": "Required if you want to make use of logging features."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Roterman",
+ "email": "michael@wtfz.net",
+ "homepage": "http://wtfz.net"
+ }
+ ],
+ "description": "PHP wrapper for TMDB (TheMovieDatabase) API v3. Supports two types of approaches, one modelled with repositories, models and factories. And the other by simple array access to RAW data from The Movie Database.",
+ "homepage": "https://github.com/wtfzdotnet/php-tmdb-api",
+ "keywords": [
+ "api",
+ "movie",
+ "php",
+ "tmdb",
+ "tv",
+ "tv show",
+ "tvdb",
+ "wrapper"
+ ],
+ "time": "2015-09-12 21:55:18"
+ },
+ {
+ "name": "phpmailer/phpmailer",
+ "version": "v5.2.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPMailer/PHPMailer.git",
+ "reference": "5dd754112d07ab7480824c2916689ce06f83a842"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/5dd754112d07ab7480824c2916689ce06f83a842",
+ "reference": "5dd754112d07ab7480824c2916689ce06f83a842",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.0.0"
+ },
+ "require-dev": {
+ "phpdocumentor/phpdocumentor": "*",
+ "phpunit/phpunit": "4.3.*"
+ },
+ "suggest": {
+ "league/oauth2-client": "Needed for Gmail's XOAUTH2 authentication system"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "class.phpmailer.php",
+ "class.phpmaileroauth.php",
+ "class.oauth.php",
+ "class.smtp.php",
+ "class.pop3.php",
+ "extras/EasyPeasyICS.php",
+ "extras/ntlm_sasl_client.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1"
+ ],
+ "authors": [
+ {
+ "name": "Jim Jagielski",
+ "email": "jimjag@gmail.com"
+ },
+ {
+ "name": "Marcus Bointon",
+ "email": "phpmailer@synchromedia.co.uk"
+ },
+ {
+ "name": "Andy Prevost",
+ "email": "codeworxtech@users.sourceforge.net"
+ },
+ {
+ "name": "Brent R. Matzelle"
+ }
+ ],
+ "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+ "time": "2015-09-02 10:40:37"
+ },
+ {
+ "name": "pklauzinski/jscroll",
+ "version": "2.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pklauzinski/jscroll.git",
+ "reference": "v2.3.4"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "jquery.jscroll.js"
+ ],
+ "files": [
+ "jquery.jscroll.min.js"
+ ]
+ }
+ }
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
+ "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2015-05-04 20:22:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Psr\\Log\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2012-12-21 11:40:51"
+ },
+ {
+ "name": "react/cache",
+ "version": "v0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/cache.git",
+ "reference": "9882ab5d8b00617baae83c6996f5a34668c11beb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/cache/zipball/9882ab5d8b00617baae83c6996f5a34668c11beb",
+ "reference": "9882ab5d8b00617baae83c6996f5a34668c11beb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "react/promise": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\Cache\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Async caching.",
+ "keywords": [
+ "cache"
+ ],
+ "time": "2014-02-02 01:11:26"
+ },
+ {
+ "name": "react/child-process",
+ "version": "v0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/child-process.git",
+ "reference": "8bf211533bcbb2034e00528a47400367570dc3d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/child-process/zipball/8bf211533bcbb2034e00528a47400367570dc3d7",
+ "reference": "8bf211533bcbb2034e00528a47400367570dc3d7",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "~2.0",
+ "php": ">=5.4.0",
+ "react/event-loop": "0.4.*",
+ "react/stream": "0.4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\ChildProcess\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Library for executing child processes.",
+ "keywords": [
+ "process"
+ ],
+ "time": "2014-02-02 01:11:26"
+ },
+ {
+ "name": "react/dns",
+ "version": "v0.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/dns.git",
+ "reference": "8c5ccc35dcb4b06b70eb9201842363fac7b0f3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/8c5ccc35dcb4b06b70eb9201842363fac7b0f3cf",
+ "reference": "8c5ccc35dcb4b06b70eb9201842363fac7b0f3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "react/cache": "0.4.*",
+ "react/promise": "~2.0",
+ "react/socket": "0.4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\Dns\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Async DNS resolver.",
+ "keywords": [
+ "dns",
+ "dns-resolver"
+ ],
+ "time": "2014-04-12 14:09:10"
+ },
+ {
+ "name": "react/event-loop",
+ "version": "v0.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/event-loop.git",
+ "reference": "18c5297087ca01de85518e2b55078f444144aa1b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/18c5297087ca01de85518e2b55078f444144aa1b",
+ "reference": "18c5297087ca01de85518e2b55078f444144aa1b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "suggest": {
+ "ext-event": "~1.0",
+ "ext-libev": "*",
+ "ext-libevent": ">=0.1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\EventLoop\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Event loop abstraction layer that libraries can use for evented I/O.",
+ "keywords": [
+ "event-loop"
+ ],
+ "time": "2014-02-26 17:36:58"
+ },
+ {
+ "name": "react/http",
+ "version": "v0.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/http.git",
+ "reference": "f575989d67b7db0a65f5dd7e431d8f47af6c2f7b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/http/zipball/f575989d67b7db0a65f5dd7e431d8f47af6c2f7b",
+ "reference": "f575989d67b7db0a65f5dd7e431d8f47af6c2f7b",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "^2.0",
+ "guzzlehttp/psr7": "^1.0",
+ "php": ">=5.4.0",
+ "react/socket": "^0.4",
+ "react/stream": "^0.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\Http\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Library for building an evented http server.",
+ "keywords": [
+ "http"
+ ],
+ "time": "2015-05-21 20:12:09"
+ },
+ {
+ "name": "react/http-client",
+ "version": "v0.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/http-client.git",
+ "reference": "dcb69238f6936f581845a8dfc31bf2ccec6acdd9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/http-client/zipball/dcb69238f6936f581845a8dfc31bf2ccec6acdd9",
+ "reference": "dcb69238f6936f581845a8dfc31bf2ccec6acdd9",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "~2.0",
+ "guzzlehttp/psr7": "^1.0",
+ "php": ">=5.4.0",
+ "react/dns": "0.4.*",
+ "react/event-loop": "0.4.*",
+ "react/socket-client": "0.4.*",
+ "react/stream": "0.4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\HttpClient\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Asynchronous HTTP client library.",
+ "keywords": [
+ "http"
+ ],
+ "time": "2015-08-31 10:25:54"
+ },
+ {
+ "name": "react/promise",
+ "version": "v2.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/promise.git",
+ "reference": "3b6fca09c7d56321057fa8867c8dbe1abf648627"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/3b6fca09c7d56321057fa8867c8dbe1abf648627",
+ "reference": "3b6fca09c7d56321057fa8867c8dbe1abf648627",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com"
+ }
+ ],
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+ "time": "2015-07-03 13:48:55"
+ },
+ {
+ "name": "react/react",
+ "version": "v0.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/react.git",
+ "reference": "457b6b8a16a37c11278cac0870d6d2ff911c5765"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/react/zipball/457b6b8a16a37c11278cac0870d6d2ff911c5765",
+ "reference": "457b6b8a16a37c11278cac0870d6d2ff911c5765",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "react/cache": "0.4.*",
+ "react/child-process": "0.4.*",
+ "react/dns": "0.4.*",
+ "react/event-loop": "0.4.*",
+ "react/http": "0.4.*",
+ "react/http-client": "0.4.*",
+ "react/promise": "~2.1",
+ "react/socket": "0.4.*",
+ "react/socket-client": "0.4.*",
+ "react/stream": "0.4.*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "ext-event": "Allows for use of a more performant event-loop implementation.",
+ "ext-libev": "Allows for use of a more performant event-loop implementation.",
+ "ext-libevent": "Allows for use of a more performant event-loop implementation."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.5-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Nuclear Reactor written in PHP.",
+ "keywords": [
+ "asynchronous",
+ "event-loop",
+ "reactor"
+ ],
+ "time": "2014-12-11 02:06:55"
+ },
+ {
+ "name": "react/socket",
+ "version": "v0.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/socket.git",
+ "reference": "a6acf405ca53fc6cfbfe7c77778ededff46aa7cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/a6acf405ca53fc6cfbfe7c77778ededff46aa7cc",
+ "reference": "a6acf405ca53fc6cfbfe7c77778ededff46aa7cc",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "~2.0",
+ "php": ">=5.4.0",
+ "react/event-loop": "0.4.*",
+ "react/stream": "0.4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\Socket\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Library for building an evented socket server.",
+ "keywords": [
+ "Socket"
+ ],
+ "time": "2014-05-25 17:02:16"
+ },
+ {
+ "name": "react/socket-client",
+ "version": "v0.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/socket-client.git",
+ "reference": "1375dac21b1881cba31c2b38f412dc039566673f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/socket-client/zipball/1375dac21b1881cba31c2b38f412dc039566673f",
+ "reference": "1375dac21b1881cba31c2b38f412dc039566673f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "react/dns": "0.4.*",
+ "react/event-loop": "0.4.*",
+ "react/promise": "~2.0",
+ "react/stream": "0.4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\SocketClient\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Async connector to open TCP/IP and SSL/TLS based connections.",
+ "keywords": [
+ "Socket"
+ ],
+ "time": "2015-03-20 15:24:06"
+ },
+ {
+ "name": "react/stream",
+ "version": "v0.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/stream.git",
+ "reference": "acc7a5fec02e0aea674560e1d13c40ed0c8c5465"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/acc7a5fec02e0aea674560e1d13c40ed0c8c5465",
+ "reference": "acc7a5fec02e0aea674560e1d13c40ed0c8c5465",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "~2.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "react/event-loop": "0.4.*",
+ "react/promise": "~2.0"
+ },
+ "suggest": {
+ "react/event-loop": "0.4.*",
+ "react/promise": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\Stream\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Basic readable and writable stream interfaces that support piping.",
+ "keywords": [
+ "pipe",
+ "stream"
+ ],
+ "time": "2014-09-10 03:32:31"
+ },
+ {
+ "name": "rmccue/requests",
+ "version": "v1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/rmccue/Requests.git",
+ "reference": "6aac485666c2955077d77b796bbdd25f0013a4ea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/rmccue/Requests/zipball/6aac485666c2955077d77b796bbdd25f0013a4ea",
+ "reference": "6aac485666c2955077d77b796bbdd25f0013a4ea",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "satooshi/php-coveralls": "dev-master"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Requests": "library/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Ryan McCue",
+ "homepage": "http://ryanmccue.info"
+ }
+ ],
+ "description": "A HTTP library written in PHP, for human beings.",
+ "homepage": "http://github.com/rmccue/Requests",
+ "keywords": [
+ "curl",
+ "fsockopen",
+ "http",
+ "idna",
+ "ipv6",
+ "iri",
+ "sockets"
+ ],
+ "time": "2014-05-18 04:59:02"
+ },
+ {
+ "name": "robloach/component-installer",
+ "version": "0.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/RobLoach/component-installer.git",
+ "reference": "908a859aa7c4949ba9ad67091e67bac10b66d3d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7",
+ "reference": "908a859aa7c4949ba9ad67091e67bac10b66d3d7",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0",
+ "kriswallsmith/assetic": "1.*",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "composer/composer": "1.*@alpha",
+ "phpunit/phpunit": "4.*"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ },
+ "class": "ComponentInstaller\\ComponentInstallerPlugin"
+ },
+ "autoload": {
+ "psr-0": {
+ "ComponentInstaller": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Rob Loach",
+ "homepage": "http://robloach.net"
+ }
+ ],
+ "description": "Allows installation of Components via Composer.",
+ "time": "2015-08-10 12:35:38"
+ },
+ {
+ "name": "sabre/dav",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-dav.git",
+ "reference": "bb066f3e5ce573a2da552cadee4ef5fb58ec2b05"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/bb066f3e5ce573a2da552cadee4ef5fb58ec2b05",
+ "reference": "bb066f3e5ce573a2da552cadee4ef5fb58ec2b05",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-iconv": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-pcre": "*",
+ "ext-simplexml": "*",
+ "ext-spl": "*",
+ "php": ">=5.4.1",
+ "sabre/event": "~2.0",
+ "sabre/http": "~4.0",
+ "sabre/uri": "~1.0",
+ "sabre/vobject": ">=3.3.4,<4",
+ "sabre/xml": "~1.0"
+ },
+ "require-dev": {
+ "evert/phpdoc-md": "~0.1.0",
+ "phpunit/phpunit": "~4.2",
+ "sabre/cs": "~0.0.2"
+ },
+ "suggest": {
+ "ext-curl": "*",
+ "ext-pdo": "*"
+ },
+ "bin": [
+ "bin/sabredav",
+ "bin/naturalselection"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabre\\DAV\\": "lib/DAV/",
+ "Sabre\\DAVACL\\": "lib/DAVACL/",
+ "Sabre\\CalDAV\\": "lib/CalDAV/",
+ "Sabre\\CardDAV\\": "lib/CardDAV/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "WebDAV Framework for PHP",
+ "homepage": "http://sabre.io/",
+ "keywords": [
+ "CalDAV",
+ "CardDAV",
+ "WebDAV",
+ "framework",
+ "iCalendar"
+ ],
+ "time": "2015-09-04 22:36:51"
+ },
+ {
+ "name": "sabre/event",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-event.git",
+ "reference": "337b6f5e10ea6e0b21e22c7e5788dd3883ae73ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-event/zipball/337b6f5e10ea6e0b21e22c7e5788dd3883ae73ff",
+ "reference": "337b6f5e10ea6e0b21e22c7e5788dd3883ae73ff",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Event\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "sabre/event is a library for lightweight event-based programming",
+ "homepage": "http://sabre.io/event/",
+ "keywords": [
+ "EventEmitter",
+ "events",
+ "hooks",
+ "plugin",
+ "promise",
+ "signal"
+ ],
+ "time": "2015-05-19 10:24:22"
+ },
+ {
+ "name": "sabre/http",
+ "version": "4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-http.git",
+ "reference": "5874c9c449e690242cf32884da9d32a3369a2c78"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-http/zipball/5874c9c449e690242cf32884da9d32a3369a2c78",
+ "reference": "5874c9c449e690242cf32884da9d32a3369a2c78",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.4",
+ "sabre/event": ">=1.0.0,<3.0.0",
+ "sabre/uri": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.3",
+ "sabre/cs": "~0.0.1"
+ },
+ "suggest": {
+ "ext-curl": " to make http requests with the Client class"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Sabre\\HTTP\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
+ "homepage": "https://github.com/fruux/sabre-http",
+ "keywords": [
+ "http"
+ ],
+ "time": "2015-09-04 21:56:22"
+ },
+ {
+ "name": "sabre/uri",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-uri.git",
+ "reference": "6bae7efdd9dfcfdb3edfc4362741e59ce4b64f42"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-uri/zipball/6bae7efdd9dfcfdb3edfc4362741e59ce4b64f42",
+ "reference": "6bae7efdd9dfcfdb3edfc4362741e59ce4b64f42",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Sabre\\Uri\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Functions for making sense out of URIs.",
+ "homepage": "http://sabre.io/uri/",
+ "keywords": [
+ "rfc3986",
+ "uri",
+ "url"
+ ],
+ "time": "2015-04-29 03:47:26"
+ },
+ {
+ "name": "sabre/vobject",
+ "version": "3.4.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-vobject.git",
+ "reference": "7b3690545451159fc608dfac6696110f6770ff5d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/7b3690545451159fc608dfac6696110f6770ff5d",
+ "reference": "7b3690545451159fc608dfac6696110f6770ff5d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "squizlabs/php_codesniffer": "*"
+ },
+ "bin": [
+ "bin/vobject",
+ "bin/generate_vcards"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabre\\VObject\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Dominik Tobschall",
+ "email": "dominik@fruux.com",
+ "homepage": "http://tobschall.de/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "homepage": "http://sabre.io/vobject/",
+ "keywords": [
+ "VObject",
+ "iCalendar",
+ "jCal",
+ "jCard",
+ "vCard"
+ ],
+ "time": "2015-09-04 15:17:58"
+ },
+ {
+ "name": "sabre/xml",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-xml.git",
+ "reference": "a3eeef9f3f13ee42503a1e06e5df3a6fc95b479b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-xml/zipball/a3eeef9f3f13ee42503a1e06e5df3a6fc95b479b",
+ "reference": "a3eeef9f3f13ee42503a1e06e5df3a6fc95b479b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "lib-libxml": ">=2.6.20",
+ "php": ">=5.4.1",
+ "sabre/uri": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Xml\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The Sabre XML parser is the only XML library that you may not hate.",
+ "homepage": "https://sabre.io/xml/",
+ "keywords": [
+ "XMLReader",
+ "XMLWriter",
+ "dom",
+ "xml"
+ ],
+ "time": "2015-08-30 07:57:48"
+ },
+ {
+ "name": "scaron/prettyphoto",
+ "version": "3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/scaron/prettyphoto.git",
+ "reference": "3.1.6"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "js/jquery.prettyPhoto.js"
+ ],
+ "styles": [
+ "css/prettyPhoto.css"
+ ]
+ }
+ }
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v2.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/EventDispatcher.git",
+ "reference": "b58c916f1db03a611b72dd702564f30ad8fe83fa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/b58c916f1db03a611b72dd702564f30ad8fe83fa",
+ "reference": "b58c916f1db03a611b72dd702564f30ad8fe83fa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.0,>=2.0.5",
+ "symfony/dependency-injection": "~2.6",
+ "symfony/expression-language": "~2.6",
+ "symfony/phpunit-bridge": "~2.7",
+ "symfony/stopwatch": "~2.3"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-08-24 07:13:45"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v2.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/HttpFoundation.git",
+ "reference": "7253c2041652353e71560bbd300d6256d170ddaf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/7253c2041652353e71560bbd300d6256d170ddaf",
+ "reference": "7253c2041652353e71560bbd300d6256d170ddaf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/expression-language": "~2.4",
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony HttpFoundation Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-08-27 06:45:45"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v2.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/OptionsResolver.git",
+ "reference": "0240d768d6dba7fd45c293fa90925291b577d2df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/0240d768d6dba7fd45c293fa90925291b577d2df",
+ "reference": "0240d768d6dba7fd45c293fa90925291b577d2df",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony OptionsResolver Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "time": "2015-08-24 07:13:45"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v2.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Process.git",
+ "reference": "f7b3f73f70a7f8f49a1c838dc3debbf054732d8e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Process/zipball/f7b3f73f70a7f8f49a1c838dc3debbf054732d8e",
+ "reference": "f7b3f73f70a7f8f49a1c838dc3debbf054732d8e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-08-27 06:45:45"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v2.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Routing.git",
+ "reference": "20b1378cb6efffb77ea0608232f18c8f0dd25109"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Routing/zipball/20b1378cb6efffb77ea0608232f18c8f0dd25109",
+ "reference": "20b1378cb6efffb77ea0608232f18c8f0dd25109",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "conflict": {
+ "symfony/config": "<2.7"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/common": "~2.2",
+ "psr/log": "~1.0",
+ "symfony/config": "~2.7",
+ "symfony/expression-language": "~2.4",
+ "symfony/http-foundation": "~2.3",
+ "symfony/phpunit-bridge": "~2.7",
+ "symfony/yaml": "~2.0,>=2.0.5"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation loader",
+ "symfony/config": "For using the all-in-one router or any loader",
+ "symfony/expression-language": "For using expression matching",
+ "symfony/yaml": "For using the YAML loader"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Routing Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "time": "2015-08-24 07:13:45"
+ },
+ {
+ "name": "szymach/c-pchart",
+ "version": "1.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/szymach/c-pchart.git",
+ "reference": "1d54c14f8b7295abc87039ba806fed45d29d67d9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/szymach/c-pchart/zipball/1d54c14f8b7295abc87039ba806fed45d29d67d9",
+ "reference": "1d54c14f8b7295abc87039ba806fed45d29d67d9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-gd": "*",
+ "php": ">=5.3.3"
+ },
+ "type": "project",
+ "autoload": {
+ "psr-4": {
+ "CpChart\\": "src/"
+ },
+ "files": [
+ "src/Resources/data/constants.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Port of \"pChart\" library into PHP 5.3.",
+ "homepage": "https://github.com/szymach/c-pchart",
+ "keywords": [
+ "c-pChart",
+ "charts",
+ "composer",
+ "pchart",
+ "statistics"
+ ],
+ "time": "2015-01-28 19:54:53"
+ },
+ {
+ "name": "vakata/jstree",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vakata/jstree.git",
+ "reference": "8ea6ce78bba5fefe4c3233844cbcb22b12826b31"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vakata/jstree/zipball/8ea6ce78bba5fefe4c3233844cbcb22b12826b31",
+ "reference": "8ea6ce78bba5fefe4c3233844cbcb22b12826b31",
+ "shasum": ""
+ },
+ "require": {
+ "components/jquery": ">=1.9.1",
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "dist/jstree.js"
+ ],
+ "styles": [
+ "dist/themes/default/style.css"
+ ],
+ "images": [
+ "dist/themes/default/32px.png",
+ "dist/themes/default/40px.png",
+ "dist/themes/default/throbber.gif"
+ ],
+ "files": [
+ "dist/jstree.min.js",
+ "dist/themes/default/style.min.css",
+ "dist/themes/default/32px.png",
+ "dist/themes/default/40px.png",
+ "dist/themes/default/throbber.gif"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Bozhanov",
+ "email": "jstree@jstree.com"
+ }
+ ],
+ "description": "jsTree is jquery plugin, that provides interactive trees.",
+ "homepage": "http://jstree.com",
+ "time": "2015-08-24 11:32:18"
+ },
+ {
+ "name": "xdan/datetimepicker",
+ "version": "2.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/xdan/datetimepicker.git",
+ "reference": "2.4.5"
+ },
+ "require": {
+ "robloach/component-installer": "*"
+ },
+ "type": "component",
+ "extra": {
+ "component": {
+ "scripts": [
+ "jquery.datetimepicker.js"
+ ],
+ "styles": [
+ "jquery.datetimepicker.css"
+ ]
+ }
+ }
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "bshaffer/php-echonest-api": 20,
+ "krixon/xbmc-php-rpc": 20,
+ "jeromeetienne/jquery-qrcode": 20,
+ "kumailht/responsive-elements": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.3.0"
+ },
+ "platform-dev": []
+}
diff --git a/lib/.htaccess b/lib/.htaccess
index cfd4051d82..36c5d3c712 100644
--- a/lib/.htaccess
+++ b/lib/.htaccess
@@ -1,10 +1,16 @@
# Apache 2.4
';
+ ob_flush();
+ chdir(AmpConfig::get('prefix'));
+ exec('composer install');
+ echo T_('Done') . '
';
+ ob_flush();
+ }
}
diff --git a/lib/class/graph.class.php b/lib/class/graph.class.php
index ded5bcd2d4..b15f0423bf 100644
--- a/lib/class/graph.class.php
+++ b/lib/class/graph.class.php
@@ -22,15 +22,6 @@
class Graph
{
- public function __construct()
- {
- require_once AmpConfig::get('prefix') . '/modules/pChart/pData.class.php';
- require_once AmpConfig::get('prefix') . '/modules/pChart/pDraw.class.php';
- require_once AmpConfig::get('prefix') . '/modules/pChart/pImage.class.php';
-
- return true;
- }
-
protected function get_sql_date_format($field, $zoom)
{
switch ($zoom) {
@@ -336,12 +327,13 @@ protected function render_graph($title, pData $MyData, $zoom, $width = 0, $heigh
/* Add a border to the picture */
$myPicture->drawRectangle(0,0,$width-1,$height-1,array("R"=>0,"G"=>0,"B"=>0));
+ $font_path = AmpConfig::get('prefix')."/lib/vendor/szymach/c-pchart/src/Resources";
/* Write the chart title */
- $myPicture->setFontProperties(array("FontName"=>AmpConfig::get('prefix')."/modules/pChart/fonts/Forgotte.ttf","FontSize"=>11));
+ $myPicture->setFontProperties(array("FontName"=>$font_path."/Forgotte.ttf","FontSize"=>11));
$myPicture->drawText(150,35,$title,array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
/* Set the default font */
- $myPicture->setFontProperties(array("FontName"=>AmpConfig::get('prefix')."/modules/pChart/fonts/pf_arma_five.ttf","FontSize"=>6));
+ $myPicture->setFontProperties(array("FontName"=>$font_path."/pf_arma_five.ttf","FontSize"=>6));
/* Define the chart area */
$myPicture->setGraphArea(60,40,$width-20,$height-50);
diff --git a/lib/class/plugin.class.php b/lib/class/plugin.class.php
index 1c7e6dcb57..6f22850a5e 100644
--- a/lib/class/plugin.class.php
+++ b/lib/class/plugin.class.php
@@ -51,14 +51,19 @@ public function __construct($name)
*/
public function _get_info($name)
{
- /* Require the file we want */
- require_once AmpConfig::get('prefix') . '/modules/plugins/' . $name . '.plugin.php';
-
- $plugin_name = "Ampache$name";
+ try {
+ /* Require the file we want */
+ if (!@include_once(AmpConfig::get('prefix') . '/modules/plugins/' . $name . '.plugin.php')) {
+ return false;
+ }
- $this->_plugin = new $plugin_name();
+ $plugin_name = "Ampache$name";
+ $this->_plugin = new $plugin_name();
- if (!$this->is_valid()) {
+ if (!$this->is_valid()) {
+ return false;
+ }
+ } catch (Exception $ex) {
return false;
}
diff --git a/lib/debug.lib.php b/lib/debug.lib.php
index 6487b16f3d..89b4d6fc26 100644
--- a/lib/debug.lib.php
+++ b/lib/debug.lib.php
@@ -258,6 +258,11 @@ function return_bytes($val)
return $val;
}
+function check_dependencies_folder()
+{
+ return file_exists(AmpConfig::get('prefix') . '/lib/vendor');
+}
+
/**
* check_config_writable
* This checks whether we can write the config file
diff --git a/lib/init-tiny.php b/lib/init-tiny.php
index a64419c169..1452a49840 100644
--- a/lib/init-tiny.php
+++ b/lib/init-tiny.php
@@ -51,11 +51,12 @@
// Define some base level config options
AmpConfig::set('prefix', $prefix);
-// Register the autoloader
+// Register autoloaders
spl_autoload_register(array('Core', 'autoload'), true, true);
-
-require_once $prefix . '/modules/requests/Requests.php';
-Requests::register_autoloader();
+$composer_autoload = $prefix . '/lib/vendor/autoload.php';
+if (file_exists($composer_autoload)) {
+ require_once $prefix . '/lib/vendor/autoload.php';
+}
// Check to see if this is http or https
if ((isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' )
diff --git a/lib/init.php b/lib/init.php
index 0267aea0e7..2771dd316e 100644
--- a/lib/init.php
+++ b/lib/init.php
@@ -53,7 +53,7 @@
// Verify that a few important but commonly disabled PHP functions exist and
// that we're on a usable version
-if (!check_php()) {
+if (!check_php() || !check_dependencies_folder()) {
$link = $path . '/test.php';
}
@@ -72,7 +72,7 @@
$http_type = 'https://';
}
-if ($ow_config) {
+if (isset($ow_config) && is_array($ow_config)) {
foreach ($ow_config as $key => $value) {
$results[$key] = $value;
}
@@ -91,7 +91,9 @@
$results['web_path'];
$results['site_charset'] = $results['site_charset'] ?: 'UTF-8';
$results['raw_web_path'] = $results['raw_web_path'] ?: '/';
-$results['max_upload_size'] = $results['max_upload_size'] ?: 1048576;
+if (!isset($results['max_upload_size'])) {
+ $results['max_upload_size'] = 1048576;
+}
$_SERVER['SERVER_NAME'] = $_SERVER['SERVER_NAME'] ?: '';
if (isset($results['user_ip_cardinality']) && !$results['user_ip_cardinality']) {
@@ -105,24 +107,20 @@
$results['cookie_secure'] = $results['session_cookiesecure'];
// Library and module includes we can't do with the autoloader
-require_once $prefix . '/modules/getid3/getid3.php';
-require_once $prefix . '/modules/phpmailer/class.phpmailer.php';
-require_once $prefix . '/modules/phpmailer/class.smtp.php';
require_once $prefix . '/modules/infotools/AmazonSearchEngine.class.php';
-require_once $prefix . '/modules/musicbrainz/MusicBrainz.php';
-require_once $prefix . '/modules/musicbrainz/Exception.php';
-require_once $prefix . '/modules/musicbrainz/Clients/MbClient.php';
-require_once $prefix . '/modules/musicbrainz/Clients/RequestsMbClient.php';
-require_once $prefix . '/modules/musicbrainz/Artist.php';
-require_once $prefix . '/modules/musicbrainz/Filters/AbstractFilter.php';
-require_once $prefix . '/modules/musicbrainz/Filters/FilterInterface.php';
-require_once $prefix . '/modules/musicbrainz/Filters/ArtistFilter.php';
require_once $prefix . '/modules/ampacheapi/AmpacheApi.lib.php';
-require_once $prefix . '/modules/EchoNest/Autoloader.php';
-EchoNest_Autoloader::register();
-
-require_once $prefix . '/modules/SabreDAV/autoload.php';
+//require_once $prefix . '/lib/vendor/james-heinrich/getid3/getid3/getid3.php';
+//require_once $prefix . '/lib/vendor/phpmailer/phpmailer/class.phpmailer.php';
+//require_once $prefix . '/lib/vendor/phpmailer/phpmailer/class.smtp.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/MusicBrainz.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/Exception.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/Clients/MbClient.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/Clients/RequestsMbClient.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/Artist.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/Filters/AbstractFilter.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/Filters/FilterInterface.php';
+//require_once $prefix . '/lib/vendor/mikealmond/musicbrainz/src/Filters/ArtistFilter.php';
/* Temp Fixes */
$results = Preference::fix_preferences($results);
diff --git a/lib/javascript/.htaccess b/lib/javascript/.htaccess
deleted file mode 100644
index 3b8fa6c55c..0000000000
--- a/lib/javascript/.htaccess
+++ /dev/null
@@ -1,9 +0,0 @@
-# Apache 2.4
-
Auth_OpenID_RAND_SOURCE
as null
, and
- * the code will fall back on a pseudo-random number generator.
- *
- * @param int $num_bytes The length of the return value
- * @return string $bytes random bytes
- */
- static function getBytes($num_bytes)
- {
- static $f = null;
- $bytes = '';
- if ($f === null) {
- if (Auth_OpenID_RAND_SOURCE === null) {
- $f = false;
- } else {
- $f = @fopen(Auth_OpenID_RAND_SOURCE, "r");
- if ($f === false) {
- $msg = 'Define Auth_OpenID_RAND_SOURCE as null to ' .
- ' continue with an insecure random number generator.';
- trigger_error($msg, E_USER_ERROR);
- }
- }
- }
- if ($f === false) {
- // pseudorandom used
- $bytes = '';
- for ($i = 0; $i < $num_bytes; $i += 4) {
- $bytes .= pack('L', mt_rand());
- }
- $bytes = substr($bytes, 0, $num_bytes);
- } else {
- $bytes = fread($f, $num_bytes);
- }
- return $bytes;
- }
-
- /**
- * Produce a string of length random bytes, chosen from chrs. If
- * $chrs is null, the resulting string may contain any characters.
- *
- * @param integer $length The length of the resulting
- * randomly-generated string
- * @param string $chrs A string of characters from which to choose
- * to build the new string
- * @return string $result A string of randomly-chosen characters
- * from $chrs
- */
- static function randomString($length, $population = null)
- {
- if ($population === null) {
- return Auth_OpenID_CryptUtil::getBytes($length);
- }
-
- $popsize = strlen($population);
-
- if ($popsize > 256) {
- $msg = 'More than 256 characters supplied to ' . __FUNCTION__;
- trigger_error($msg, E_USER_ERROR);
- }
-
- $duplicate = 256 % $popsize;
-
- $str = "";
- for ($i = 0; $i < $length; $i++) {
- do {
- $n = ord(Auth_OpenID_CryptUtil::getBytes(1));
- } while ($n < $duplicate);
-
- $n %= $popsize;
- $str .= $population[$n];
- }
-
- return $str;
- }
-
- static function constEq($s1, $s2)
- {
- if (strlen($s1) != strlen($s2)) {
- return false;
- }
-
- $result = true;
- $length = strlen($s1);
- for ($i = 0; $i < $length; $i++) {
- $result &= ($s1[$i] == $s2[$i]);
- }
- return $result;
- }
-}
-
diff --git a/modules/Auth/OpenID/DatabaseConnection.php b/modules/Auth/OpenID/DatabaseConnection.php
deleted file mode 100644
index 0c7d08f916..0000000000
--- a/modules/Auth/OpenID/DatabaseConnection.php
+++ /dev/null
@@ -1,130 +0,0 @@
-
- * @copyright 2005-2008 Janrain, Inc.
- * @license http://www.apache.org/licenses/LICENSE-2.0 Apache
- */
-
-/**
- * An empty base class intended to emulate PEAR connection
- * functionality in applications that supply their own database
- * abstraction mechanisms. See {@link Auth_OpenID_SQLStore} for more
- * information. You should subclass this class if you need to create
- * an SQL store that needs to access its database using an
- * application's database abstraction layer instead of a PEAR database
- * connection. Any subclass of Auth_OpenID_DatabaseConnection MUST
- * adhere to the interface specified here.
- *
- * @package OpenID
- */
-class Auth_OpenID_DatabaseConnection {
- /**
- * Sets auto-commit mode on this database connection.
- *
- * @param bool $mode True if auto-commit is to be used; false if
- * not.
- */
- function autoCommit($mode)
- {
- }
-
- /**
- * Run an SQL query with the specified parameters, if any.
- *
- * @param string $sql An SQL string with placeholders. The
- * placeholders are assumed to be specific to the database engine
- * for this connection.
- *
- * @param array $params An array of parameters to insert into the
- * SQL string using this connection's escaping mechanism.
- *
- * @return mixed $result The result of calling this connection's
- * internal query function. The type of result depends on the
- * underlying database engine. This method is usually used when
- * the result of a query is not important, like a DDL query.
- */
- function query($sql, $params = array())
- {
- }
-
- /**
- * Starts a transaction on this connection, if supported.
- */
- function begin()
- {
- }
-
- /**
- * Commits a transaction on this connection, if supported.
- */
- function commit()
- {
- }
-
- /**
- * Performs a rollback on this connection, if supported.
- */
- function rollback()
- {
- }
-
- /**
- * Run an SQL query and return the first column of the first row
- * of the result set, if any.
- *
- * @param string $sql An SQL string with placeholders. The
- * placeholders are assumed to be specific to the database engine
- * for this connection.
- *
- * @param array $params An array of parameters to insert into the
- * SQL string using this connection's escaping mechanism.
- *
- * @return mixed $result The value of the first column of the
- * first row of the result set. False if no such result was
- * found.
- */
- function getOne($sql, $params = array())
- {
- }
-
- /**
- * Run an SQL query and return the first row of the result set, if
- * any.
- *
- * @param string $sql An SQL string with placeholders. The
- * placeholders are assumed to be specific to the database engine
- * for this connection.
- *
- * @param array $params An array of parameters to insert into the
- * SQL string using this connection's escaping mechanism.
- *
- * @return array $result The first row of the result set, if any,
- * keyed on column name. False if no such result was found.
- */
- function getRow($sql, $params = array())
- {
- }
-
- /**
- * Run an SQL query with the specified parameters, if any.
- *
- * @param string $sql An SQL string with placeholders. The
- * placeholders are assumed to be specific to the database engine
- * for this connection.
- *
- * @param array $params An array of parameters to insert into the
- * SQL string using this connection's escaping mechanism.
- *
- * @return array $result An array of arrays representing the
- * result of the query; each array is keyed on column name.
- */
- function getAll($sql, $params = array())
- {
- }
-}
-
diff --git a/modules/Auth/OpenID/DiffieHellman.php b/modules/Auth/OpenID/DiffieHellman.php
deleted file mode 100644
index 3e25b7dbbb..0000000000
--- a/modules/Auth/OpenID/DiffieHellman.php
+++ /dev/null
@@ -1,113 +0,0 @@
-
- * @copyright 2005-2008 Janrain, Inc.
- * @license http://www.apache.org/licenses/LICENSE-2.0 Apache
- */
-
-require_once 'Auth/OpenID.php';
-require_once 'Auth/OpenID/BigMath.php';
-
-function Auth_OpenID_getDefaultMod()
-{
- return '155172898181473697471232257763715539915724801'.
- '966915404479707795314057629378541917580651227423'.
- '698188993727816152646631438561595825688188889951'.
- '272158842675419950341258706556549803580104870537'.
- '681476726513255747040765857479291291572334510643'.
- '245094715007229621094194349783925984760375594985'.
- '848253359305585439638443';
-}
-
-function Auth_OpenID_getDefaultGen()
-{
- return '2';
-}
-
-/**
- * The Diffie-Hellman key exchange class. This class relies on
- * {@link Auth_OpenID_MathLibrary} to perform large number operations.
- *
- * @access private
- * @package OpenID
- */
-class Auth_OpenID_DiffieHellman {
-
- var $mod;
- var $gen;
- var $private;
- var $lib = null;
-
- function Auth_OpenID_DiffieHellman($mod = null, $gen = null,
- $private = null, $lib = null)
- {
- if ($lib === null) {
- $this->lib = Auth_OpenID_getMathLib();
- } else {
- $this->lib = $lib;
- }
-
- if ($mod === null) {
- $this->mod = $this->lib->init(Auth_OpenID_getDefaultMod());
- } else {
- $this->mod = $mod;
- }
-
- if ($gen === null) {
- $this->gen = $this->lib->init(Auth_OpenID_getDefaultGen());
- } else {
- $this->gen = $gen;
- }
-
- if ($private === null) {
- $r = $this->lib->rand($this->mod);
- $this->private = $this->lib->add($r, 1);
- } else {
- $this->private = $private;
- }
-
- $this->public = $this->lib->powmod($this->gen, $this->private,
- $this->mod);
- }
-
- function getSharedSecret($composite)
- {
- return $this->lib->powmod($composite, $this->private, $this->mod);
- }
-
- function getPublicKey()
- {
- return $this->public;
- }
-
- function usingDefaultValues()
- {
- return ($this->mod == Auth_OpenID_getDefaultMod() &&
- $this->gen == Auth_OpenID_getDefaultGen());
- }
-
- function xorSecret($composite, $secret, $hash_func)
- {
- $dh_shared = $this->getSharedSecret($composite);
- $dh_shared_str = $this->lib->longToBinary($dh_shared);
- $hash_dh_shared = $hash_func($dh_shared_str);
-
- $xsecret = "";
- for ($i = 0; $i < Auth_OpenID::bytes($secret); $i++) {
- $xsecret .= chr(ord($secret[$i]) ^ ord($hash_dh_shared[$i]));
- }
-
- return $xsecret;
- }
-}
-
-
diff --git a/modules/Auth/OpenID/Discover.php b/modules/Auth/OpenID/Discover.php
deleted file mode 100644
index 7b0c640c58..0000000000
--- a/modules/Auth/OpenID/Discover.php
+++ /dev/null
@@ -1,606 +0,0 @@
-claimed_id = null;
- $this->server_url = null;
- $this->type_uris = array();
- $this->local_id = null;
- $this->canonicalID = null;
- $this->used_yadis = false; // whether this came from an XRDS
- $this->display_identifier = null;
- }
-
- function getDisplayIdentifier()
- {
- if ($this->display_identifier) {
- return $this->display_identifier;
- }
- if (! $this->claimed_id) {
- return $this->claimed_id;
- }
- $parsed = parse_url($this->claimed_id);
- $scheme = $parsed['scheme'];
- $host = $parsed['host'];
- $path = $parsed['path'];
- if (array_key_exists('query', $parsed)) {
- $query = $parsed['query'];
- $no_frag = "$scheme://$host$path?$query";
- } else {
- $no_frag = "$scheme://$host$path";
- }
- return $no_frag;
- }
-
- function usesExtension($extension_uri)
- {
- return in_array($extension_uri, $this->type_uris);
- }
-
- function preferredNamespace()
- {
- if (in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris) ||
- in_array(Auth_OpenID_TYPE_2_0, $this->type_uris)) {
- return Auth_OpenID_OPENID2_NS;
- } else {
- return Auth_OpenID_OPENID1_NS;
- }
- }
-
- /*
- * Query this endpoint to see if it has any of the given type
- * URIs. This is useful for implementing other endpoint classes
- * that e.g. need to check for the presence of multiple versions
- * of a single protocol.
- *
- * @param $type_uris The URIs that you wish to check
- *
- * @return all types that are in both in type_uris and
- * $this->type_uris
- */
- function matchTypes($type_uris)
- {
- $result = array();
- foreach ($type_uris as $test_uri) {
- if ($this->supportsType($test_uri)) {
- $result[] = $test_uri;
- }
- }
-
- return $result;
- }
-
- function supportsType($type_uri)
- {
- // Does this endpoint support this type?
- return ((in_array($type_uri, $this->type_uris)) ||
- (($type_uri == Auth_OpenID_TYPE_2_0) &&
- $this->isOPIdentifier()));
- }
-
- function compatibilityMode()
- {
- return $this->preferredNamespace() != Auth_OpenID_OPENID2_NS;
- }
-
- function isOPIdentifier()
- {
- return in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris);
- }
-
- static function fromOPEndpointURL($op_endpoint_url)
- {
- // Construct an OP-Identifier OpenIDServiceEndpoint object for
- // a given OP Endpoint URL
- $obj = new Auth_OpenID_ServiceEndpoint();
- $obj->server_url = $op_endpoint_url;
- $obj->type_uris = array(Auth_OpenID_TYPE_2_0_IDP);
- return $obj;
- }
-
- function parseService($yadis_url, $uri, $type_uris, $service_element)
- {
- // Set the state of this object based on the contents of the
- // service element. Return true if successful, false if not
- // (if findOPLocalIdentifier returns false).
- $this->type_uris = $type_uris;
- $this->server_url = $uri;
- $this->used_yadis = true;
-
- if (!$this->isOPIdentifier()) {
- $this->claimed_id = $yadis_url;
- $this->local_id = Auth_OpenID_findOPLocalIdentifier(
- $service_element,
- $this->type_uris);
- if ($this->local_id === false) {
- return false;
- }
- }
-
- return true;
- }
-
- function getLocalID()
- {
- // Return the identifier that should be sent as the
- // openid.identity_url parameter to the server.
- if ($this->local_id === null && $this->canonicalID === null) {
- return $this->claimed_id;
- } else {
- if ($this->local_id) {
- return $this->local_id;
- } else {
- return $this->canonicalID;
- }
- }
- }
-
- /*
- * Parse the given document as XRDS looking for OpenID consumer services.
- *
- * @return array of Auth_OpenID_ServiceEndpoint or null if the
- * document cannot be parsed.
- */
- function consumerFromXRDS($uri, $xrds_text)
- {
- $xrds =& Auth_Yadis_XRDS::parseXRDS($xrds_text);
-
- if ($xrds) {
- $yadis_services =
- $xrds->services(array('filter_MatchesAnyOpenIDConsumerType'));
- return Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services);
- }
-
- return null;
- }
-
- /*
- * Parse the given document as XRDS looking for OpenID services.
- *
- * @return array of Auth_OpenID_ServiceEndpoint or null if the
- * document cannot be parsed.
- */
- static function fromXRDS($uri, $xrds_text)
- {
- $xrds = Auth_Yadis_XRDS::parseXRDS($xrds_text);
-
- if ($xrds) {
- $yadis_services =
- $xrds->services(array('filter_MatchesAnyOpenIDType'));
- return Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services);
- }
-
- return null;
- }
-
- /*
- * Create endpoints from a DiscoveryResult.
- *
- * @param discoveryResult Auth_Yadis_DiscoveryResult
- * @return array of Auth_OpenID_ServiceEndpoint or null if
- * endpoints cannot be created.
- */
- static function fromDiscoveryResult($discoveryResult)
- {
- if ($discoveryResult->isXRDS()) {
- return Auth_OpenID_ServiceEndpoint::fromXRDS(
- $discoveryResult->normalized_uri,
- $discoveryResult->response_text);
- } else {
- return Auth_OpenID_ServiceEndpoint::fromHTML(
- $discoveryResult->normalized_uri,
- $discoveryResult->response_text);
- }
- }
-
- static function fromHTML($uri, $html)
- {
- $discovery_types = array(
- array(Auth_OpenID_TYPE_2_0,
- 'openid2.provider', 'openid2.local_id'),
- array(Auth_OpenID_TYPE_1_1,
- 'openid.server', 'openid.delegate')
- );
-
- $services = array();
-
- foreach ($discovery_types as $triple) {
- list($type_uri, $server_rel, $delegate_rel) = $triple;
-
- $urls = Auth_OpenID_legacy_discover($html, $server_rel,
- $delegate_rel);
-
- if ($urls === false) {
- continue;
- }
-
- list($delegate_url, $server_url) = $urls;
-
- $service = new Auth_OpenID_ServiceEndpoint();
- $service->claimed_id = $uri;
- $service->local_id = $delegate_url;
- $service->server_url = $server_url;
- $service->type_uris = array($type_uri);
-
- $services[] = $service;
- }
-
- return $services;
- }
-
- function copy()
- {
- $x = new Auth_OpenID_ServiceEndpoint();
-
- $x->claimed_id = $this->claimed_id;
- $x->server_url = $this->server_url;
- $x->type_uris = $this->type_uris;
- $x->local_id = $this->local_id;
- $x->canonicalID = $this->canonicalID;
- $x->used_yadis = $this->used_yadis;
-
- return $x;
- }
-}
-
-function Auth_OpenID_findOPLocalIdentifier($service, $type_uris)
-{
- // Extract a openid:Delegate value from a Yadis Service element.
- // If no delegate is found, returns null. Returns false on
- // discovery failure (when multiple delegate/localID tags have
- // different values).
-
- $service->parser->registerNamespace('openid',
- Auth_OpenID_XMLNS_1_0);
-
- $service->parser->registerNamespace('xrd',
- Auth_Yadis_XMLNS_XRD_2_0);
-
- $parser = $service->parser;
-
- $permitted_tags = array();
-
- if (in_array(Auth_OpenID_TYPE_1_1, $type_uris) ||
- in_array(Auth_OpenID_TYPE_1_0, $type_uris)) {
- $permitted_tags[] = 'openid:Delegate';
- }
-
- if (in_array(Auth_OpenID_TYPE_2_0, $type_uris)) {
- $permitted_tags[] = 'xrd:LocalID';
- }
-
- $local_id = null;
-
- foreach ($permitted_tags as $tag_name) {
- $tags = $service->getElements($tag_name);
-
- foreach ($tags as $tag) {
- $content = $parser->content($tag);
-
- if ($local_id === null) {
- $local_id = $content;
- } else if ($local_id != $content) {
- return false;
- }
- }
- }
-
- return $local_id;
-}
-
-function filter_MatchesAnyOpenIDType($service)
-{
- $uris = $service->getTypes();
-
- foreach ($uris as $uri) {
- if (in_array($uri, Auth_OpenID_getOpenIDTypeURIs())) {
- return true;
- }
- }
-
- return false;
-}
-
-function filter_MatchesAnyOpenIDConsumerType(&$service)
-{
- $uris = $service->getTypes();
-
- foreach ($uris as $uri) {
- if (in_array($uri, Auth_OpenID_getOpenIDConsumerTypeURIs())) {
- return true;
- }
- }
-
- return false;
-}
-
-function Auth_OpenID_bestMatchingService($service, $preferred_types)
-{
- // Return the index of the first matching type, or something
- // higher if no type matches.
- //
- // This provides an ordering in which service elements that
- // contain a type that comes earlier in the preferred types list
- // come before service elements that come later. If a service
- // element has more than one type, the most preferred one wins.
-
- foreach ($preferred_types as $index => $typ) {
- if (in_array($typ, $service->type_uris)) {
- return $index;
- }
- }
-
- return count($preferred_types);
-}
-
-function Auth_OpenID_arrangeByType($service_list, $preferred_types)
-{
- // Rearrange service_list in a new list so services are ordered by
- // types listed in preferred_types. Return the new list.
-
- // Build a list with the service elements in tuples whose
- // comparison will prefer the one with the best matching service
- $prio_services = array();
- foreach ($service_list as $index => $service) {
- $prio_services[] = array(Auth_OpenID_bestMatchingService($service,
- $preferred_types),
- $index, $service);
- }
-
- sort($prio_services);
-
- // Now that the services are sorted by priority, remove the sort
- // keys from the list.
- foreach ($prio_services as $index => $s) {
- $prio_services[$index] = $prio_services[$index][2];
- }
-
- return $prio_services;
-}
-
-// Extract OP Identifier services. If none found, return the rest,
-// sorted with most preferred first according to
-// OpenIDServiceEndpoint.openid_type_uris.
-//
-// openid_services is a list of OpenIDServiceEndpoint objects.
-//
-// Returns a list of OpenIDServiceEndpoint objects."""
-function Auth_OpenID_getOPOrUserServices($openid_services)
-{
- $op_services = Auth_OpenID_arrangeByType($openid_services,
- array(Auth_OpenID_TYPE_2_0_IDP));
-
- $openid_services = Auth_OpenID_arrangeByType($openid_services,
- Auth_OpenID_getOpenIDTypeURIs());
-
- if ($op_services) {
- return $op_services;
- } else {
- return $openid_services;
- }
-}
-
-function Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services)
-{
- $s = array();
-
- if (!$yadis_services) {
- return $s;
- }
-
- foreach ($yadis_services as $service) {
- $type_uris = $service->getTypes();
- $uris = $service->getURIs();
-
- // If any Type URIs match and there is an endpoint URI
- // specified, then this is an OpenID endpoint
- if ($type_uris &&
- $uris) {
- foreach ($uris as $service_uri) {
- $openid_endpoint = new Auth_OpenID_ServiceEndpoint();
- if ($openid_endpoint->parseService($uri,
- $service_uri,
- $type_uris,
- $service)) {
- $s[] = $openid_endpoint;
- }
- }
- }
- }
-
- return $s;
-}
-
-function Auth_OpenID_discoverWithYadis($uri, $fetcher,
- $endpoint_filter='Auth_OpenID_getOPOrUserServices',
- $discover_function=null)
-{
- // Discover OpenID services for a URI. Tries Yadis and falls back
- // on old-style discovery if Yadis fails.
-
- // Might raise a yadis.discover.DiscoveryFailure if no document
- // came back for that URI at all. I don't think falling back to
- // OpenID 1.0 discovery on the same URL will help, so don't bother
- // to catch it.
- if ($discover_function === null) {
- $discover_function = array('Auth_Yadis_Yadis', 'discover');
- }
-
- $openid_services = array();
-
- $response = call_user_func_array($discover_function,
- array($uri, $fetcher));
-
- $yadis_url = $response->normalized_uri;
- $yadis_services = array();
-
- if ($response->isFailure() && !$response->isXRDS()) {
- return array($uri, array());
- }
-
- $openid_services = Auth_OpenID_ServiceEndpoint::fromXRDS(
- $yadis_url,
- $response->response_text);
-
- if (!$openid_services) {
- if ($response->isXRDS()) {
- return Auth_OpenID_discoverWithoutYadis($uri,
- $fetcher);
- }
-
- // Try to parse the response as HTML to get OpenID 1.0/1.1
- //
- $openid_services = Auth_OpenID_ServiceEndpoint::fromHTML(
- $yadis_url,
- $response->response_text);
- }
-
- $openid_services = call_user_func_array($endpoint_filter,
- array($openid_services));
-
- return array($yadis_url, $openid_services);
-}
-
-function Auth_OpenID_discoverURI($uri, $fetcher)
-{
- $uri = Auth_OpenID::normalizeUrl($uri);
- return Auth_OpenID_discoverWithYadis($uri, $fetcher);
-}
-
-function Auth_OpenID_discoverWithoutYadis($uri, $fetcher)
-{
- $http_resp = @$fetcher->get($uri);
-
- if ($http_resp->status != 200 and $http_resp->status != 206) {
- return array($uri, array());
- }
-
- $identity_url = $http_resp->final_url;
-
- // Try to parse the response as HTML to get OpenID 1.0/1.1
- $openid_services = Auth_OpenID_ServiceEndpoint::fromHTML(
- $identity_url,
- $http_resp->body);
-
- return array($identity_url, $openid_services);
-}
-
-function Auth_OpenID_discoverXRI($iname, $fetcher)
-{
- $resolver = new Auth_Yadis_ProxyResolver($fetcher);
- list($canonicalID, $yadis_services) =
- $resolver->query($iname,
- Auth_OpenID_getOpenIDTypeURIs(),
- array('filter_MatchesAnyOpenIDType'));
-
- $openid_services = Auth_OpenID_makeOpenIDEndpoints($iname,
- $yadis_services);
-
- $openid_services = Auth_OpenID_getOPOrUserServices($openid_services);
-
- for ($i = 0; $i < count($openid_services); $i++) {
- $openid_services[$i]->canonicalID = $canonicalID;
- $openid_services[$i]->claimed_id = $canonicalID;
- $openid_services[$i]->display_identifier = $iname;
- }
-
- // FIXME: returned xri should probably be in some normal form
- return array($iname, $openid_services);
-}
-
-function Auth_OpenID_discover($uri, $fetcher)
-{
- // If the fetcher (i.e., PHP) doesn't support SSL, we can't do
- // discovery on an HTTPS URL.
- if ($fetcher->isHTTPS($uri) && !$fetcher->supportsSSL()) {
- return array($uri, array());
- }
-
- if (Auth_Yadis_identifierScheme($uri) == 'XRI') {
- $result = Auth_OpenID_discoverXRI($uri, $fetcher);
- } else {
- $result = Auth_OpenID_discoverURI($uri, $fetcher);
- }
-
- // If the fetcher doesn't support SSL, we can't interact with
- // HTTPS server URLs; remove those endpoints from the list.
- if (!$fetcher->supportsSSL()) {
- $http_endpoints = array();
- list($new_uri, $endpoints) = $result;
-
- foreach ($endpoints as $e) {
- if (!$fetcher->isHTTPS($e->server_url)) {
- $http_endpoints[] = $e;
- }
- }
-
- $result = array($new_uri, $http_endpoints);
- }
-
- return $result;
-}
-
-
diff --git a/modules/Auth/OpenID/DumbStore.php b/modules/Auth/OpenID/DumbStore.php
deleted file mode 100644
index e8f29ace55..0000000000
--- a/modules/Auth/OpenID/DumbStore.php
+++ /dev/null
@@ -1,99 +0,0 @@
-
- * @copyright 2005-2008 Janrain, Inc.
- * @license http://www.apache.org/licenses/LICENSE-2.0 Apache
- */
-
-/**
- * Import the interface for creating a new store class.
- */
-require_once 'Auth/OpenID/Interface.php';
-require_once 'Auth/OpenID/HMAC.php';
-
-/**
- * This is a store for use in the worst case, when you have no way of
- * saving state on the consumer site. Using this store makes the
- * consumer vulnerable to replay attacks, as it's unable to use
- * nonces. Avoid using this store if it is at all possible.
- *
- * Most of the methods of this class are implementation details.
- * Users of this class need to worry only about the constructor.
- *
- * @package OpenID
- */
-class Auth_OpenID_DumbStore extends Auth_OpenID_OpenIDStore {
-
- /**
- * Creates a new {@link Auth_OpenID_DumbStore} instance. For the security
- * of the tokens generated by the library, this class attempts to
- * at least have a secure implementation of getAuthKey.
- *
- * When you create an instance of this class, pass in a secret
- * phrase. The phrase is hashed with sha1 to make it the correct
- * length and form for an auth key. That allows you to use a long
- * string as the secret phrase, which means you can make it very
- * difficult to guess.
- *
- * Each {@link Auth_OpenID_DumbStore} instance that is created for use by
- * your consumer site needs to use the same $secret_phrase.
- *
- * @param string secret_phrase The phrase used to create the auth
- * key returned by getAuthKey
- */
- function Auth_OpenID_DumbStore($secret_phrase)
- {
- $this->auth_key = Auth_OpenID_SHA1($secret_phrase);
- }
-
- /**
- * This implementation does nothing.
- */
- function storeAssociation($server_url, $association)
- {
- }
-
- /**
- * This implementation always returns null.
- */
- function getAssociation($server_url, $handle = null)
- {
- return null;
- }
-
- /**
- * This implementation always returns false.
- */
- function removeAssociation($server_url, $handle)
- {
- return false;
- }
-
- /**
- * In a system truly limited to dumb mode, nonces must all be
- * accepted. This therefore always returns true, which makes
- * replay attacks feasible.
- */
- function useNonce($server_url, $timestamp, $salt)
- {
- return true;
- }
-
- /**
- * This method returns the auth key generated by the constructor.
- */
- function getAuthKey()
- {
- return $this->auth_key;
- }
-}
-
diff --git a/modules/Auth/OpenID/Extension.php b/modules/Auth/OpenID/Extension.php
deleted file mode 100644
index 542a1da261..0000000000
--- a/modules/Auth/OpenID/Extension.php
+++ /dev/null
@@ -1,66 +0,0 @@
-isOpenID1();
- $added = $message->namespaces->addAlias($this->ns_uri,
- $this->ns_alias,
- $implicit);
-
- if ($added === null) {
- if ($message->namespaces->getAlias($this->ns_uri) !=
- $this->ns_alias) {
- return null;
- }
- }
-
- if ($request !== null) {
- $message->updateArgs($this->ns_uri,
- $this->getExtensionArgs($request));
- } else {
- $message->updateArgs($this->ns_uri,
- $this->getExtensionArgs());
- }
- return $message;
- }
-}
-
diff --git a/modules/Auth/OpenID/FileStore.php b/modules/Auth/OpenID/FileStore.php
deleted file mode 100644
index d74f83dcb4..0000000000
--- a/modules/Auth/OpenID/FileStore.php
+++ /dev/null
@@ -1,627 +0,0 @@
-
- * @copyright 2005-2008 Janrain, Inc.
- * @license http://www.apache.org/licenses/LICENSE-2.0 Apache
- */
-
-/**
- * Require base class for creating a new interface.
- */
-require_once 'Auth/OpenID.php';
-require_once 'Auth/OpenID/Interface.php';
-require_once 'Auth/OpenID/HMAC.php';
-require_once 'Auth/OpenID/Nonce.php';
-
-/**
- * This is a filesystem-based store for OpenID associations and
- * nonces. This store should be safe for use in concurrent systems on
- * both windows and unix (excluding NFS filesystems). There are a
- * couple race conditions in the system, but those failure cases have
- * been set up in such a way that the worst-case behavior is someone
- * having to try to log in a second time.
- *
- * Most of the methods of this class are implementation details.
- * People wishing to just use this store need only pay attention to
- * the constructor.
- *
- * @package OpenID
- */
-class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore {
-
- /**
- * Initializes a new {@link Auth_OpenID_FileStore}. This
- * initializes the nonce and association directories, which are
- * subdirectories of the directory passed in.
- *
- * @param string $directory This is the directory to put the store
- * directories in.
- */
- function Auth_OpenID_FileStore($directory)
- {
- if (!Auth_OpenID::ensureDir($directory)) {
- trigger_error('Not a directory and failed to create: '
- . $directory, E_USER_ERROR);
- }
- $directory = realpath($directory);
-
- $this->directory = $directory;
- $this->active = true;
-
- $this->nonce_dir = $directory . DIRECTORY_SEPARATOR . 'nonces';
-
- $this->association_dir = $directory . DIRECTORY_SEPARATOR .
- 'associations';
-
- // Temp dir must be on the same filesystem as the assciations
- // $directory.
- $this->temp_dir = $directory . DIRECTORY_SEPARATOR . 'temp';
-
- $this->max_nonce_age = 6 * 60 * 60; // Six hours, in seconds
-
- if (!$this->_setup()) {
- trigger_error('Failed to initialize OpenID file store in ' .
- $directory, E_USER_ERROR);
- }
- }
-
- function destroy()
- {
- Auth_OpenID_FileStore::_rmtree($this->directory);
- $this->active = false;
- }
-
- /**
- * Make sure that the directories in which we store our data
- * exist.
- *
- * @access private
- */
- function _setup()
- {
- return (Auth_OpenID::ensureDir($this->nonce_dir) &&
- Auth_OpenID::ensureDir($this->association_dir) &&
- Auth_OpenID::ensureDir($this->temp_dir));
- }
-
- /**
- * Create a temporary file on the same filesystem as
- * $this->association_dir.
- *
- * The temporary directory should not be cleaned if there are any
- * processes using the store. If there is no active process using
- * the store, it is safe to remove all of the files in the
- * temporary directory.
- *
- * @return array ($fd, $filename)
- * @access private
- */
- function _mktemp()
- {
- $name = Auth_OpenID_FileStore::_mkstemp($dir = $this->temp_dir);
- $file_obj = @fopen($name, 'wb');
- if ($file_obj !== false) {
- return array($file_obj, $name);
- } else {
- Auth_OpenID_FileStore::_removeIfPresent($name);
- }
- }
-
- function cleanupNonces()
- {
- global $Auth_OpenID_SKEW;
-
- $nonces = Auth_OpenID_FileStore::_listdir($this->nonce_dir);
- $now = time();
-
- $removed = 0;
- // Check all nonces for expiry
- foreach ($nonces as $nonce_fname) {
- $base = basename($nonce_fname);
- $parts = explode('-', $base, 2);
- $timestamp = $parts[0];
- $timestamp = intval($timestamp, 16);
- if (abs($timestamp - $now) > $Auth_OpenID_SKEW) {
- Auth_OpenID_FileStore::_removeIfPresent($nonce_fname);
- $removed += 1;
- }
- }
- return $removed;
- }
-
- /**
- * Create a unique filename for a given server url and
- * handle. This implementation does not assume anything about the
- * format of the handle. The filename that is returned will
- * contain the domain name from the server URL for ease of human
- * inspection of the data directory.
- *
- * @return string $filename
- */
- function getAssociationFilename($server_url, $handle)
- {
- if (!$this->active) {
- trigger_error("FileStore no longer active", E_USER_ERROR);
- return null;
- }
-
- if (strpos($server_url, '://') === false) {
- trigger_error(sprintf("Bad server URL: %s", $server_url),
- E_USER_WARNING);
- return null;
- }
-
- list($proto, $rest) = explode('://', $server_url, 2);
- $parts = explode('/', $rest);
- $domain = Auth_OpenID_FileStore::_filenameEscape($parts[0]);
- $url_hash = Auth_OpenID_FileStore::_safe64($server_url);
- if ($handle) {
- $handle_hash = Auth_OpenID_FileStore::_safe64($handle);
- } else {
- $handle_hash = '';
- }
-
- $filename = sprintf('%s-%s-%s-%s', $proto, $domain, $url_hash,
- $handle_hash);
-
- return $this->association_dir. DIRECTORY_SEPARATOR . $filename;
- }
-
- /**
- * Store an association in the association directory.
- */
- function storeAssociation($server_url, $association)
- {
- if (!$this->active) {
- trigger_error("FileStore no longer active", E_USER_ERROR);
- return false;
- }
-
- $association_s = $association->serialize();
- $filename = $this->getAssociationFilename($server_url,
- $association->handle);
- list($tmp_file, $tmp) = $this->_mktemp();
-
- if (!$tmp_file) {
- trigger_error("_mktemp didn't return a valid file descriptor",
- E_USER_WARNING);
- return false;
- }
-
- fwrite($tmp_file, $association_s);
-
- fflush($tmp_file);
-
- fclose($tmp_file);
-
- if (@rename($tmp, $filename)) {
- return true;
- } else {
- // In case we are running on Windows, try unlinking the
- // file in case it exists.
- @unlink($filename);
-
- // Now the target should not exist. Try renaming again,
- // giving up if it fails.
- if (@rename($tmp, $filename)) {
- return true;
- }
- }
-
- // If there was an error, don't leave the temporary file
- // around.
- Auth_OpenID_FileStore::_removeIfPresent($tmp);
- return false;
- }
-
- /**
- * Retrieve an association. If no handle is specified, return the
- * association with the most recent issue time.
- *
- * @return mixed $association
- */
- function getAssociation($server_url, $handle = null)
- {
- if (!$this->active) {
- trigger_error("FileStore no longer active", E_USER_ERROR);
- return null;
- }
-
- if ($handle === null) {
- $handle = '';
- }
-
- // The filename with the empty handle is a prefix of all other
- // associations for the given server URL.
- $filename = $this->getAssociationFilename($server_url, $handle);
-
- if ($handle) {
- return $this->_getAssociation($filename);
- } else {
- $association_files =
- Auth_OpenID_FileStore::_listdir($this->association_dir);
- $matching_files = array();
-
- // strip off the path to do the comparison
- $name = basename($filename);
- foreach ($association_files as $association_file) {
- $base = basename($association_file);
- if (strpos($base, $name) === 0) {
- $matching_files[] = $association_file;
- }
- }
-
- $matching_associations = array();
- // read the matching files and sort by time issued
- foreach ($matching_files as $full_name) {
- $association = $this->_getAssociation($full_name);
- if ($association !== null) {
- $matching_associations[] = array($association->issued,
- $association);
- }
- }
-
- $issued = array();
- $assocs = array();
- foreach ($matching_associations as $key => $assoc) {
- $issued[$key] = $assoc[0];
- $assocs[$key] = $assoc[1];
- }
-
- array_multisort($issued, SORT_DESC, $assocs, SORT_DESC,
- $matching_associations);
-
- // return the most recently issued one.
- if ($matching_associations) {
- list($issued, $assoc) = $matching_associations[0];
- return $assoc;
- } else {
- return null;
- }
- }
- }
-
- /**
- * @access private
- */
- function _getAssociation($filename)
- {
- if (!$this->active) {
- trigger_error("FileStore no longer active", E_USER_ERROR);
- return null;
- }
-
- if (file_exists($filename) !== true) {
- return null;
- }
-
- $assoc_file = @fopen($filename, 'rb');
-
- if ($assoc_file === false) {
- return null;
- }
-
- $filesize = filesize($filename);
- if ($filesize === false || $filesize <= 0) {
- return null;
- }
-
- $assoc_s = fread($assoc_file, $filesize);
- fclose($assoc_file);
-
- if (!$assoc_s) {
- return null;
- }
-
- $association =
- Auth_OpenID_Association::deserialize('Auth_OpenID_Association',
- $assoc_s);
-
- if (!$association) {
- Auth_OpenID_FileStore::_removeIfPresent($filename);
- return null;
- }
-
- if ($association->getExpiresIn() == 0) {
- Auth_OpenID_FileStore::_removeIfPresent($filename);
- return null;
- } else {
- return $association;
- }
- }
-
- /**
- * Remove an association if it exists. Do nothing if it does not.
- *
- * @return bool $success
- */
- function removeAssociation($server_url, $handle)
- {
- if (!$this->active) {
- trigger_error("FileStore no longer active", E_USER_ERROR);
- return null;
- }
-
- $assoc = $this->getAssociation($server_url, $handle);
- if ($assoc === null) {
- return false;
- } else {
- $filename = $this->getAssociationFilename($server_url, $handle);
- return Auth_OpenID_FileStore::_removeIfPresent($filename);
- }
- }
-
- /**
- * Return whether this nonce is present. As a side effect, mark it
- * as no longer present.
- *
- * @return bool $present
- */
- function useNonce($server_url, $timestamp, $salt)
- {
- global $Auth_OpenID_SKEW;
-
- if (!$this->active) {
- trigger_error("FileStore no longer active", E_USER_ERROR);
- return null;
- }
-
- if ( abs($timestamp - time()) > $Auth_OpenID_SKEW ) {
- return false;
- }
-
- if ($server_url) {
- list($proto, $rest) = explode('://', $server_url, 2);
- } else {
- $proto = '';
- $rest = '';
- }
-
- $parts = explode('/', $rest, 2);
- $domain = $this->_filenameEscape($parts[0]);
- $url_hash = $this->_safe64($server_url);
- $salt_hash = $this->_safe64($salt);
-
- $filename = sprintf('%08x-%s-%s-%s-%s', $timestamp, $proto,
- $domain, $url_hash, $salt_hash);
- $filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $filename;
-
- $result = @fopen($filename, 'x');
-
- if ($result === false) {
- return false;
- } else {
- fclose($result);
- return true;
- }
- }
-
- /**
- * Remove expired entries from the database. This is potentially
- * expensive, so only run when it is acceptable to take time.
- *
- * @access private
- */
- function _allAssocs()
- {
- $all_associations = array();
-
- $association_filenames =
- Auth_OpenID_FileStore::_listdir($this->association_dir);
-
- foreach ($association_filenames as $association_filename) {
- $association_file = fopen($association_filename, 'rb');
-
- if ($association_file !== false) {
- $assoc_s = fread($association_file,
- filesize($association_filename));
- fclose($association_file);
-
- // Remove expired or corrupted associations
- $association =
- Auth_OpenID_Association::deserialize(
- 'Auth_OpenID_Association', $assoc_s);
-
- if ($association === null) {
- Auth_OpenID_FileStore::_removeIfPresent(
- $association_filename);
- } else {
- if ($association->getExpiresIn() == 0) {
- $all_associations[] = array($association_filename,
- $association);
- }
- }
- }
- }
-
- return $all_associations;
- }
-
- function clean()
- {
- if (!$this->active) {
- trigger_error("FileStore no longer active", E_USER_ERROR);
- return null;
- }
-
- $nonces = Auth_OpenID_FileStore::_listdir($this->nonce_dir);
- $now = time();
-
- // Check all nonces for expiry
- foreach ($nonces as $nonce) {
- if (!Auth_OpenID_checkTimestamp($nonce, $now)) {
- $filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $nonce;
- Auth_OpenID_FileStore::_removeIfPresent($filename);
- }
- }
-
- foreach ($this->_allAssocs() as $pair) {
- list($assoc_filename, $assoc) = $pair;
- if ($assoc->getExpiresIn() == 0) {
- Auth_OpenID_FileStore::_removeIfPresent($assoc_filename);
- }
- }
- }
-
- /**
- * @access private
- */
- function _rmtree($dir)
- {
- if ($dir[strlen($dir) - 1] != DIRECTORY_SEPARATOR) {
- $dir .= DIRECTORY_SEPARATOR;
- }
-
- if ($handle = opendir($dir)) {
- while (false !== ($item = readdir($handle))) {
- if (!in_array($item, array('.', '..'))) {
- if (is_dir($dir . $item)) {
-
- if (!Auth_OpenID_FileStore::_rmtree($dir . $item)) {
- return false;
- }
- } else if (is_file($dir . $item)) {
- if (!unlink($dir . $item)) {
- return false;
- }
- }
- }
- }
-
- closedir($handle);
-
- if (!@rmdir($dir)) {
- return false;
- }
-
- return true;
- } else {
- // Couldn't open directory.
- return false;
- }
- }
-
- /**
- * @access private
- */
- function _mkstemp($dir)
- {
- foreach (range(0, 4) as $i) {
- $name = tempnam($dir, "php_openid_filestore_");
-
- if ($name !== false) {
- return $name;
- }
- }
- return false;
- }
-
- /**
- * @access private
- */
- static function _mkdtemp($dir)
- {
- foreach (range(0, 4) as $i) {
- $name = $dir . strval(DIRECTORY_SEPARATOR) . strval(getmypid()) .
- "-" . strval(rand(1, time()));
- if (!mkdir($name, 0700)) {
- return false;
- } else {
- return $name;
- }
- }
- return false;
- }
-
- /**
- * @access private
- */
- function _listdir($dir)
- {
- $handle = opendir($dir);
- $files = array();
- while (false !== ($filename = readdir($handle))) {
- if (!in_array($filename, array('.', '..'))) {
- $files[] = $dir . DIRECTORY_SEPARATOR . $filename;
- }
- }
- return $files;
- }
-
- /**
- * @access private
- */
- function _isFilenameSafe($char)
- {
- $_Auth_OpenID_filename_allowed = Auth_OpenID_letters .
- Auth_OpenID_digits . ".";
- return (strpos($_Auth_OpenID_filename_allowed, $char) !== false);
- }
-
- /**
- * @access private
- */
- function _safe64($str)
- {
- $h64 = base64_encode(Auth_OpenID_SHA1($str));
- $h64 = str_replace('+', '_', $h64);
- $h64 = str_replace('/', '.', $h64);
- $h64 = str_replace('=', '', $h64);
- return $h64;
- }
-
- /**
- * @access private
- */
- function _filenameEscape($str)
- {
- $filename = "";
- $b = Auth_OpenID::toBytes($str);
-
- for ($i = 0; $i < count($b); $i++) {
- $c = $b[$i];
- if (Auth_OpenID_FileStore::_isFilenameSafe($c)) {
- $filename .= $c;
- } else {
- $filename .= sprintf("_%02X", ord($c));
- }
- }
- return $filename;
- }
-
- /**
- * Attempt to remove a file, returning whether the file existed at
- * the time of the call.
- *
- * @access private
- * @return bool $result True if the file was present, false if not.
- */
- function _removeIfPresent($filename)
- {
- return @unlink($filename);
- }
-
- function cleanupAssociations()
- {
- $removed = 0;
- foreach ($this->_allAssocs() as $pair) {
- list($assoc_filename, $assoc) = $pair;
- if ($assoc->getExpiresIn() == 0) {
- $this->_removeIfPresent($assoc_filename);
- $removed += 1;
- }
- }
- return $removed;
- }
-}
-
-
diff --git a/modules/Auth/OpenID/HMAC.php b/modules/Auth/OpenID/HMAC.php
deleted file mode 100644
index e6c4bdfd9d..0000000000
--- a/modules/Auth/OpenID/HMAC.php
+++ /dev/null
@@ -1,105 +0,0 @@
-
- * @copyright 2005-2008 Janrain, Inc.
- * @license http://www.apache.org/licenses/LICENSE-2.0 Apache
- */
-
-require_once 'Auth/OpenID.php';
-
-/**
- * SHA1_BLOCKSIZE is this module's SHA1 blocksize used by the fallback
- * implementation.
- */
-define('Auth_OpenID_SHA1_BLOCKSIZE', 64);
-
-function Auth_OpenID_SHA1($text)
-{
- if (function_exists('hash') &&
- function_exists('hash_algos') &&
- (in_array('sha1', hash_algos()))) {
- // PHP 5 case (sometimes): 'hash' available and 'sha1' algo
- // supported.
- return hash('sha1', $text, true);
- } else if (function_exists('sha1')) {
- // PHP 4 case: 'sha1' available.
- $hex = sha1($text);
- $raw = '';
- for ($i = 0; $i < 40; $i += 2) {
- $hexcode = substr($hex, $i, 2);
- $charcode = (int)base_convert($hexcode, 16, 10);
- $raw .= chr($charcode);
- }
- return $raw;
- } else {
- // Explode.
- trigger_error('No SHA1 function found', E_USER_ERROR);
- }
-}
-
-/**
- * Compute an HMAC/SHA1 hash.
- *
- * @access private
- * @param string $key The HMAC key
- * @param string $text The message text to hash
- * @return string $mac The MAC
- */
-function Auth_OpenID_HMACSHA1($key, $text)
-{
- if (Auth_OpenID::bytes($key) > Auth_OpenID_SHA1_BLOCKSIZE) {
- $key = Auth_OpenID_SHA1($key, true);
- }
-
- if (function_exists('hash_hmac') &&
- function_exists('hash_algos') &&
- (in_array('sha1', hash_algos()))) {
- return hash_hmac('sha1', $text, $key, true);
- }
- // Home-made solution
-
- $key = str_pad($key, Auth_OpenID_SHA1_BLOCKSIZE, chr(0x00));
- $ipad = str_repeat(chr(0x36), Auth_OpenID_SHA1_BLOCKSIZE);
- $opad = str_repeat(chr(0x5c), Auth_OpenID_SHA1_BLOCKSIZE);
- $hash1 = Auth_OpenID_SHA1(($key ^ $ipad) . $text, true);
- $hmac = Auth_OpenID_SHA1(($key ^ $opad) . $hash1, true);
- return $hmac;
-}
-
-if (function_exists('hash') &&
- function_exists('hash_algos') &&
- (in_array('sha256', hash_algos()))) {
- function Auth_OpenID_SHA256($text)
- {
- // PHP 5 case: 'hash' available and 'sha256' algo supported.
- return hash('sha256', $text, true);
- }
- define('Auth_OpenID_SHA256_SUPPORTED', true);
-} else {
- define('Auth_OpenID_SHA256_SUPPORTED', false);
-}
-
-if (function_exists('hash_hmac') &&
- function_exists('hash_algos') &&
- (in_array('sha256', hash_algos()))) {
-
- function Auth_OpenID_HMACSHA256($key, $text)
- {
- // Return raw MAC (not hex string).
- return hash_hmac('sha256', $text, $key, true);
- }
-
- define('Auth_OpenID_HMACSHA256_SUPPORTED', true);
-} else {
- define('Auth_OpenID_HMACSHA256_SUPPORTED', false);
-}
-
diff --git a/modules/Auth/OpenID/Interface.php b/modules/Auth/OpenID/Interface.php
deleted file mode 100644
index eca6b9c50f..0000000000
--- a/modules/Auth/OpenID/Interface.php
+++ /dev/null
@@ -1,196 +0,0 @@
-
- * @copyright 2005-2008 Janrain, Inc.
- * @license http://www.apache.org/licenses/LICENSE-2.0 Apache
- */
-
-/**
- * This is the interface for the store objects the OpenID library
- * uses. It is a single class that provides all of the persistence
- * mechanisms that the OpenID library needs, for both servers and
- * consumers. If you want to create an SQL-driven store, please see
- * then {@link Auth_OpenID_SQLStore} class.
- *
- * Change: Version 2.0 removed the storeNonce, getAuthKey, and isDumb
- * methods, and changed the behavior of the useNonce method to support
- * one-way nonces.
- *
- * @package OpenID
- * @author JanRain, Inc.