Файловый менеджер - Редактировать - /home/tuudkjt/globeasy/wp-includes/ID3/gaalferov.tar
Назад
php-ext-domain-connect/composer.lock 0000777 00000210655 15252274046 0013555 0 ustar 00 { "_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#installing-dependencies", "This file is @generated automatically" ], "content-hash": "447e5eaf969862541058484d03cc113a", "packages": [ { "name": "guzzlehttp/guzzle", "version": "6.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", "php": ">=5.5" }, "require-dev": { "ext-curl": "*", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.1" }, "suggest": { "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "branch-alias": { "dev-master": "6.5-dev" } }, "autoload": { "psr-4": { "GuzzleHttp\\": "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": "Guzzle is a PHP HTTP client library", "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", "rest", "web service" ], "time": "2019-12-23T11:57:10+00:00" }, { "name": "guzzlehttp/promises", "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", "shasum": "" }, "require": { "php": ">=5.5.0" }, "require-dev": { "phpunit/phpunit": "^4.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.4-dev" } }, "autoload": { "psr-4": { "GuzzleHttp\\Promise\\": "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": "Guzzle promises library", "keywords": [ "promise" ], "time": "2016-12-20T10:07:11+00:00" }, { "name": "guzzlehttp/psr7", "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", "reference": "239400de7a173fe9901b9ac7c06497751f00727a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", "reference": "239400de7a173fe9901b9ac7c06497751f00727a", "shasum": "" }, "require": { "php": ">=5.4.0", "psr/http-message": "~1.0", "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { "ext-zlib": "*", "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, "suggest": { "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.6-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" }, { "name": "Tobias Schultze", "homepage": "https://github.com/Tobion" } ], "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ "http", "message", "psr-7", "request", "response", "stream", "uri", "url" ], "time": "2019-07-01T23:21:34+00:00" }, { "name": "layershifter/tld-database", "version": "1.0.69", "source": { "type": "git", "url": "https://github.com/layershifter/TLDDatabase.git", "reference": "7423c7acdc5147268fb856f532a5d8875f6fe41e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/layershifter/TLDDatabase/zipball/7423c7acdc5147268fb856f532a5d8875f6fe41e", "reference": "7423c7acdc5147268fb856f532a5d8875f6fe41e", "shasum": "" }, "require": { "ext-curl": "*", "layershifter/tld-support": "^1.0.0", "php": "^5.5.0 || ^7.0" }, "require-dev": { "codeclimate/php-test-reporter": "dev-master", "mikey179/vfsstream": "^1.6", "phpmd/phpmd": "@stable", "phpunit/phpunit": "^4.8 || ^5.0", "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "autoload": { "psr-4": { "LayerShifter\\TLDDatabase\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], "authors": [ { "name": "Alexander Fedyashov", "email": "a@fedyashov.com" } ], "description": "Database abstraction for Public Suffix List", "keywords": [ "PSL", "Public Suffix List", "domain database", "tld database" ], "time": "2019-08-04T10:03:36+00:00" }, { "name": "layershifter/tld-extract", "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/layershifter/TLDExtract.git", "reference": "b49cb89a4ed59a9474a47589054e56ce57787348" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/layershifter/TLDExtract/zipball/b49cb89a4ed59a9474a47589054e56ce57787348", "reference": "b49cb89a4ed59a9474a47589054e56ce57787348", "shasum": "" }, "require": { "layershifter/tld-database": "^1.0", "layershifter/tld-support": "^1.1", "php": "^5.5.0 || ^7.0", "symfony/polyfill-intl-idn": "^1.10" }, "require-dev": { "phpmd/phpmd": "@stable", "phpunit/phpunit": "^4.8 || ^5.0", "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "autoload": { "files": [ "src/static.php" ], "psr-4": { "LayerShifter\\TLDExtract\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], "authors": [ { "name": "Alexander Fedyashov", "email": "a@fedyashov.com" } ], "description": "TLDExtract, library for extracting parts of domain, e.q. domain parser", "keywords": [ "TLDExtract", "domain parser" ], "abandoned": true, "time": "2019-02-11T14:37:05+00:00" }, { "name": "layershifter/tld-support", "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/layershifter/TLDSupport.git", "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/layershifter/TLDSupport/zipball/9b9eb2350db82239289f4e6eb250a2fe4865b0db", "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db", "shasum": "" }, "require": { "php": ">=5.5", "symfony/polyfill-mbstring": "^1.2" }, "require-dev": { "codeclimate/php-test-reporter": "dev-master", "phpmd/phpmd": "@stable", "phpunit/phpunit": "4.8.*", "squizlabs/php_codesniffer": "2.*" }, "type": "library", "autoload": { "psr-4": { "LayerShifter\\TLDSupport\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], "authors": [ { "name": "Alexander Fedyashov", "email": "a@fedyashov.com" } ], "description": "Support package for TLDDatabase and TLDExtract", "abandoned": true, "time": "2016-06-18T12:28:04+00:00" }, { "name": "psr/http-message", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "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", "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", "psr", "psr-7", "request", "response" ], "time": "2016-08-06T14:39:51+00:00" }, { "name": "ralouphie/getallheaders", "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { "php": ">=5.6" }, "require-dev": { "php-coveralls/php-coveralls": "^2.1", "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", "autoload": { "files": [ "src/getallheaders.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ralph Khattar", "email": "ralph.khattar@gmail.com" } ], "description": "A polyfill for getallheaders.", "time": "2019-03-08T08:55:37+00:00" }, { "name": "symfony/polyfill-intl-idn", "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6842f1a39cf7d580655688069a03dd7cd83d244a", "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php72": "^1.10" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.14-dev" } }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Laurent Bassin", "email": "laurent@bassin.info" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "idn", "intl", "polyfill", "portable", "shim" ], "time": "2020-01-17T12:01:36+00:00" }, { "name": "symfony/polyfill-mbstring", "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2", "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2", "shasum": "" }, "require": { "php": ">=5.3.3" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.14-dev" } }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", "mbstring", "polyfill", "portable", "shim" ], "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/polyfill-php72", "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.14-dev" } }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "time": "2020-01-13T11:15:53+00:00" } ], "packages-dev": [ { "name": "doctrine/instantiator", "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { "php": ">=5.3,<8.0-DEV" }, "require-dev": { "athletic/athletic": "~0.1.8", "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", "homepage": "http://ocramius.github.com/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", "homepage": "https://github.com/doctrine/instantiator", "keywords": [ "constructor", "instantiate" ], "time": "2015-06-14T21:17:01+00:00" }, { "name": "myclabs/deep-copy", "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", "shasum": "" }, "require": { "php": "^5.6 || ^7.0" }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", "phpunit/phpunit": "^4.1" }, "type": "library", "autoload": { "psr-4": { "DeepCopy\\": "src/DeepCopy/" }, "files": [ "src/DeepCopy/deep_copy.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "time": "2017-10-19T19:58:43+00:00" }, { "name": "phpdocumentor/reflection-common", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "shasum": "" }, "require": { "php": ">=5.5" }, "require-dev": { "phpunit/phpunit": "^4.6" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ "src" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jaap van Otterdijk", "email": "opensource@ijaap.nl" } ], "description": "Common reflection classes used by phpdocumentor to reflect the code structure", "homepage": "http://www.phpdoc.org", "keywords": [ "FQSEN", "phpDocumentor", "phpdoc", "reflection", "static analysis" ], "time": "2017-09-11T18:02:19+00:00" }, { "name": "phpdocumentor/reflection-docblock", "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", "shasum": "" }, "require": { "php": "^5.6 || ^7.0", "phpdocumentor/reflection-common": "^1.0.0", "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { "mockery/mockery": "^0.9.4", "phpunit/phpunit": "^4.4" }, "type": "library", "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "time": "2017-11-10T14:09:06+00:00" }, { "name": "phpdocumentor/type-resolver", "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", "shasum": "" }, "require": { "php": "^5.5 || ^7.0", "phpdocumentor/reflection-common": "^1.0" }, "require-dev": { "mockery/mockery": "^0.9.4", "phpunit/phpunit": "^5.2||^4.8.24" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "time": "2017-07-14T14:27:02+00:00" }, { "name": "phpspec/prophecy", "version": "v1.10.2", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9", "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" }, "require-dev": { "phpspec/phpspec": "^2.5 || ^3.2", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.10.x-dev" } }, "autoload": { "psr-4": { "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", "homepage": "http://everzet.com" }, { "name": "Marcello Duarte", "email": "marcello.duarte@gmail.com" } ], "description": "Highly opinionated mocking framework for PHP 5.3+", "homepage": "https://github.com/phpspec/prophecy", "keywords": [ "Double", "Dummy", "fake", "mock", "spy", "stub" ], "time": "2020-01-20T15:57:02+00:00" }, { "name": "phpunit/php-code-coverage", "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", "php": "^5.6 || ^7.0", "phpunit/php-file-iterator": "^1.3", "phpunit/php-text-template": "^1.2", "phpunit/php-token-stream": "^1.4.2 || ^2.0", "sebastian/code-unit-reverse-lookup": "^1.0", "sebastian/environment": "^1.3.2 || ^2.0", "sebastian/version": "^1.0 || ^2.0" }, "require-dev": { "ext-xdebug": "^2.1.4", "phpunit/phpunit": "^5.7" }, "suggest": { "ext-xdebug": "^2.5.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "time": "2017-04-02T07:44:40+00:00" }, { "name": "phpunit/php-file-iterator", "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.4.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "time": "2017-11-27T13:52:08+00:00" }, { "name": "phpunit/php-text-template", "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", "version": "1.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", "shasum": "" }, "require": { "php": "^5.3.3 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "time": "2017-02-26T11:10:40+00:00" }, { "name": "phpunit/php-token-stream", "version": "1.4.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.4-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Wrapper around PHP's tokenizer extension.", "homepage": "https://github.com/sebastianbergmann/php-token-stream/", "keywords": [ "tokenizer" ], "time": "2017-12-04T08:55:13+00:00" }, { "name": "phpunit/phpunit", "version": "5.7.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "myclabs/deep-copy": "~1.3", "php": "^5.6 || ^7.0", "phpspec/prophecy": "^1.6.2", "phpunit/php-code-coverage": "^4.0.4", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "^3.2", "sebastian/comparator": "^1.2.4", "sebastian/diff": "^1.4.3", "sebastian/environment": "^1.3.4 || ^2.0", "sebastian/exporter": "~2.0", "sebastian/global-state": "^1.1", "sebastian/object-enumerator": "~2.0", "sebastian/resource-operations": "~1.0", "sebastian/version": "^1.0.6|^2.0.1", "symfony/yaml": "~2.1|~3.0|~4.0" }, "conflict": { "phpdocumentor/reflection-docblock": "3.0.2" }, "require-dev": { "ext-pdo": "*" }, "suggest": { "ext-xdebug": "*", "phpunit/php-invoker": "~1.1" }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-master": "5.7.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "time": "2018-02-01T05:50:59+00:00" }, { "name": "phpunit/phpunit-mock-objects", "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.6 || ^7.0", "phpunit/php-text-template": "^1.2", "sebastian/exporter": "^1.2 || ^2.0" }, "conflict": { "phpunit/phpunit": "<5.4.0" }, "require-dev": { "phpunit/phpunit": "^5.4" }, "suggest": { "ext-soap": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.2.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Mock Object library for PHPUnit", "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", "keywords": [ "mock", "xunit" ], "abandoned": true, "time": "2017-06-30T09:13:00+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", "shasum": "" }, "require": { "php": "^5.6 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "time": "2017-03-04T06:30:41+00:00" }, { "name": "sebastian/comparator", "version": "1.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/diff": "~1.2", "sebastian/exporter": "~1.2 || ~2.0" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "http://www.github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", "shasum": "" }, "require": { "php": "^5.3.3 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.4-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff" ], "time": "2017-05-22T07:24:03+00:00" }, { "name": "sebastian/environment", "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", "shasum": "" }, "require": { "php": "^5.6 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^5.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", "hhvm" ], "time": "2016-11-26T07:53:53+00:00" }, { "name": "sebastian/exporter", "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/recursion-context": "~2.0" }, "require-dev": { "ext-mbstring": "*", "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "http://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "time": "2016-11-19T08:54:04+00:00" }, { "name": "sebastian/global-state", "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "suggest": { "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Snapshotting of global state", "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "time": "2015-10-12T03:26:01+00:00" }, { "name": "sebastian/object-enumerator", "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", "shasum": "" }, "require": { "php": ">=5.6", "sebastian/recursion-context": "~2.0" }, "require-dev": { "phpunit/phpunit": "~5" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "time": "2017-02-18T15:18:39+00:00" }, { "name": "sebastian/recursion-context", "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "time": "2016-11-19T07:33:16+00:00" }, { "name": "sebastian/resource-operations", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", "shasum": "" }, "require": { "php": ">=5.6.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "time": "2015-07-28T20:34:47+00:00" }, { "name": "sebastian/version", "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", "shasum": "" }, "require": { "php": ">=5.6" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "time": "2016-10-03T07:35:21+00:00" }, { "name": "symfony/polyfill-ctype", "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", "shasum": "" }, "require": { "php": ">=5.3.3" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.14-dev" } }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "ctype", "polyfill", "portable" ], "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/yaml", "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", "reference": "aa46bc2233097d5212332c907f9911533acfbf80" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/yaml/zipball/aa46bc2233097d5212332c907f9911533acfbf80", "reference": "aa46bc2233097d5212332c907f9911533acfbf80", "shasum": "" }, "require": { "php": "^5.5.9|>=7.0.8", "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" }, "require-dev": { "symfony/console": "~3.4|~4.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.4-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "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 Yaml Component", "homepage": "https://symfony.com", "time": "2020-01-13T08:00:59+00:00" }, { "name": "webmozart/assert", "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", "reference": "aed98a490f9a8f78468232db345ab9cf606cf598" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598", "reference": "aed98a490f9a8f78468232db345ab9cf606cf598", "shasum": "" }, "require": { "php": "^5.3.3 || ^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "vimeo/psalm": "<3.6.0" }, "require-dev": { "phpunit/phpunit": "^4.8.36 || ^7.5.13" }, "type": "library", "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ "assert", "check", "validate" ], "time": "2020-02-14T12:15:55+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=5.6", "ext-json": "*", "ext-openssl": "*" }, "platform-dev": [] } php-ext-domain-connect/composer.json 0000777 00000001316 15252274046 0013566 0 ustar 00 { "name": "gaalferov/php-ext-domain-connect", "description": "PHP extension for Domain Connect", "authors": [ { "name": "Hennadii Alforov", "email": "a@gaalferov.com" } ], "type": "project", "license": "MIT", "autoload": { "psr-4": { "DomainConnect\\": "src/", "Tests\\": "tests/" } }, "require": { "php": ">=5.6", "ext-json": "*", "ext-openssl": "*", "guzzlehttp/guzzle": "^6.3", "layershifter/tld-extract": "^2.0" }, "require-dev": { "phpunit/phpunit": "^5" }, "scripts": { "tests": "php vendor/bin/phpunit ./tests", "cs-audit": "php-cs-fixer fix -v --diff --dry-run", "cs-fix": "php-cs-fixer fix -v --diff" } } php-ext-domain-connect/src/Exception/InvalidPrivateKeyException.php 0000777 00000000233 15252274046 0021550 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class InvalidPrivateKeyException */ class InvalidPrivateKeyException extends DomainConnectException { } php-ext-domain-connect/src/Exception/ApplyException.php 0000777 00000000203 15252274046 0017240 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class ApplyException */ class ApplyException extends DomainConnectException { } php-ext-domain-connect/src/Exception/InvalidDomainConnectSettingsException.php 0000777 00000000261 15252274046 0023730 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class InvalidDomainConnectSettingsException */ class InvalidDomainConnectSettingsException extends DomainConnectException { } php-ext-domain-connect/src/Exception/TemplateNotSupportedException.php 0000777 00000000241 15252274046 0022317 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class TemplateNotSupportedException */ class TemplateNotSupportedException extends DomainConnectException { } php-ext-domain-connect/src/Exception/AsyncTokenException.php 0000777 00000000215 15252274046 0020234 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class AsyncTokenException */ class AsyncTokenException extends DomainConnectException { } php-ext-domain-connect/src/Exception/NoDomainConnectSettingsException.php 0000777 00000000247 15252274046 0022722 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class NoDomainConnectSettingsException */ class NoDomainConnectSettingsException extends DomainConnectException { } php-ext-domain-connect/src/Exception/DomainConnectException.php 0000777 00000000324 15252274046 0020700 0 ustar 00 <?php namespace DomainConnect\Exception; use Exception; /** * Class DomainException * * This defines the base class for all Domain Connect exceptions. */ class DomainConnectException extends Exception { } php-ext-domain-connect/src/Exception/NoDomainConnectRecordException.php 0000777 00000000243 15252274046 0022334 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class NoDomainConnectRecordException */ class NoDomainConnectRecordException extends DomainConnectException { } php-ext-domain-connect/src/Exception/ConflictOnApplyException.php 0000777 00000000227 15252274046 0021225 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class ConflictOnApplyException */ class ConflictOnApplyException extends DomainConnectException { } php-ext-domain-connect/src/Exception/InvalidDomainException.php 0000777 00000000223 15252274046 0020673 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class InvalidDomainException */ class InvalidDomainException extends DomainConnectException { } php-ext-domain-connect/src/Exception/TemplateDoesNotExistException.php 0000777 00000000241 15252274046 0022241 0 ustar 00 <?php namespace DomainConnect\Exception; /** * Class TemplateDoesNotExistException */ class TemplateDoesNotExistException extends DomainConnectException { } php-ext-domain-connect/src/Services/Utils/DnsUtils.php 0000777 00000004602 15252274046 0016775 0 ustar 00 <?php namespace DomainConnect\Services\Utils; use DomainConnect\Exception\NoDomainConnectRecordException; /** * Class DnsUtils */ class DnsUtils { /** * Get DNS_A record * * @param $domain string Domain name * * @return string * @throws NoDomainConnectRecordException */ public function getARecord($domain) { $dnsRecord = $this->getDnsRecordsByType($domain, DNS_A | DNS_AAAA); if (!isset($dnsRecord[0]['ip']) && !isset($dnsRecord[0]['ipv6'])) { throw new NoDomainConnectRecordException("Couldn't find A/AAAA DNS record for {$domain}."); } return $dnsRecord[0]['ip'] ?: $dnsRecord[0]['ipv6']; } /** * Get DNS_TXT records * * @param $domain string Domain name * * @return array * @throws NoDomainConnectRecordException */ public function getTxtRecords($domain) { $txtRecords = array_filter(array_map( function ($record) { return $record['txt']; }, $this->getDnsRecordsByType($domain, DNS_TXT) )); if (empty($txtRecords)) { throw new NoDomainConnectRecordException("Couldn't find TXT DNS records for {$domain}."); } return $txtRecords; } /** * Get DNS_MX record * * @param $domain string Domain name * * @return array * @throws NoDomainConnectRecordException */ public function getMxRecord($domain) { $dnsRecord = $this->getDnsRecordsByType($domain, DNS_MX); if (!isset($dnsRecord[0]['host'])) { throw new NoDomainConnectRecordException("Couldn't find MX DNS record for {$domain}."); } return [ 'host' => $dnsRecord[0]['host'], 'ip' => $this->getARecord($dnsRecord[0]['host']), 'priority' => $dnsRecord[0]['pri'] ]; } /** * Get DNS Records by type * * @param $domain * @param $type * * @return array * @throws NoDomainConnectRecordException */ private function getDnsRecordsByType($domain, $type) { $dnsRecord = @dns_get_record($domain, $type); if (false === $dnsRecord) { $error = error_get_last()['message']; throw new NoDomainConnectRecordException("Failed to resolve {$domain}: {$error}"); } return $dnsRecord; } } php-ext-domain-connect/src/Services/TemplateService.php 0000777 00000011664 15252274046 0017232 0 ustar 00 <?php namespace DomainConnect\Services; use DomainConnect\DTO\DomainSettings; use DomainConnect\Exception\InvalidDomainConnectSettingsException; use DomainConnect\Exception\InvalidPrivateKeyException; use DomainConnect\Exception\TemplateNotSupportedException; use GuzzleHttp\Client; use GuzzleHttp\Exception\ClientException; /** * Class TemplateService */ class TemplateService { /** * This URL is be used by the Service Provider to determine if the DNS Provider supports a specific * template through the synchronous flow. * * @var string {urlAPI}/v2/domainTemplates/providers/{providerId}/services/{serviceId} */ const TEMPLATE_CHECK_URL = '%s/v2/domainTemplates/providers/%s/services/%s'; /** * This is the URL where the user is sent to apply a template to a domain they own. * It is called from the Service Provider to start the synchronous Domain Connect Protocol. * * @var string {urlSyncUX}/v2/domainTemplates/providers/{providerId}/services/{serviceId}/apply?[properties] */ const TEMPLATE_APPLY_URL = '%s/v2/domainTemplates/providers/%s/services/%s/apply?%s'; /** * @var string Signature algorithm */ const SIGNATURE_ALG = 'sha256WithRSAEncryption'; /** * @var DnsService */ private $dnsService; /** * @var Client */ private $client; public function __construct(array $clientConfig = []) { $this->client = new Client($clientConfig); $this->dnsService = new DnsService($this->client); } /** * Makes full Domain Connect discovery of a domain and returns full url to request sync consent. * * @param string $domain * @param string $providerId * @param string $serviceId * @param array optional $params * @param string optional $privateKey RSA key in PEM format * @param string optional $keyId host name of the TXT record with public KEY (appended to syncPubKeyDomain) * * @return string * * @throws TemplateNotSupportedException * @throws InvalidDomainConnectSettingsException */ public function getTemplateSyncUrl( $domain, $providerId, $serviceId, $params = null, $privateKey = null, $keyId = null ) { $params = $params ?: []; $domainSettings = $this->dnsService->getDomainSettings($domain); if (!$this->isTemplateSupported($providerId, $serviceId, $domainSettings)) { throw new TemplateNotSupportedException( sprintf('No template for serviceId: %s from %s', $serviceId, $providerId) ); } if (!$domainSettings->urlSyncUX) { throw new InvalidDomainConnectSettingsException('No sync URL in config'); } $params['domain'] = $domainSettings->domain; if (!empty($domainSettings->host)) { $params['host'] = $domainSettings->host; } ksort($params, SORT_NATURAL | SORT_FLAG_CASE); if ($privateKey && $keyId) { $params['sig'] = $this->generateSign($privateKey, http_build_query($params)); $params['key'] = $keyId; } return sprintf( self::TEMPLATE_APPLY_URL, $domainSettings->urlSyncUX, $providerId, $serviceId, http_build_query($params) ); } /** * Check is template supported * * @param string $providerId * @param string $serviceId * @param DomainSettings $domainSettings * * @return bool */ public function isTemplateSupported($providerId, $serviceId, DomainSettings $domainSettings) { try { $response = $this->client->request( 'GET', sprintf(self::TEMPLATE_CHECK_URL, $domainSettings->urlAPI, $providerId, $serviceId) ); return $response->getStatusCode() === 200; } catch (ClientException $e) { // Status 404 indicates that current template doesn't support if ($e->getResponse() && $e->getResponse()->getStatusCode() === 404) { return false; } throw $e; } } /** * Computes a signature for the specified query * * @param string $privateKey Private key * @param string $query Data * * @return string * * @throws InvalidPrivateKeyException */ private function generateSign($privateKey, $query) { $key = openssl_pkey_get_private($privateKey); if (!$key) { $openSSLErrors = []; while ($error = openssl_error_string()) { $openSSLErrors[] = $error; } throw new InvalidPrivateKeyException('Private key is invalid: ' . json_encode($openSSLErrors)); } //Generate signature openssl_sign($query, $signature, $key, self::SIGNATURE_ALG); return base64_encode($signature); } } php-ext-domain-connect/src/Services/DnsService.php 0000777 00000007717 15252274046 0016207 0 ustar 00 <?php namespace DomainConnect\Services; use DomainConnect\DTO\DomainSettings; use DomainConnect\Exception\InvalidDomainConnectSettingsException; use DomainConnect\Exception\InvalidDomainException; use DomainConnect\Exception\NoDomainConnectRecordException; use DomainConnect\Exception\NoDomainConnectSettingsException; use DomainConnect\Services\Utils\DnsUtils; use Exception; use GuzzleHttp\Client; use GuzzleHttp\Exception\ClientException; use LayerShifter\TLDExtract\Extract; use LayerShifter\TLDExtract\ResultInterface; /** * Class Dns */ class DnsService { /** * The URL prefix returned is subsequently used by the Service Provider to determine the additional settings * for using Domain Connect on this domain at the DNS Provider. * * @var string https://{_domainconnect}/v2/{domain}/settings */ const DOMAIN_SETTINGS_URL = 'https://%s/v2/%s/settings'; /** * @var Client */ private $client; /** * @var Extract */ private $domainExtractor; /** * @var DnsUtils */ private $dnsUtils; /** * DnsService constructor. * * @param Client $client */ public function __construct(Client $client) { $this->client = $client; $this->domainExtractor = new Extract(); $this->dnsUtils = new DnsUtils(); } /** * Get Domain settings * * @param string $domain * * @return DomainSettings * * @throws InvalidDomainConnectSettingsException * @throws NoDomainConnectSettingsException * @throws InvalidDomainException */ public function getDomainSettings($domain) { $extractDomain = $this->domainExtractor->parse($domain); if (!$extractDomain->isIp() && !$extractDomain->isValidDomain()) { throw new InvalidDomainException('Invalid domain name: ' . $domain); } $subDomain = $extractDomain->getSubdomain(); $rootDomainName = $this->getRootDomainName($extractDomain); $apiUrl = $this->getDomainApiUrl($rootDomainName); try { $response = $this->client->request('GET', sprintf(self::DOMAIN_SETTINGS_URL, $apiUrl, $rootDomainName)); $domainSettings = DomainSettings::loadFromJson($response->getBody()->getContents()); if (empty($domainSettings->domain)) { $domainSettings->domain = $rootDomainName; } if (!empty($subDomain)) { $domainSettings->host = $subDomain; } return $domainSettings; } catch (ClientException $e) { //A response of a 404 indicates that the DNS Provider does not have the zone. throw new NoDomainConnectSettingsException( 'Domain does not support domain connect. You would need to make DNS changes manually.' ); } catch (Exception $e) { throw new InvalidDomainConnectSettingsException( 'Cannot fetch DomainConnect Settings. Error: '. $e->getMessage() ); } } /** * @param ResultInterface $domain * * @return string */ private function getRootDomainName(ResultInterface $domain) { if ($domain->isIp()) { return $domain->getHostname(); } return $domain->getRegistrableDomain(); } /** * Get domain api url * * @param $rootDomainName string Domain name * * @return string * * @throws NoDomainConnectRecordException */ private function getDomainApiUrl($rootDomainName) { $dnsRecords = $this->dnsUtils->getTxtRecords("_domainconnect.{$rootDomainName}"); foreach ($dnsRecords as $dnsApiUrl) { $domain = $this->domainExtractor->parse($dnsApiUrl); if ($domain->isValidDomain()) { return $domain->getFullHost(); } } throw new NoDomainConnectRecordException("No Domain Connect API found for {$rootDomainName}."); } } php-ext-domain-connect/src/DTO/DomainSettings.php 0000777 00000006240 15252274046 0015723 0 ustar 00 <?php namespace DomainConnect\DTO; /** * Class DomainSettings */ class DomainSettings { /** * Unique identifier for the DNS Provider. * To ensure non-coordinated uniqueness, this should be the domain name of the DNS Provider (e.g. virtucom.com). * * @var string */ public $providerId; /** * The name of the DNS Provider. * * @var string */ public $providerName; /** * The URL Prefix for the REST API * * @var string */ public $urlAPI; /** * (optional) The name of the DNS Provider that should be displayed by the Service Provider. * This may change per domain for some DNS Providers that power multiple brands. * * @var string|null */ public $providerDisplayName; /** * Root Domain Name * * @var string */ public $domain; /** * (optional) Sub domain * * @var string */ public $host; /** * (optional) The URL Prefix for linking to the UX of Domain Connect for the synchronous flow at the DNS Provider. * If not returned, the DNS Provider is not supporting the synchronous flow on this domain. * * @var string|null */ public $urlSyncUX; /** * (optional) The URL Prefix for linking to the UX elements of Domain Connect for the asynchronous * flow at the DNS Provider. * If not returned, the DNS Provider is not supporting the asynchronous flow on this domain. * * @var string|null */ public $urlAsyncUX; /** * (optional) This is the desired width of the window for granting consent when navigated in a popup. * Default value if not returned should be 750px. * * @var int */ public $width = 750; /** * (optional) This is the desired height of the window for granting consent when navigated in a popup. * Default value if not returned should be 750px. * * @var int */ public $height = 750; /** * (optional) This is a URL to the control panel for editing DNS at the DNS Provider. * This field allows a Service Provider whose template isn’t supported at the DNS Provider to provide * a direct link to perform manual edits. * * To allow deep links to the specific domain, this string may contain %domain% which must be replaced with * the domain name. * * @var string|null */ public $urlControlPanel; /** * (optional) This is the list of nameservers desired by the DNS Provider for the zone to be authoritative. * This does not indicate the authoritative nameservers; for this the registry would be queried. * * @var array */ public $nameServers = []; /** * @var bool */ public $redirectSupported; /** * @param string $json * * @return DomainSettings */ public static function loadFromJson($json) { $result = json_decode($json, true); $obj = new self(); foreach (get_object_vars($obj) as $key => $val) { if (!empty($result[$key])) { $obj->{$key} = $result[$key]; } } return $obj; } } php-ext-domain-connect/.travis.yml 0000777 00000000165 15252274046 0013156 0 ustar 00 language: php php: - '5.6' - '7.0' - '7.1' - '7.2' - '7.3' install: - composer install --no-interaction php-ext-domain-connect/.github/workflows/php.yml 0000777 00000000562 15252274046 0015755 0 ustar 00 name: PHP Composer on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Validate composer.json and composer.lock run: composer validate - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest - name: Run test suite run: composer run-script tests php-ext-domain-connect/.php_cs.dist 0000777 00000001105 15252274046 0013257 0 ustar 00 <?php $config = PhpCsFixer\Config::create() ->setRules([ '@PSR1' => true, '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'cast_spaces' => ['space' => 'single'], ]) ->setFinder( PhpCsFixer\Finder::create() ->exclude(['bin', 'log', 'logs', 'var', 'vendor']) ->in(__DIR__) ) ; PhpCsFixer\FixerFactory::create() ->registerBuiltInFixers() ->registerCustomFixers($config->getCustomFixers()) ->useRuleSet(new PhpCsFixer\RuleSet($config->getRules())); return $config; php-ext-domain-connect/phpunit.xml.dist 0000777 00000000775 15252274046 0014227 0 ustar 00 <?xml version="1.0" encoding="utf-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" bootstrap="vendor/autoload.php" colors="true"> <testsuites> <testsuite name="Main"> <directory>tests</directory> </testsuite> </testsuites> </phpunit> php-ext-domain-connect/README.md 0000777 00000013735 15252274046 0012333 0 ustar 00 [](https://app.codacy.com/app/gaalferov/ext-domain-connect?utm_source=github.com&utm_medium=referral&utm_content=gaalferov/ext-domain-connect&utm_campaign=Badge_Grade_Dashboard) [](https://travis-ci.com/gaalferov/ext-domain-connect) # domain-connect PHP client library for Domain Connect protocol. For details of the protocol, please visit: https://domainconnect.org Library offers Service Provider functionality in Sync mode. ## Specification reference https://github.com/Domain-Connect/spec/blob/master/Domain%20Connect%20Spec%20Draft.adoc - Version: 2.1 - Revision: 61 ## Install ```bash composer require gaalferov/php-ext-domain-connect ``` ## Usage ### Sync flow Just get the link. Discovery and template query part is solved automatically. ```php <?php require 'vendor/autoload.php'; use DomainConnect\Exception\DomainConnectException; use DomainConnect\Services\TemplateService; try { $applyUrl = (new TemplateService())->getTemplateSyncUrl( 'foo.connect.domains', 'exampleservice.domainconnect.org', 'template1', [ 'IP' => '132.148.25.185', 'RANDOMTEXT' => 'shm:1531371203:Hello world sync', 'redirect_uri' => 'http://example.com', 'state' => 'someState' ], $privateKey, $keyId ); print_r($applyUrl); } catch (DomainConnectException $e) { echo (sprintf('An error has occurred: %s', $e->getMessage())); } ``` Output: ```text https://domainconnect.1and1.com/sync/v2/domainTemplates/providers/exampleservice.domainconnect.org/services/template1/apply?domain=connect.domains&host=foo&IP=132.148.25.185&RANDOMTEXT=shm%3A1531371203%3AHello+world+sync&redirect_uri=http%3A%2F%2Fexample.com&state=someState ``` ### Sync flow with signed request ```php <?php require 'vendor/autoload.php'; use DomainConnect\Exception\DomainConnectException; use DomainConnect\Services\TemplateService; try { $templateService = new TemplateService(); $privateKey = "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA18SgvpmeasN4BHkkv0SBjAzIc4grYLjiAXRtNiBUiGUDMeTzQrKTsWvy9NuxU1dIHCZy9o1CrKNg5EzLIZLNyMfI6qiXnM+HMd4byp97zs/3D39Q8iR5poubQcRaGozWx8yQpG0OcVdmEVcTfyR/XSEWC5u16EBNvRnNAOAvZYUdWqVyQvXsjnxQot8KcK0QP8iHpoL/1dbdRy2opRPQ2FdZpovUgknybq/6FkeDtW7uCQ6Mvu4QxcUa3+WP9nYHKtgWip/eFxpeb+qLvcLHf1h0JXtxLVdyy6OLk3f2JRYUX2ZZVDvG3biTpeJz6iRzjGg6MfGxXZHjI8weDjXrJwIDAQABAoIBAGiPedJDwXg9d1i7mCo0OY8z1qPeFh9OGP/Zet8i9bQPN2gjahslTNtK07cDC8C2aFRz8Xw3Ylsk5VxdNobzjFPDNUM6JhawnvR0jQU5GhdTwoc5DHH7aRRjTP6m938sRx0VrfZwfvJAB09Z4jHX7vyjfvprH9EH8GQ2L5lACtfnsSASVJB77H1vtgxTnum74CSqIck1MCjPD/TVUtYfMJwkUQWcbk79N4nvnEoagqsDrvw4okU2OYMWucQjyxfWTU4NGlsDScRbdDAb8sLr3DpMfXM8vpZJ3Ed6gfw14hEJym8XoHwDHmjGmgYH9iG6MODxuO5TLRmRR6b+jcUV/2kCgYEA4WGsDUO/NIXIqtDm5lTi5qeFl0sGKIgRLGuCrvjLF0Fq5Yx28wuow3OhZ3rbjlmhf9nUt24nUUY67plv2pi+vx3kVdbcNfk+Wkc0wfx8+U91qaTplMRhNjrnq/Kp9E7xtnzZRInpUG1Ha5ozTYobVvklUvjodFlF2c16Zz2X2AMCgYEA9RSeZm7oMyJbe985SScXruwt5ZXlUBoBLDZAeMloPpaqknFmSVSNgtniywztF8HppJQyiMvmUOUL2tKnuShXwsvTkCTBC/vNGXutiPS8O2yqeQ8dHoHuKcoMFwgajrbPrVkuFtUkjbQJ/TKoZtrxUdCryDZ/AHmRtiHh9E4NUQ0CgYAE7ngvSh4y7gJ4Cl4jCBR26492wgN+e4u0px2S6oq3FY1bPHmV09l7fVo4w21ubfOksoV/BgACPUEo216hL9psoCDQ6ASlgbCllQ1IeVfatKxka+FYift+jkdnccXaPKf5UD4Iy+O5CMsZRaR9u9nhS05PxHaBpTpsC5z0CVr7NQKBgQCsBTzpSQ9SVNtBpvzei8Hj1YKhkwTRpG8OSUYXgcbZp4cyIsZY0jBBmA3H19rSwhjsm9icjAGs5hfcD+AJ5nczEz37/tBBSQw8xsKXTrCQRUWikyktMKWqT1cNE3MQmOBMHDxtak2t6KDaR6RMDYE0m/L3JMkf3DSaUk323JIcQQKBgD6lHhw79Cenpezzf0566uWE1QF6Sv3kWk6Gkzo2jUGmjo2tG1v2Nj82DvcTuqvfUKSr2wTKINxnKGyYXGto0BykdxeFbR04cNcBB46zUjasro2ZCvIoAHCpohNBI2dL6dI+RI3jC/KY3jPNI0toaOTWkeAvJ7w09G2ttlv8qLNV\n-----END RSA PRIVATE KEY-----"; $keyId = '_dck1'; $applyUrl = $templateService->getTemplateSyncUrl( 'foo.connect.domains', 'exampleservice.domainconnect.org', 'template1', [ 'IP' => '132.148.25.185', 'RANDOMTEXT' => 'shm:1531371203:Hello world sync', 'redirect_uri' => 'http://example.com', 'state' => 'someState' ], $privateKey, $keyId ); print_r($applyUrl); } catch (DomainConnectException $e) { echo (sprintf('An error has occurred: %s', $e->getMessage())); } ``` Output: ```text https://domainconnect.1and1.com/sync/v2/domainTemplates/providers/exampleservice.domainconnect.org/services/template1/apply?domain=connect.domains&host=foo&IP=132.148.25.185&RANDOMTEXT=shm%3A1531371203%3AHello+world+sync&redirect_uri=http%3A%2F%2Fexample.com&state=someState&sig=HOoCBTFNIjWK3Qjy7CtWLB9HOcVvaGYFD3XsaI%2BZm%2BHtm%2FgsK66kfEfbi7Y8uoNOAbJXx3xfnbKrdASNa%2FPjQQKLk11NV%2BLNf3iDwkg7cOV9l54L2PqHFymOgu%2BiXr3I5aUkmA%2F19YAqiz3VJrh3K1XGeqc100cyZo%2BWq90bVcyWGVhIf5vYZEsU%2FzprckhmQdipqFfAB6XB4i72RzdxCKpBUFsyWcWYX80cz873pLN42uV%2BwGFUhSQ0qDC8d60n5m1f8h9Fdmik6%2FD%2BnmPpfK4Ge%2BHGnnq%2FpvR3nb95x9DKDHOd%2BfaIVcLhIZEbbVxIa57bGH%2FRUQiMbApBqkM4YQ%3D%3D&key=_dck1 ``` ### Request Options (guzzle) ```php <?php require 'vendor/autoload.php'; use DomainConnect\Exception\DomainConnectException; use DomainConnect\Services\TemplateService; try { $templateService = new TemplateService([ 'proxy' => [ 'http' => 'tcp://localhost:8125', 'https' => 'tcp://localhost:9124', 'no' => ['.mit.edu', 'foo.com'] ] ]); $applyUrl = $templateService->getTemplateSyncUrl( 'foo.connect.domains', 'exampleservice.domainconnect.org', 'template1', [ 'IP' => '132.148.25.185', 'RANDOMTEXT' => 'shm:1531371203:Hello world sync', 'redirect_uri' => 'http://example.com', 'state' => 'someState' ], ); print_r($applyUrl); } catch (DomainConnectException $e) { echo (sprintf('An error has occurred: %s', $e->getMessage())); } ``` ## Tests To run tests use next command: `composer tests` or `php vendor/bin/phpunit ./tests` ## TODOs - Async flow php-ext-domain-connect/tests/Services/TemplateServiceTest.php 0000777 00000006341 15252274046 0020441 0 ustar 00 <?php namespace Tests\Services; use DomainConnect\Services\TemplateService; class TemplateServiceTest extends BaseServiceTest { /** * @dataProvider templateSupportSuccessProvider * * @param string $domain * @param string $providerId * @param string $serviceId */ public function testGetTemplateSyncUrlSuccessCase($domain, $providerId, $serviceId) { $config = $this->configs[$domain]; $params = [ 'randomtext' => 'shm:1531371203:Hello world sync', 'ip' => '132.148.25.185', ]; $templateUrl = self::$templateService->getTemplateSyncUrl($domain, $providerId, $serviceId, $params); $this->assertEquals( sprintf( TemplateService::TEMPLATE_APPLY_URL, $config['urlSyncUX'], $providerId, $serviceId, $this->getApplyQueryByParams($params, $config) ), $templateUrl ); } /** * @dataProvider templateSupportSuccessProvider * @expectedException DomainConnect\Exception\TemplateNotSupportedException * * @param string $domain * @param string $providerId */ public function testGetTemplateSyncUrlInvalidCase($domain, $providerId) { self::$templateService->getTemplateSyncUrl( $domain, $providerId, 'notExistServiceId', [ 'randomtext' => 'shm:1531371203:Hello world sync', 'ip' => '132.148.25.185', ] ); } /** * @dataProvider templateSupportSuccessProvider * * @param string $domain * @param string $providerId * @param string $serviceId */ public function testIsTemplateSupportedSuccessCase($domain, $providerId, $serviceId) { $this->assertTrue(self::$templateService->isTemplateSupported( $providerId, $serviceId, self::$dnsService->getDomainSettings($domain) )); } /** * @dataProvider templateSupportSuccessProvider * * @param string $domain * @param string $providerId */ public function testIsTemplateSupportedInvalidCase($domain, $providerId) { $this->assertFalse(self::$templateService->isTemplateSupported( $providerId, 'notExistServiceId', self::$dnsService->getDomainSettings($domain) )); } /** * @return array */ public function templateSupportSuccessProvider() { $data = []; foreach ($this->configs as $domainUrl => $domainConfig) { $data[] = [ $domainUrl, 'exampleservice.domainconnect.org', 'template1' ]; } return $data; } /** * @param $params * @param $config * * @return string */ private function getApplyQueryByParams($params, $config) { $result = array_merge([ 'domain' => $config['domain'] ], $params); if (!empty($config['host'])) { $result['host'] = $config['host']; } ksort($result, SORT_NATURAL | SORT_FLAG_CASE); return http_build_query($result); } } php-ext-domain-connect/tests/Services/BaseServiceTest.php 0000777 00000003251 15252274046 0017535 0 ustar 00 <?php namespace Tests\Services; use DomainConnect\Services\DnsService; use DomainConnect\Services\TemplateService; use GuzzleHttp\Client; use PHPUnit\Framework\TestCase; /** * Class BaseServiceTest */ abstract class BaseServiceTest extends TestCase { /** * @var Client */ protected static $client; /** * @var DnsService */ protected static $dnsService; /** * @var TemplateService */ protected static $templateService; /** * @var array */ public $configs = [ 'connect.domains' => [ 'providerName' => '1and1', 'urlAPI' => 'https://api.domainconnect.1and1.com', 'domain' => 'connect.domains', 'urlSyncUX' => 'https://domainconnect.1and1.com/sync', 'urlAsyncUX' => 'https://domainconnect.1and1.com/async', ], 'http://subdomain.weathernyc.nyc' => [ 'providerName' => 'GoDaddy', 'urlAPI' => 'https://domainconnect.api.godaddy.com', 'domain' => 'weathernyc.nyc', 'host' => 'subdomain', 'urlSyncUX' => 'https://dcc.godaddy.com/manage', 'urlAsyncUX' => 'https://dcc.godaddy.com/manage', ], ]; public static function setUpBeforeClass() { self::$client = new Client(['verify' => false]); self::$dnsService = new DnsService(self::$client); self::$templateService = new TemplateService(); parent::setUpBeforeClass(); } public static function tearDownAfterClass() { self::$client = null; self::$dnsService = null; self::$templateService = null; parent::tearDownAfterClass(); } } php-ext-domain-connect/tests/Services/DnsServiceTest.php 0000777 00000003167 15252274046 0017415 0 ustar 00 <?php namespace Tests\Services; use DomainConnect\DTO\DomainSettings; class DnsServiceTest extends BaseServiceTest { /** * @dataProvider dnsServiceSuccessProvider * * @param string $domainUrl */ public function testGetDomainSettingsSuccessCase($domainUrl) { $domainSettings = self::$dnsService->getDomainSettings($domainUrl); $config = $this->configs[$domainUrl]; $this->assertInstanceOf(DomainSettings::class, $domainSettings); foreach ($config as $key => $value) { $this->assertEquals($value, $domainSettings->{$key}); } } /** * @dataProvider invalidDomainProvider * * @expectedException DomainConnect\Exception\InvalidDomainException */ public function testGetDomainSettingsInvalidDomainCase($domain) { self::$dnsService->getDomainSettings($domain); } /** * @expectedException DomainConnect\Exception\NoDomainConnectRecordException */ public function testGetDomainSettingsInvalidCase() { self::$dnsService->getDomainSettings('blasdasdawsdasdx.qqqqqqq'); } /** * @return array */ public function dnsServiceSuccessProvider() { $data = []; foreach ($this->configs as $domainUrl => $domainConfig) { $data[] = [$domainUrl]; } return $data; } /** * @return array */ public function invalidDomainProvider() { return [ ['http://a-.bc.com'], ['http://toolongtoolongtoolongtoolongtoolongtoolongtoolongtoolongtoolongtoolong.com'], ]; } } php-ext-domain-connect/.gitignore 0000777 00000000035 15252274046 0013031 0 ustar 00 .idea .php_cs.cache /vendor/ php-ext-domain-connect/LICENSE 0000777 00000002061 15252274046 0012047 0 ustar 00 MIT License Copyright (c) 2019 Hennadii Alforov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
| ver. 1.6 |
Github
|
.
| PHP 8.1.34 | Генерация страницы: 0 |
proxy
|
phpinfo
|
Настройка