- composer self-update
# build coverage only on one build, to speed up results feedbacks
-before_script:
- - if [[ "$TRAVIS_PHP_VERSION" = "5.6" ]]; then PHPUNIT_FLAGS="--coverage-clover=coverage.clover"; else PHPUNIT_FLAGS=""; fi;
+# before_script:
+ # - if [[ "$TRAVIS_PHP_VERSION" = "5.6" ]]; then PHPUNIT_FLAGS="--coverage-clover=coverage.clover"; else PHPUNIT_FLAGS=""; fi;
script:
- ant prepare
- - phpunit --exclude-group command-doctrine $PHPUNIT_FLAGS
-
-after_script:
- - |
- if [ $TRAVIS_PHP_VERSION = '5.6' ]; then
- wget https://scrutinizer-ci.com/ocular.phar
- php ocular.phar code-coverage:upload --format=php-clover coverage.clover
- fi
+ - bin/phpunit --exclude-group command-doctrine --debug $PHPUNIT_FLAGS
+
+# after_script:
+ # - |
+ # if [ $TRAVIS_PHP_VERSION = '5.6' ]; then
+ # wget https://scrutinizer-ci.com/ocular.phar
+ # php ocular.phar code-coverage:upload --format=php-clover coverage.clover
+ # fi
new Nelmio\CorsBundle\NelmioCorsBundle(),
new Liip\ThemeBundle\LiipThemeBundle(),
new Wallabag\CoreBundle\WallabagCoreBundle(),
- new Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle()
+ new Wallabag\ApiBundle\WallabagApiBundle(),
+ new Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle(),
);
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
}
/**
- * Returns the help text for resolving the problem
+ * Returns the help text for resolving the problem.
*
* @return string The help text
*/
*
* @param string $cfgName The configuration name used for ini_get()
* @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
- or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
+ * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
* @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
- This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
- Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
+ * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
+ * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
* @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
* @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
* @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
*
* @param string $cfgName The configuration name used for ini_get()
* @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
- or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
+ * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
* @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
- This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
- Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
+ * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
+ * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
* @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
* @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
* @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
*
* @param string $cfgName The configuration name used for ini_get()
* @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
- or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
+ * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
* @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
- This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
- Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
+ * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
+ * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
* @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
* @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
* @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
/* optional recommendations follow */
- $this->addRecommendation(
- file_get_contents(__FILE__) === file_get_contents(__DIR__.'/../vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/skeleton/app/SymfonyRequirements.php'),
- 'Requirements file should be up-to-date',
- 'Your requirements file is outdated. Run composer install and re-check your configuration.'
- );
+ if (file_exists(__DIR__.'/../vendor/composer')) {
+ require_once __DIR__.'/../vendor/autoload.php';
+
+ try {
+ $r = new \ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle');
+
+ $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php');
+ } catch (\ReflectionException $e) {
+ $contents = '';
+ }
+ $this->addRecommendation(
+ file_get_contents(__FILE__) === $contents,
+ 'Requirements file should be up-to-date',
+ 'Your requirements file is outdated. Run composer install and re-check your configuration.'
+ );
+ }
$this->addRecommendation(
version_compare($installedPhpVersion, '5.3.4', '>='),
+wallabag_api:
+ resource: "@WallabagApiBundle/Resources/config/routing.yml"
+ prefix: /
+
app:
resource: @WallabagCoreBundle/Controller/
type: annotation
Rest_Wallabag:
type : rest
- resource: "@WallabagCoreBundle/Resources/config/routing_rest.yml"
\ No newline at end of file
+ resource: "@WallabagApiBundle/Resources/config/routing_rest.yml"
"packages": [
{
"name": "doctrine/annotations",
- "version": "v1.2.3",
+ "version": "v1.2.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/annotations.git",
- "reference": "eeda578cbe24a170331a1cfdf78be723412df7a4"
+ "reference": "b5202eb9e83f8db52e0e58867e0a46e63be8332e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/annotations/zipball/eeda578cbe24a170331a1cfdf78be723412df7a4",
- "reference": "eeda578cbe24a170331a1cfdf78be723412df7a4",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/b5202eb9e83f8db52e0e58867e0a46e63be8332e",
+ "reference": "b5202eb9e83f8db52e0e58867e0a46e63be8332e",
"shasum": ""
},
"require": {
"docblock",
"parser"
],
- "time": "2014-12-20 20:49:38"
+ "time": "2014-12-23 22:40:37"
},
{
"name": "doctrine/cache",
- "version": "v1.4.0",
+ "version": "v1.4.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/cache.git",
- "reference": "2346085d2b027b233ae1d5de59b07440b9f288c8"
+ "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/cache/zipball/2346085d2b027b233ae1d5de59b07440b9f288c8",
- "reference": "2346085d2b027b233ae1d5de59b07440b9f288c8",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/c9eadeb743ac6199f7eec423cb9426bc518b7b03",
+ "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03",
"shasum": ""
},
"require": {
},
"require-dev": {
"phpunit/phpunit": ">=3.7",
- "predis/predis": "~0.8",
+ "predis/predis": "~1.0",
"satooshi/php-coveralls": "~0.6"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4.x-dev"
+ "dev-master": "1.5.x-dev"
}
},
"autoload": {
"cache",
"caching"
],
- "time": "2015-01-15 20:38:55"
+ "time": "2015-04-15 00:11:59"
},
{
"name": "doctrine/collections",
- "version": "v1.2",
+ "version": "v1.3.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/collections.git",
- "reference": "b99c5c46c87126201899afe88ec490a25eedd6a2"
+ "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/collections/zipball/b99c5c46c87126201899afe88ec490a25eedd6a2",
- "reference": "b99c5c46c87126201899afe88ec490a25eedd6a2",
+ "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a",
+ "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a",
"shasum": ""
},
"require": {
"php": ">=5.3.2"
},
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
"type": "library",
"extra": {
"branch-alias": {
"MIT"
],
"authors": [
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com",
- "homepage": "http://www.jwage.com/",
- "role": "Creator"
- },
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com",
- "homepage": "http://www.instaclick.com"
- },
{
"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",
- "homepage": "https://github.com/schmittjoh",
- "role": "Developer of wrapped JMSSerializerBundle"
+ "email": "schmittjoh@gmail.com"
}
],
"description": "Collections Abstraction library",
"collections",
"iterator"
],
- "time": "2014-02-03 23:07:43"
+ "time": "2015-04-14 22:21:58"
},
{
"name": "doctrine/common",
- "version": "v2.4.2",
+ "version": "v2.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/common.git",
- "reference": "5db6ab40e4c531f14dad4ca96a394dfce5d4255b"
+ "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/common/zipball/5db6ab40e4c531f14dad4ca96a394dfce5d4255b",
- "reference": "5db6ab40e4c531f14dad4ca96a394dfce5d4255b",
+ "url": "https://api.github.com/repos/doctrine/common/zipball/cd8daf2501e10c63dced7b8b9b905844316ae9d3",
+ "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3",
"shasum": ""
},
"require": {
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4.x-dev"
+ "dev-master": "2.6.x-dev"
}
},
"autoload": {
"MIT"
],
"authors": [
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com",
- "homepage": "http://www.jwage.com/",
- "role": "Creator"
- },
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com",
- "homepage": "http://www.instaclick.com"
- },
{
"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",
- "homepage": "https://github.com/schmittjoh",
- "role": "Developer of wrapped JMSSerializerBundle"
+ "email": "schmittjoh@gmail.com"
}
],
"description": "Common Library for Doctrine projects",
"persistence",
"spl"
],
- "time": "2014-05-21 19:28:51"
+ "time": "2015-04-02 19:55:44"
},
{
"name": "doctrine/dbal",
},
{
"name": "doctrine/doctrine-bundle",
- "version": "v1.3.0",
+ "version": "v1.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/DoctrineBundle.git",
- "reference": "3beb3a780485ab01f86941f4892cd23ef8c39c6b"
+ "reference": "0b9e27037c4fdbad515ee5ec89842e9091a6480f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/3beb3a780485ab01f86941f4892cd23ef8c39c6b",
- "reference": "3beb3a780485ab01f86941f4892cd23ef8c39c6b",
+ "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0b9e27037c4fdbad515ee5ec89842e9091a6480f",
+ "reference": "0b9e27037c4fdbad515ee5ec89842e9091a6480f",
"shasum": ""
},
"require": {
"doctrine/doctrine-cache-bundle": "~1.0",
"jdorn/sql-formatter": "~1.1",
"php": ">=5.3.2",
+ "symfony/console": "~2.3",
"symfony/doctrine-bridge": "~2.2",
- "symfony/framework-bundle": "~2.2"
+ "symfony/framework-bundle": "~2.3"
},
"require-dev": {
"doctrine/orm": "~2.3",
- "phpunit/php-code-coverage": "~1.2",
- "phpunit/phpunit": "~3.7",
- "phpunit/phpunit-mock-objects": "~1.2",
+ "phpunit/phpunit": "~4",
"satooshi/php-coveralls": "~0.6.1",
"symfony/validator": "~2.2",
"symfony/yaml": "~2.2",
- "twig/twig": "~1"
+ "twig/twig": "~1.10"
},
"suggest": {
"doctrine/orm": "The Doctrine ORM integration is optional in the bundle.",
"type": "symfony-bundle",
"extra": {
"branch-alias": {
- "dev-master": "1.3.x-dev"
+ "dev-master": "1.5.x-dev"
}
},
"autoload": {
"orm",
"persistence"
],
- "time": "2014-11-28 08:32:03"
+ "time": "2015-05-28 12:27:15"
},
{
"name": "doctrine/doctrine-cache-bundle",
],
"time": "2014-12-20 21:24:13"
},
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119",
+ "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119",
+ "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.*@ALPHA"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Instantiator\\": "src"
+ }
+ },
+ "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": "2014-10-13 12:58:55"
+ },
{
"name": "doctrine/lexer",
"version": "v1.0.1",
},
{
"name": "doctrine/orm",
- "version": "v2.4.7",
+ "version": "v2.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/doctrine2.git",
- "reference": "2bc4ff3cab2ae297bcd05f2e619d42e6a7ca9e68"
+ "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/2bc4ff3cab2ae297bcd05f2e619d42e6a7ca9e68",
- "reference": "2bc4ff3cab2ae297bcd05f2e619d42e6a7ca9e68",
+ "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe",
+ "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe",
"shasum": ""
},
"require": {
- "doctrine/collections": "~1.1",
- "doctrine/dbal": "~2.4",
+ "doctrine/cache": "~1.4",
+ "doctrine/collections": "~1.2",
+ "doctrine/common": ">=2.5-dev,<2.6-dev",
+ "doctrine/dbal": ">=2.5-dev,<2.6-dev",
+ "doctrine/instantiator": "~1.0.1",
"ext-pdo": "*",
- "php": ">=5.3.2",
- "symfony/console": "~2.0"
+ "php": ">=5.4",
+ "symfony/console": "~2.5"
},
"require-dev": {
+ "phpunit/phpunit": "~4.0",
"satooshi/php-coveralls": "dev-master",
"symfony/yaml": "~2.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4.x-dev"
+ "dev-master": "2.6.x-dev"
}
},
"autoload": {
"database",
"orm"
],
- "time": "2014-12-16 13:45:01"
+ "time": "2015-04-02 20:40:18"
},
{
"name": "ezyang/htmlpurifier",
},
{
"name": "friendsofsymfony/rest-bundle",
- "version": "1.5.3",
+ "version": "1.6.0",
"target-dir": "FOS/RestBundle",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
- "reference": "fdd21c4c0cb6222ae37efc9362c6a96bd1432412"
+ "reference": "832d08199cadf1770ec43c2cba68b42b4d5e7f9f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/fdd21c4c0cb6222ae37efc9362c6a96bd1432412",
- "reference": "fdd21c4c0cb6222ae37efc9362c6a96bd1432412",
+ "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/832d08199cadf1770ec43c2cba68b42b4d5e7f9f",
+ "reference": "832d08199cadf1770ec43c2cba68b42b4d5e7f9f",
"shasum": ""
},
"require": {
"doctrine/inflector": "~1.0",
"php": ">=5.3.9",
"psr/log": "~1.0",
- "symfony/framework-bundle": "~2.2",
+ "symfony/framework-bundle": "~2.3",
+ "symfony/http-kernel": "~2.3,>=2.3.24",
"willdurand/jsonp-callback-validator": "~1.0",
"willdurand/negotiation": "~1.2"
},
"conflict": {
"jms/serializer": "<0.12",
- "jms/serializer-bundle": "<0.11"
+ "jms/serializer-bundle": "<0.11",
+ "symfony/validator": ">=2.5.0,<2.5.5"
},
"require-dev": {
+ "jms/serializer": "~0.13",
"jms/serializer-bundle": "~0.12",
- "sensio/framework-extra-bundle": "~2.2",
- "symfony/form": "~2.2",
- "symfony/security": "~2.2",
- "symfony/serializer": "~2.2",
- "symfony/validator": "~2.2",
- "symfony/yaml": "~2.2"
+ "phpoption/phpoption": "~1.1.0",
+ "sensio/framework-extra-bundle": "~3.0",
+ "symfony/browser-kit": "~2.3",
+ "symfony/dependency-injection": "~2.3",
+ "symfony/form": "~2.3",
+ "symfony/security": "~2.3",
+ "symfony/serializer": "~2.3",
+ "symfony/validator": "~2.3",
+ "symfony/yaml": "~2.3"
},
"suggest": {
"jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended, requires ~0.12",
- "sensio/framework-extra-bundle": "Add support for route annotations and the view response listener",
- "symfony/serializer": "Add support for basic serialization capabilities and xml decoding, requires ~2.2",
- "symfony/validator": "Add support for validation capabilities in the ParamFetcher, requires ~2.2"
+ "sensio/framework-extra-bundle": "Add support for route annotations and the view response listener, requires ~3.0",
+ "symfony/serializer": "Add support for basic serialization capabilities and xml decoding, requires ~2.3",
+ "symfony/validator": "Add support for validation capabilities in the ParamFetcher, requires ~2.3"
},
"type": "symfony-bundle",
"extra": {
"branch-alias": {
- "dev-master": "1.5-dev"
+ "dev-master": "1.6-dev"
}
},
"autoload": {
"keywords": [
"rest"
],
- "time": "2015-02-16 15:26:12"
+ "time": "2015-05-22 20:17:35"
},
{
"name": "htmlawed/htmlawed",
"source": {
"type": "git",
"url": "https://github.com/kesar/HTMLawed.git",
- "reference": "9d292af5f4c288aa68f38b87f5d88c8214f5f233"
+ "reference": "f842e793614bdf3af70a62b1e70570e824dc9ab6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/kesar/HTMLawed/zipball/9d292af5f4c288aa68f38b87f5d88c8214f5f233",
- "reference": "9d292af5f4c288aa68f38b87f5d88c8214f5f233",
+ "url": "https://api.github.com/repos/kesar/HTMLawed/zipball/f842e793614bdf3af70a62b1e70570e824dc9ab6",
+ "reference": "f842e793614bdf3af70a62b1e70570e824dc9ab6",
"shasum": ""
},
"require": {
"GPL-2.0+",
"LGPL-3.0"
],
- "description": "htmLawed - Process text with HTML markup to make it more compliant with HTML standards and administrative policies",
+ "authors": [
+ {
+ "name": "Santosh Patnaik",
+ "homepage": "http://www.bioinformatics.org/people/index.php?user_hash=558b661f92d0ff7b",
+ "role": "Developer"
+ }
+ ],
+ "description": "htmLawed - Process text with HTML markup to make it more compliant with HTML standards and administrative policies",
"homepage": "http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/",
"keywords": [
"HTMLtidy",
"strip",
"tags"
],
- "time": "2014-01-05 13:06:52"
+ "time": "2015-04-12 19:37:20"
},
{
"name": "incenteev/composer-parameter-handler",
},
{
"name": "monolog/monolog",
- "version": "1.13.0",
+ "version": "1.13.1",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "c41c218e239b50446fd883acb1ecfd4b770caeae"
+ "reference": "c31a2c4e8db5da8b46c74cf275d7f109c0f249ac"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c41c218e239b50446fd883acb1ecfd4b770caeae",
- "reference": "c41c218e239b50446fd883acb1ecfd4b770caeae",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c31a2c4e8db5da8b46c74cf275d7f109c0f249ac",
+ "reference": "c31a2c4e8db5da8b46c74cf275d7f109c0f249ac",
"shasum": ""
},
"require": {
"logging",
"psr-3"
],
- "time": "2015-03-05 01:12:12"
+ "time": "2015-03-09 09:58:04"
},
{
"name": "nelmio/api-doc-bundle",
- "version": "2.7.0",
+ "version": "2.9.0",
"target-dir": "Nelmio/ApiDocBundle",
"source": {
"type": "git",
"url": "https://github.com/nelmio/NelmioApiDocBundle.git",
- "reference": "3fdb2d4a819d1f71bff0c45880af705a8b124955"
+ "reference": "de31760fd84a45fadbb4fe24db050b5e29ea70d1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/3fdb2d4a819d1f71bff0c45880af705a8b124955",
- "reference": "3fdb2d4a819d1f71bff0c45880af705a8b124955",
+ "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/de31760fd84a45fadbb4fe24db050b5e29ea70d1",
+ "reference": "de31760fd84a45fadbb4fe24db050b5e29ea70d1",
"shasum": ""
},
"require": {
"jms/serializer-bundle": "<0.11"
},
"require-dev": {
+ "dunglas/api-bundle": "dev-master",
"friendsofsymfony/rest-bundle": "~1.0",
"jms/serializer-bundle": ">=0.11",
- "sensio/framework-extra-bundle": "~2.1",
+ "sensio/framework-extra-bundle": "~3.0",
"symfony/browser-kit": "~2.1",
"symfony/css-selector": "~2.1",
"symfony/form": "~2.1",
+ "symfony/serializer": "~2.7@dev",
"symfony/validator": "~2.1",
"symfony/yaml": "~2.1"
},
"suggest": {
+ "dunglas/api-bundle": "For making use of resources definitions of DunglasApiBundle.",
"friendsofsymfony/rest-bundle": "For making use of REST information in the doc.",
"jms/serializer": "For making use of serializer information in the doc.",
"symfony/form": "For using form definitions as input.",
"type": "symfony-bundle",
"extra": {
"branch-alias": {
- "dev-master": "2.7.x-dev"
+ "dev-master": "2.9.x-dev"
}
},
"autoload": {
"documentation",
"rest"
],
- "time": "2014-07-30 09:11:08"
+ "time": "2015-05-16 17:16:14"
},
{
"name": "nelmio/cors-bundle",
},
{
"name": "sensio/distribution-bundle",
- "version": "v3.0.18",
+ "version": "v3.0.25",
"target-dir": "Sensio/Bundle/DistributionBundle",
"source": {
"type": "git",
"url": "https://github.com/sensiolabs/SensioDistributionBundle.git",
- "reference": "ac026149ffb1d3a5c893290d2d3ca8795013de08"
+ "reference": "01931139b0f067a4016d5d56e82c2b3086533b89"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/ac026149ffb1d3a5c893290d2d3ca8795013de08",
- "reference": "ac026149ffb1d3a5c893290d2d3ca8795013de08",
+ "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/01931139b0f067a4016d5d56e82c2b3086533b89",
+ "reference": "01931139b0f067a4016d5d56e82c2b3086533b89",
"shasum": ""
},
"require": {
"configuration",
"distribution"
],
- "time": "2015-02-27 12:59:18"
+ "time": "2015-05-29 22:35:41"
},
{
"name": "sensio/framework-extra-bundle",
- "version": "v3.0.4",
- "target-dir": "Sensio/Bundle/FrameworkExtraBundle",
+ "version": "v3.0.8",
"source": {
"type": "git",
"url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git",
- "reference": "b3bc3e67c8b6b68b18d727012183520d35ee762a"
+ "reference": "a30fc18bf147bc25faf6b1d54bf55cfad4b63cba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/b3bc3e67c8b6b68b18d727012183520d35ee762a",
- "reference": "b3bc3e67c8b6b68b18d727012183520d35ee762a",
+ "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/a30fc18bf147bc25faf6b1d54bf55cfad4b63cba",
+ "reference": "a30fc18bf147bc25faf6b1d54bf55cfad4b63cba",
"shasum": ""
},
"require": {
},
"suggest": {
"symfony/expression-language": "",
+ "symfony/psr-http-message-bridge": "To use the PSR-7 converters",
"symfony/security-bundle": ""
},
"type": "symfony-bundle",
}
},
"autoload": {
- "psr-0": {
- "Sensio\\Bundle\\FrameworkExtraBundle": ""
+ "psr-4": {
+ "Sensio\\Bundle\\FrameworkExtraBundle\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"annotations",
"controllers"
],
- "time": "2014-12-02 09:52:52"
+ "time": "2015-05-29 18:27:23"
},
{
"name": "sensiolabs/security-checker",
- "version": "v2.0.1",
+ "version": "v2.0.5",
"source": {
"type": "git",
"url": "https://github.com/sensiolabs/security-checker.git",
- "reference": "134cecf1c61256bd8e973e11376891a724543820"
+ "reference": "2c2a71f1c77d9765c12638c4724d9ca23658a810"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/134cecf1c61256bd8e973e11376891a724543820",
- "reference": "134cecf1c61256bd8e973e11376891a724543820",
+ "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/2c2a71f1c77d9765c12638c4724d9ca23658a810",
+ "reference": "2c2a71f1c77d9765c12638c4724d9ca23658a810",
"shasum": ""
},
"require": {
}
],
"description": "A security checker for your composer.lock",
- "time": "2015-01-26 16:25:19"
+ "time": "2015-05-28 14:22:40"
},
{
"name": "simplepie/simplepie",
},
{
"name": "swiftmailer/swiftmailer",
- "version": "v5.3.1",
+ "version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "c5f963e7f9d6f6438fda4f22d5cc2db296ec621a"
+ "reference": "31454f258f10329ae7c48763eb898a75c39e0a9f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/c5f963e7f9d6f6438fda4f22d5cc2db296ec621a",
- "reference": "c5f963e7f9d6f6438fda4f22d5cc2db296ec621a",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/31454f258f10329ae7c48763eb898a75c39e0a9f",
+ "reference": "31454f258f10329ae7c48763eb898a75c39e0a9f",
"shasum": ""
},
"require": {
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.3-dev"
+ "dev-master": "5.4-dev"
}
},
"autoload": {
"mail",
"mailer"
],
- "time": "2014-12-05 14:17:14"
+ "time": "2015-03-14 06:06:39"
},
{
"name": "symfony/assetic-bundle",
},
{
"name": "symfony/symfony",
- "version": "v2.6.4",
+ "version": "v2.6.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/symfony.git",
- "reference": "23b647f1e4eeb24a457d3c47f5f5046377d5a3bf"
+ "reference": "b06539573ccf64dd3a62852685f052553d02c5ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/symfony/zipball/23b647f1e4eeb24a457d3c47f5f5046377d5a3bf",
- "reference": "23b647f1e4eeb24a457d3c47f5f5046377d5a3bf",
+ "url": "https://api.github.com/repos/symfony/symfony/zipball/b06539573ccf64dd3a62852685f052553d02c5ba",
+ "reference": "b06539573ccf64dd3a62852685f052553d02c5ba",
"shasum": ""
},
"require": {
"ircmaxell/password-compat": "~1.0",
"monolog/monolog": "~1.11",
"ocramius/proxy-manager": "~0.4|~1.0",
- "propel/propel1": "~1.6"
+ "propel/propel1": "~1.6",
+ "symfony/phpunit-bridge": "~2.7"
},
"type": "library",
"extra": {
"MIT"
],
"authors": [
- {
- "name": "Symfony Community",
- "homepage": "http://symfony.com/contributors"
- },
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
"description": "The Symfony PHP framework",
- "homepage": "http://symfony.com",
+ "homepage": "https://symfony.com",
"keywords": [
"framework"
],
- "time": "2015-02-02 18:02:30"
+ "time": "2015-05-29 22:55:07"
},
{
"name": "tecnick.com/tcpdf",
- "version": "6.2.6",
+ "version": "6.2.8",
"source": {
"type": "git",
"url": "https://github.com/tecnickcom/TCPDF.git",
- "reference": "a2e8f5b505a7a14a4ed960313c4baf699fd1f4bb"
+ "reference": "3dee9e7f3a414875fd1d9f4f1dfc2433493a86d2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/a2e8f5b505a7a14a4ed960313c4baf699fd1f4bb",
- "reference": "a2e8f5b505a7a14a4ed960313c4baf699fd1f4bb",
+ "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/3dee9e7f3a414875fd1d9f4f1dfc2433493a86d2",
+ "reference": "3dee9e7f3a414875fd1d9f4f1dfc2433493a86d2",
"shasum": ""
},
"require": {
"pdf417",
"qrcode"
],
- "time": "2015-01-28 18:51:40"
+ "time": "2015-04-29 16:13:58"
},
{
"name": "twig/extensions",
},
{
"name": "twig/twig",
- "version": "v1.18.0",
+ "version": "v1.18.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "4cf7464348e7f9893a93f7096a90b73722be99cf"
+ "reference": "9f70492f44398e276d1b81c1b43adfe6751c7b7f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/4cf7464348e7f9893a93f7096a90b73722be99cf",
- "reference": "4cf7464348e7f9893a93f7096a90b73722be99cf",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/9f70492f44398e276d1b81c1b43adfe6751c7b7f",
+ "reference": "9f70492f44398e276d1b81c1b43adfe6751c7b7f",
"shasum": ""
},
"require": {
- "php": ">=5.2.4"
+ "php": ">=5.2.7"
},
"type": "library",
"extra": {
"keywords": [
"templating"
],
- "time": "2015-01-25 17:32:08"
+ "time": "2015-04-19 08:30:27"
},
{
"name": "umpirsky/twig-gettext-extractor",
"description": "Libraries from @fivefilters.",
"homepage": "https://github.com/wallabag/Fivefilters_Libraries",
"support": {
- "source": "https://github.com/wallabag/Fivefilters_Libraries/tree/master",
+ "source": "https://github.com/wallabag/Fivefilters_Libraries/tree/1.0.0",
"issues": "https://github.com/wallabag/Fivefilters_Libraries/issues"
},
"time": "2015-01-19 20:19:28"
"description": "PHP Classes for dynamically generating EPub files.",
"homepage": "https://github.com/wallabag/PHPePub",
"support": {
- "source": "https://github.com/wallabag/PHPePub/tree/master"
+ "source": "https://github.com/wallabag/PHPePub/tree/2.1.0"
},
"time": "2015-01-19 11:44:19"
},
"description": "A simple and smart (or stupid) php5 snippets repository",
"homepage": "https://github.com/wallabag/kriss_php5",
"support": {
- "source": "https://github.com/wallabag/kriss_php5/tree/master"
+ "source": "https://github.com/wallabag/kriss_php5/tree/1.0.0"
},
"time": "2015-01-18 21:21:43"
},
"description": "Paginate record sets, not tied in directly to a database.",
"homepage": "https://github.com/wallabag/pagination",
"support": {
- "source": "https://github.com/wallabag/pagination/tree/master"
+ "source": "https://github.com/wallabag/pagination/tree/1.0.0"
},
"time": "2015-01-19 09:24:39"
},
"sessions"
],
"support": {
- "source": "https://github.com/wallabag/PHP-Flash-Messages/tree/master"
+ "source": "https://github.com/wallabag/PHP-Flash-Messages/tree/1.0.0"
},
"time": "2015-01-18 19:51:55"
},
"html"
],
"support": {
- "source": "https://github.com/wallabag/php-readability/tree/master",
+ "source": "https://github.com/wallabag/php-readability/tree/1.0.0",
"issues": "https://github.com/wallabag/php-readability/issues"
},
"time": "2015-01-19 12:25:38"
"description": "An experimental Mobipocket file creator in PHP.",
"homepage": "https://github.com/wallabag/phpMobi",
"support": {
- "source": "https://github.com/wallabag/phpMobi/tree/master"
+ "source": "https://github.com/wallabag/phpMobi/tree/1.0.0"
},
"time": "2015-01-19 12:43:17"
},
{
"name": "willdurand/hateoas",
- "version": "v2.4.0",
+ "version": "v2.6.0",
"source": {
"type": "git",
"url": "https://github.com/willdurand/Hateoas.git",
- "reference": "89fe19ad9ce25f15323d76ac22272282ae8a9f14"
+ "reference": "fc0869381d6934e5d430084154584761297caa6c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/willdurand/Hateoas/zipball/89fe19ad9ce25f15323d76ac22272282ae8a9f14",
- "reference": "89fe19ad9ce25f15323d76ac22272282ae8a9f14",
+ "url": "https://api.github.com/repos/willdurand/Hateoas/zipball/fc0869381d6934e5d430084154584761297caa6c",
+ "reference": "fc0869381d6934e5d430084154584761297caa6c",
"shasum": ""
},
"require": {
"doctrine/annotations": "~1.0",
"doctrine/common": "~2.0",
"jms/metadata": "~1.1",
- "jms/serializer": "~0.13@dev",
+ "jms/serializer": "~0.13",
+ "php": ">=5.3",
"symfony/expression-language": "~2.4"
},
"require-dev": {
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4-dev"
+ "dev-master": "2.6-dev"
}
},
"autoload": {
}
],
"description": "A PHP library to support implementing representations for HATEOAS REST web services",
- "time": "2015-02-24 15:28:33"
+ "time": "2015-05-21 21:57:34"
},
{
"name": "willdurand/hateoas-bundle",
"source": {
"type": "git",
"url": "https://github.com/willdurand/BazingaHateoasBundle.git",
- "reference": "3c86e8080e8a229365a0ce91818da6fe6562376b"
+ "reference": "a99f48ea5004a89ecf0927229d9c912fed9fa4ab"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/willdurand/BazingaHateoasBundle/zipball/3c86e8080e8a229365a0ce91818da6fe6562376b",
- "reference": "3c86e8080e8a229365a0ce91818da6fe6562376b",
+ "url": "https://api.github.com/repos/willdurand/BazingaHateoasBundle/zipball/a99f48ea5004a89ecf0927229d9c912fed9fa4ab",
+ "reference": "a99f48ea5004a89ecf0927229d9c912fed9fa4ab",
"shasum": ""
},
"require": {
"HATEOAS",
"rest"
],
- "time": "2015-02-19 16:27:51"
+ "time": "2015-03-12 15:49:24"
},
{
"name": "willdurand/jsonp-callback-validator",
"packages-dev": [
{
"name": "doctrine/data-fixtures",
- "version": "v1.0.0",
+ "version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/data-fixtures.git",
- "reference": "b4a135c7db56ecc4602b54a2184368f440cac33e"
+ "reference": "bd44f6b6e40247b6530bc8abe802e4e4d914976a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/b4a135c7db56ecc4602b54a2184368f440cac33e",
- "reference": "b4a135c7db56ecc4602b54a2184368f440cac33e",
+ "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bd44f6b6e40247b6530bc8abe802e4e4d914976a",
+ "reference": "bd44f6b6e40247b6530bc8abe802e4e4d914976a",
"shasum": ""
},
"require": {
- "doctrine/common": ">=2.2,<2.5-dev",
+ "doctrine/common": "~2.2",
"php": ">=5.3.2"
},
+ "conflict": {
+ "doctrine/orm": "< 2.4"
+ },
"require-dev": {
- "doctrine/orm": ">=2.2,<2.5-dev"
+ "doctrine/orm": "~2.4"
},
"suggest": {
"doctrine/mongodb-odm": "For loading MongoDB ODM fixtures",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.1.x-dev"
}
},
"autoload": {
"authors": [
{
"name": "Jonathan Wage",
- "email": "jonwage@gmail.com",
- "homepage": "http://www.jwage.com/",
- "role": "Creator"
+ "email": "jonwage@gmail.com"
}
],
"description": "Data Fixtures for all Doctrine Object Managers",
"keywords": [
"database"
],
- "time": "2013-07-10 17:04:07"
+ "time": "2015-03-30 12:14:13"
},
{
"name": "doctrine/doctrine-fixtures-bundle",
],
"time": "2015-01-19 02:21:37"
},
- {
- "name": "doctrine/instantiator",
- "version": "1.0.4",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119",
- "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119",
- "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.*@ALPHA"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Doctrine\\Instantiator\\": "src"
- }
- },
- "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": "2014-10-13 12:58:55"
- },
{
"name": "phpdocumentor/reflection-docblock",
"version": "2.0.4",
},
{
"name": "phpspec/prophecy",
- "version": "v1.3.1",
+ "version": "v1.4.1",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9"
+ "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/9ca52329bcdd1500de24427542577ebf3fc2f1c9",
- "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373",
+ "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "~1.0,>=1.0.2",
- "phpdocumentor/reflection-docblock": "~2.0"
+ "doctrine/instantiator": "^1.0.2",
+ "phpdocumentor/reflection-docblock": "~2.0",
+ "sebastian/comparator": "~1.1"
},
"require-dev": {
"phpspec/phpspec": "~2.0"
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "1.4.x-dev"
}
},
"autoload": {
}
],
"description": "Highly opinionated mocking framework for PHP 5.3+",
- "homepage": "http://phpspec.org",
+ "homepage": "https://github.com/phpspec/prophecy",
"keywords": [
"Double",
"Dummy",
"spy",
"stub"
],
- "time": "2014-11-17 16:23:49"
+ "time": "2015-04-27 22:15:08"
},
{
"name": "phpunit/php-code-coverage",
- "version": "2.0.15",
+ "version": "2.0.17",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "34cc484af1ca149188d0d9e91412191e398e0b67"
+ "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/34cc484af1ca149188d0d9e91412191e398e0b67",
- "reference": "34cc484af1ca149188d0d9e91412191e398e0b67",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c4e8e7725e351184a76544634855b8a9c405a6e3",
+ "reference": "c4e8e7725e351184a76544634855b8a9c405a6e3",
"shasum": ""
},
"require": {
"testing",
"xunit"
],
- "time": "2015-01-24 10:06:35"
+ "time": "2015-05-25 05:11:59"
},
{
"name": "phpunit/php-file-iterator",
- "version": "1.3.4",
+ "version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
+ "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb",
- "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb",
+ "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
"autoload": {
"classmap": [
- "File/"
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
- "include-path": [
- ""
- ],
"license": [
"BSD-3-Clause"
],
"filesystem",
"iterator"
],
- "time": "2013-10-10 15:34:57"
+ "time": "2015-04-02 05:19:05"
},
{
"name": "phpunit/php-text-template",
},
{
"name": "phpunit/php-token-stream",
- "version": "1.4.0",
+ "version": "1.4.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74"
+ "reference": "eab81d02569310739373308137284e0158424330"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db32c18eba00b121c145575fcbcd4d4d24e6db74",
- "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330",
+ "reference": "eab81d02569310739373308137284e0158424330",
"shasum": ""
},
"require": {
"keywords": [
"tokenizer"
],
- "time": "2015-01-17 09:51:32"
+ "time": "2015-04-08 04:46:07"
},
{
"name": "phpunit/phpunit",
- "version": "4.5.0",
+ "version": "4.6.9",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "5b578d3865a9128b9c209b011fda6539ec06e7a5"
+ "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5b578d3865a9128b9c209b011fda6539ec06e7a5",
- "reference": "5b578d3865a9128b9c209b011fda6539ec06e7a5",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/816d12536a7a032adc3b68737f82cfbbf98b79c1",
+ "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1",
"shasum": ""
},
"require": {
"ext-reflection": "*",
"ext-spl": "*",
"php": ">=5.3.3",
- "phpspec/prophecy": "~1.3.1",
- "phpunit/php-code-coverage": "~2.0",
- "phpunit/php-file-iterator": "~1.3.2",
+ "phpspec/prophecy": "~1.3,>=1.3.1",
+ "phpunit/php-code-coverage": "~2.0,>=2.0.11",
+ "phpunit/php-file-iterator": "~1.4",
"phpunit/php-text-template": "~1.2",
- "phpunit/php-timer": "~1.0.2",
+ "phpunit/php-timer": "~1.0",
"phpunit/phpunit-mock-objects": "~2.3",
"sebastian/comparator": "~1.1",
- "sebastian/diff": "~1.1",
+ "sebastian/diff": "~1.2",
"sebastian/environment": "~1.2",
"sebastian/exporter": "~1.2",
"sebastian/global-state": "~1.0",
"sebastian/version": "~1.0",
- "symfony/yaml": "~2.0"
+ "symfony/yaml": "~2.1|~3.0"
},
"suggest": {
"phpunit/php-invoker": "~1.1"
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.5.x-dev"
+ "dev-master": "4.6.x-dev"
}
},
"autoload": {
"testing",
"xunit"
],
- "time": "2015-02-05 15:51:19"
+ "time": "2015-05-29 06:00:03"
},
{
"name": "phpunit/phpunit-mock-objects",
- "version": "2.3.0",
+ "version": "2.3.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "c63d2367247365f688544f0d500af90a11a44c65"
+ "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/c63d2367247365f688544f0d500af90a11a44c65",
- "reference": "c63d2367247365f688544f0d500af90a11a44c65",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7",
+ "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "~1.0,>=1.0.1",
+ "doctrine/instantiator": "~1.0,>=1.0.2",
"php": ">=5.3.3",
"phpunit/php-text-template": "~1.2"
},
"require-dev": {
- "phpunit/phpunit": "~4.3"
+ "phpunit/phpunit": "~4.4"
},
"suggest": {
"ext-soap": "*"
"mock",
"xunit"
],
- "time": "2014-10-03 05:12:11"
+ "time": "2015-05-29 05:19:18"
},
{
"name": "sebastian/comparator",
},
{
"name": "sebastian/diff",
- "version": "1.2.0",
+ "version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "5843509fed39dee4b356a306401e9dd1a931fec7"
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7",
- "reference": "5843509fed39dee4b356a306401e9dd1a931fec7",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
"shasum": ""
},
"require": {
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2-dev"
+ "dev-master": "1.3-dev"
}
},
"autoload": {
"keywords": [
"diff"
],
- "time": "2014-08-15 10:29:00"
+ "time": "2015-02-22 15:13:53"
},
{
"name": "sebastian/environment",
- "version": "1.2.1",
+ "version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7"
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7",
- "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
- "phpunit/phpunit": "~4.3"
+ "phpunit/phpunit": "~4.4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
"environment",
"hhvm"
],
- "time": "2014-10-25 08:00:45"
+ "time": "2015-01-01 10:01:08"
},
{
"name": "sebastian/exporter",
},
{
"name": "sebastian/version",
- "version": "1.0.4",
+ "version": "1.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b"
+ "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b",
- "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
+ "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
"shasum": ""
},
"type": "library",
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
- "time": "2014-12-15 14:25:24"
+ "time": "2015-02-24 06:35:25"
},
{
"name": "sensio/generator-bundle",
- "version": "v2.5.2",
+ "version": "v2.5.3",
"target-dir": "Sensio/Bundle/GeneratorBundle",
"source": {
"type": "git",
"url": "https://github.com/sensiolabs/SensioGeneratorBundle.git",
- "reference": "4b09746520a826a7bf34a466ba31c7d8740fef7e"
+ "reference": "e50108c2133ee5c9c484555faed50c17a61221d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/4b09746520a826a7bf34a466ba31c7d8740fef7e",
- "reference": "4b09746520a826a7bf34a466ba31c7d8740fef7e",
+ "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/e50108c2133ee5c9c484555faed50c17a61221d3",
+ "reference": "e50108c2133ee5c9c484555faed50c17a61221d3",
"shasum": ""
},
"require": {
}
],
"description": "This bundle generates code for you",
- "time": "2015-02-11 07:21:23"
+ "time": "2015-03-17 06:36:52"
}
],
"aliases": [],
<?php
-namespace Wallabag\CoreBundle\Controller;
+namespace Wallabag\ApiBundle\Controller;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
* {"name"="username", "dataType"="string", "required"=true, "description"="username"}
* }
* )
+ *
* @return array
*/
public function getSaltAction($username)
return array($user->getSalt() ?: null);
}
+
/**
* Retrieve all entries. It could be filtered by many options.
*
* {"name"="tags", "dataType"="string", "required"=false, "format"="api%2Crest", "description"="a list of tags url encoded. Will returns entries that matches ALL tags."},
* }
* )
+ *
* @return Entry
*/
public function getEntriesAction(Request $request)
$order = $request->query->get('order', 'desc');
$page = (int) $request->query->get('page', 1);
$perPage = (int) $request->query->get('perPage', 30);
- $tags = $request->query->get('tags', array());
+ $tags = $request->query->get('tags', []);
$pager = $this
->getDoctrine()
->getRepository('WallabagCoreBundle:Entry')
->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $sort, $order);
- if (0 === $pager->getNbResults()) {
- throw $this->createNotFoundException();
- }
-
$pager->setCurrentPage($page);
$pager->setMaxPerPage($perPage);
$json = $this->get('serializer')->serialize($paginatedCollection, 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Retrieve a single entry
+ * Retrieve a single entry.
*
* @ApiDoc(
* requirements={
* {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"}
* }
* )
+ *
* @return Entry
*/
public function getEntryAction(Entry $entry)
{
- if ($entry->getUser()->getId() != $this->getUser()->getId()) {
- throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId());
- }
+ $this->validateUserAccess($entry->getUser()->getId(), $this->getUser()->getId());
$json = $this->get('serializer')->serialize($entry, 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Create an entry
+ * Create an entry.
*
* @ApiDoc(
* parameters={
* {"name"="tags", "dataType"="string", "required"=false, "format"="tag1,tag2,tag3", "description"="a comma-separated list of tags."},
* }
* )
+ *
* @return Entry
*/
public function postEntriesAction(Request $request)
$json = $this->get('serializer')->serialize($entry, 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Change several properties of an entry
+ * Change several properties of an entry.
*
* @ApiDoc(
* requirements={
* {"name"="star", "dataType"="boolean", "required"=false, "format"="true or false", "description"="starred the entry."},
* }
* )
+ *
* @return Entry
*/
public function patchEntriesAction(Entry $entry, Request $request)
{
- if ($entry->getUser()->getId() != $this->getUser()->getId()) {
- throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId());
- }
+ $this->validateUserAccess($entry->getUser()->getId(), $this->getUser()->getId());
- $title = $request->request->get("title");
- $isArchived = $request->request->get("archive");
- $isStarred = $request->request->get("star");
+ $title = $request->request->get('title');
+ $isArchived = $request->request->get('archive');
+ $isStarred = $request->request->get('star');
if (!is_null($title)) {
$entry->setTitle($title);
$json = $this->get('serializer')->serialize($entry, 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Delete **permanently** an entry
+ * Delete **permanently** an entry.
*
* @ApiDoc(
* requirements={
* {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"}
* }
* )
+ *
* @return Entry
*/
public function deleteEntriesAction(Entry $entry)
{
- if ($entry->getUser()->getId() != $this->getUser()->getId()) {
- throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId());
- }
+ $this->validateUserAccess($entry->getUser()->getId(), $this->getUser()->getId());
$em = $this->getDoctrine()->getManager();
$em->remove($entry);
$json = $this->get('serializer')->serialize($entry, 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Retrieve all tags for an entry
+ * Retrieve all tags for an entry.
*
* @ApiDoc(
* requirements={
*/
public function getEntriesTagsAction(Entry $entry)
{
- if ($entry->getUser()->getId() != $this->getUser()->getId()) {
- throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId());
- }
+ $this->validateUserAccess($entry->getUser()->getId(), $this->getUser()->getId());
$json = $this->get('serializer')->serialize($entry->getTags(), 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Add one or more tags to an entry
+ * Add one or more tags to an entry.
*
* @ApiDoc(
* requirements={
*/
public function postEntriesTagsAction(Request $request, Entry $entry)
{
- if ($entry->getUser()->getId() != $this->getUser()->getId()) {
- throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId());
- }
+ $this->validateUserAccess($entry->getUser()->getId(), $this->getUser()->getId());
$tags = $request->request->get('tags', '');
if (!empty($tags)) {
$json = $this->get('serializer')->serialize($entry, 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Permanently remove one tag for an entry
+ * Permanently remove one tag for an entry.
*
* @ApiDoc(
* requirements={
- * {"name"="tag", "dataType"="string", "requirement"="\w+", "description"="The tag"},
+ * {"name"="tag", "dataType"="integer", "requirement"="\w+", "description"="The tag ID"},
* {"name"="entry", "dataType"="integer", "requirement"="\w+", "description"="The entry ID"}
* }
* )
*/
public function deleteEntriesTagsAction(Entry $entry, Tag $tag)
{
- if ($entry->getUser()->getId() != $this->getUser()->getId()) {
- throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId());
- }
+ $this->validateUserAccess($entry->getUser()->getId(), $this->getUser()->getId());
$entry->removeTag($tag);
$em = $this->getDoctrine()->getManager();
$json = $this->get('serializer')->serialize($entry, 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Retrieve all tags
+ * Retrieve all tags.
*
* @ApiDoc()
*/
{
$json = $this->get('serializer')->serialize($this->getUser()->getTags(), 'json');
- return new Response($json, 200, array('application/json'));
+ return $this->renderJsonResponse($json);
}
/**
- * Permanently remove one tag from **every** entry
+ * Permanently remove one tag from **every** entry.
*
* @ApiDoc(
* requirements={
- * {"name"="tag", "dataType"="string", "requirement"="\w+", "description"="The tag"}
+ * {"name"="tag", "dataType"="integer", "requirement"="\w+", "description"="The tag"}
* }
* )
*/
public function deleteTagAction(Tag $tag)
{
- if ($tag->getUser()->getId() != $this->getUser()->getId()) {
- throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$tag->getUser()->getId().', logged user id: '.$this->getUser()->getId());
- }
+ $this->validateUserAccess($tag->getUser()->getId(), $this->getUser()->getId());
$em = $this->getDoctrine()->getManager();
$em->remove($tag);
$json = $this->get('serializer')->serialize($tag, 'json');
+ return $this->renderJsonResponse($json);
+ }
+
+ /**
+ * Validate that the first id is equal to the second one.
+ * If not, throw exception. It means a user try to access information from an other user.
+ *
+ * @param int $requestUserId User id from the requested source
+ * @param int $currentUserId User id from the retrieved source
+ */
+ private function validateUserAccess($requestUserId, $currentUserId)
+ {
+ if ($requestUserId != $currentUserId) {
+ throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$requestUserId.', logged user id: '.$currentUserId);
+ }
+ }
+
+ /**
+ * Send a JSON Response.
+ * We don't use the Symfony JsonRespone, because it takes an array as parameter instead of a JSON string.
+ *
+ * @param string $json
+ *
+ * @return Response
+ */
+ private function renderJsonResponse($json)
+ {
return new Response($json, 200, array('application/json'));
}
}
--- /dev/null
+<?php
+
+namespace Wallabag\ApiBundle\DependencyInjection;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+/**
+ * This is the class that validates and merges configuration from your app/config files.
+ *
+ * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
+ */
+class Configuration implements ConfigurationInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function getConfigTreeBuilder()
+ {
+ $treeBuilder = new TreeBuilder();
+ $rootNode = $treeBuilder->root('wallabag_api');
+
+ // Here you should define the parameters that are allowed to
+ // configure your bundle. See the documentation linked above for
+ // more information on that topic.
+
+ return $treeBuilder;
+ }
+}
<?php
-namespace Wallabag\CoreBundle\DependencyInjection\Security\Factory;
+namespace Wallabag\ApiBundle\DependencyInjection\Security\Factory;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
--- /dev/null
+<?php
+
+namespace Wallabag\ApiBundle\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+use Symfony\Component\DependencyInjection\Loader;
+
+class WallabagApiExtension extends Extension
+{
+ public function load(array $configs, ContainerBuilder $container)
+ {
+ $configuration = new Configuration();
+ $config = $this->processConfiguration($configuration, $configs);
+
+ $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+ $loader->load('services.yml');
+ }
+
+ public function getAlias()
+ {
+ return 'wallabag_api';
+ }
+}
--- /dev/null
+entries:
+ type: rest
+ resource: "WallabagApiBundle:WallabagRest"
+ name_prefix: api_
--- /dev/null
+services:
+ wsse.security.authentication.provider:
+ class: Wallabag\ApiBundle\Security\Authentication\Provider\WsseProvider
+ public: false
+ arguments: ['', '%kernel.cache_dir%/security/nonces']
+
+ wsse.security.authentication.listener:
+ class: Wallabag\ApiBundle\Security\Firewall\WsseListener
+ public: false
+ tags:
+ - { name: monolog.logger, channel: wsse }
+ arguments: ['@security.context', '@security.authentication.manager', '@logger']
<?php
-namespace Wallabag\CoreBundle\Security\Authentication\Provider;
+
+namespace Wallabag\ApiBundle\Security\Authentication\Provider;
use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\NonceExpiredException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
-use Wallabag\CoreBundle\Security\Authentication\Token\WsseUserToken;
+use Wallabag\ApiBundle\Security\Authentication\Token\WsseUserToken;
class WsseProvider implements AuthenticationProviderInterface
{
$user = $this->userProvider->loadUserByUsername($token->getUsername());
if (!$user) {
- throw new AuthenticationException("Bad credentials. Did you forgot your username?");
+ throw new AuthenticationException('Bad credentials. Did you forgot your username?');
}
if ($user && $this->validateDigest($token->digest, $token->nonce, $token->created, $user->getPassword())) {
{
// Check created time is not in the future
if (strtotime($created) > time()) {
- throw new AuthenticationException("Back to the future...");
+ throw new AuthenticationException('Back to the future...');
}
// Expire timestamp after 5 minutes
if (time() - strtotime($created) > 300) {
- throw new AuthenticationException("Too late for this timestamp... Watch your watch.");
+ throw new AuthenticationException('Too late for this timestamp... Watch your watch.');
}
// Validate nonce is unique within 5 minutes
$expected = base64_encode(sha1(base64_decode($nonce).$created.$secret, true));
if ($digest !== $expected) {
- throw new AuthenticationException("Bad credentials ! Digest is not as expected.");
+ throw new AuthenticationException('Bad credentials ! Digest is not as expected.');
}
return $digest === $expected;
<?php
-namespace Wallabag\CoreBundle\Security\Authentication\Token;
+
+namespace Wallabag\ApiBundle\Security\Authentication\Token;
use Symfony\Component\Security\Core\Authentication\Token\AbstractToken;
<?php
-namespace Wallabag\CoreBundle\Security\Firewall;
+namespace Wallabag\ApiBundle\Security\Firewall;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
-use Wallabag\CoreBundle\Security\Authentication\Token\WsseUserToken;
+use Wallabag\ApiBundle\Security\Authentication\Token\WsseUserToken;
use Psr\Log\LoggerInterface;
class WsseListener implements ListenerInterface
--- /dev/null
+<?php
+
+namespace Wallabag\ApiBundle\Tests\Controller;
+
+use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
+
+class WallabagRestControllerTest extends WebTestCase
+{
+ protected static $salt;
+
+ /**
+ * Grab the salt once and store it to be available for all tests.
+ */
+ public static function setUpBeforeClass()
+ {
+ $client = self::createClient();
+
+ $user = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:User')
+ ->findOneByUsername('admin');
+
+ self::$salt = $user->getSalt();
+ }
+
+ /**
+ * Generate HTTP headers for authenticate user on API.
+ *
+ * @param string $username
+ * @param string $password
+ *
+ * @return array
+ */
+ private function generateHeaders($username, $password)
+ {
+ $encryptedPassword = sha1($password.$username.self::$salt);
+ $nonce = substr(md5(uniqid('nonce_', true)), 0, 16);
+
+ $now = new \DateTime('now', new \DateTimeZone('UTC'));
+ $created = (string) $now->format('Y-m-d\TH:i:s\Z');
+ $digest = base64_encode(sha1(base64_decode($nonce).$created.$encryptedPassword, true));
+
+ return array(
+ 'HTTP_AUTHORIZATION' => 'Authorization profile="UsernameToken"',
+ 'HTTP_x-wsse' => 'X-WSSE: UsernameToken Username="'.$username.'", PasswordDigest="'.$digest.'", Nonce="'.$nonce.'", Created="'.$created.'"',
+ );
+ }
+
+ public function testGetSalt()
+ {
+ $client = $this->createClient();
+ $client->request('GET', '/api/salts/admin.json');
+
+ $user = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:User')
+ ->findOneByUsername('admin');
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertArrayHasKey(0, $content);
+ $this->assertEquals($user->getSalt(), $content[0]);
+
+ $client->request('GET', '/api/salts/notfound.json');
+ $this->assertEquals(404, $client->getResponse()->getStatusCode());
+ }
+
+ public function testWithBadHeaders()
+ {
+ $client = $this->createClient();
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneByIsArchived(false);
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ $badHeaders = array(
+ 'HTTP_AUTHORIZATION' => 'Authorization profile="UsernameToken"',
+ 'HTTP_x-wsse' => 'X-WSSE: UsernameToken Username="admin", PasswordDigest="Wr0ngDig3st", Nonce="n0Nc3", Created="2015-01-01T13:37:00Z"',
+ );
+
+ $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $badHeaders);
+ $this->assertEquals(403, $client->getResponse()->getStatusCode());
+ }
+
+ public function testGetOneEntry()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneBy(array('user' => 1, 'isArchived' => false));
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertEquals($entry->getTitle(), $content['title']);
+ $this->assertEquals($entry->getUrl(), $content['url']);
+ $this->assertCount(count($entry->getTags()), $content['tags']);
+
+ $this->assertTrue(
+ $client->getResponse()->headers->contains(
+ 'Content-Type',
+ 'application/json'
+ )
+ );
+ }
+
+ public function testGetOneEntryWrongUser()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneBy(array('user' => 2, 'isArchived' => false));
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
+
+ $this->assertEquals(403, $client->getResponse()->getStatusCode());
+ }
+
+ public function testGetEntries()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $client->request('GET', '/api/entries', array(), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertGreaterThanOrEqual(1, count($content));
+ $this->assertNotEmpty($content['_embedded']['items']);
+ $this->assertGreaterThanOrEqual(1, $content['total']);
+ $this->assertEquals(1, $content['page']);
+ $this->assertGreaterThanOrEqual(1, $content['pages']);
+
+ $this->assertTrue(
+ $client->getResponse()->headers->contains(
+ 'Content-Type',
+ 'application/json'
+ )
+ );
+ }
+
+ public function testGetStarredEntries()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $client->request('GET', '/api/entries', array('archive' => 1), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertGreaterThanOrEqual(1, count($content));
+ $this->assertNotEmpty($content['_embedded']['items']);
+ $this->assertGreaterThanOrEqual(1, $content['total']);
+ $this->assertEquals(1, $content['page']);
+ $this->assertGreaterThanOrEqual(1, $content['pages']);
+
+ $this->assertTrue(
+ $client->getResponse()->headers->contains(
+ 'Content-Type',
+ 'application/json'
+ )
+ );
+ }
+
+ public function testDeleteEntry()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneByUser(1);
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertEquals($entry->getTitle(), $content['title']);
+ $this->assertEquals($entry->getUrl(), $content['url']);
+
+ // We'll try to delete this entry again
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
+
+ $this->assertEquals(404, $client->getResponse()->getStatusCode());
+ }
+
+ public function testPostEntry()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $client->request('POST', '/api/entries.json', array(
+ 'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html',
+ 'tags' => 'google',
+ ), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertGreaterThan(0, $content['id']);
+ $this->assertEquals('http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', $content['url']);
+ $this->assertEquals(false, $content['is_archived']);
+ $this->assertEquals(false, $content['is_starred']);
+ $this->assertCount(1, $content['tags']);
+ }
+
+ public function testPatchEntry()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneByUser(1);
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ // hydrate the tags relations
+ $nbTags = count($entry->getTags());
+
+ $client->request('PATCH', '/api/entries/'.$entry->getId().'.json', array(
+ 'title' => 'New awesome title',
+ 'tags' => 'new tag '.uniqid(),
+ 'star' => true,
+ 'archive' => false,
+ ), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertEquals($entry->getId(), $content['id']);
+ $this->assertEquals($entry->getUrl(), $content['url']);
+ $this->assertEquals('New awesome title', $content['title']);
+ $this->assertGreaterThan($nbTags, count($content['tags']));
+ }
+
+ public function testGetTagsEntry()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneWithTags(1);
+
+ $entry = $entry[0];
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ $tags = array();
+ foreach ($entry->getTags() as $tag) {
+ $tags[] = array('id' => $tag->getId(), 'label' => $tag->getLabel());
+ }
+
+ $client->request('GET', '/api/entries/'.$entry->getId().'/tags', array(), array(), $headers);
+
+ $this->assertEquals(json_encode($tags, JSON_HEX_QUOT), $client->getResponse()->getContent());
+ }
+
+ public function testPostTagsOnEntry()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneByUser(1);
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ $nbTags = count($entry->getTags());
+
+ $newTags = 'tag1,tag2,tag3';
+
+ $client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertArrayHasKey('tags', $content);
+ $this->assertEquals($nbTags + 3, count($content['tags']));
+
+ $entryDB = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->find($entry->getId());
+
+ $tagsInDB = array();
+ foreach ($entryDB->getTags()->toArray() as $tag) {
+ $tagsInDB[$tag->getId()] = $tag->getLabel();
+ }
+
+ foreach (explode(',', $newTags) as $tag) {
+ $this->assertContains($tag, $tagsInDB);
+ }
+ }
+
+ public function testDeleteOneTagEntrie()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $entry = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:Entry')
+ ->findOneByUser(1);
+
+ if (!$entry) {
+ $this->markTestSkipped('No content found in db.');
+ }
+
+ // hydrate the tags relations
+ $nbTags = count($entry->getTags());
+ $tag = $entry->getTags()[0];
+
+ $client->request('DELETE', '/api/entries/'.$entry->getId().'/tags/'.$tag->getId().'.json', array(), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertArrayHasKey('tags', $content);
+ $this->assertEquals($nbTags - 1, count($content['tags']));
+ }
+
+ public function testGetUserTags()
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $client->request('GET', '/api/tags.json', array(), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertGreaterThan(0, $content);
+ $this->assertArrayHasKey('id', $content[0]);
+ $this->assertArrayHasKey('label', $content[0]);
+
+ return end($content);
+ }
+
+ /**
+ * @depends testGetUserTags
+ */
+ public function testDeleteUserTag($tag)
+ {
+ $client = $this->createClient();
+ $headers = $this->generateHeaders('admin', 'mypassword');
+
+ $client->request('DELETE', '/api/tags/'.$tag['id'].'.json', array(), array(), $headers);
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+
+ $this->assertArrayHasKey('label', $content);
+ $this->assertEquals($tag['label'], $content['label']);
+ }
+}
--- /dev/null
+<?php
+
+namespace Wallabag\ApiBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+use Wallabag\ApiBundle\DependencyInjection\Security\Factory\WsseFactory;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+class WallabagApiBundle extends Bundle
+{
+ public function build(ContainerBuilder $container)
+ {
+ parent::build($container);
+
+ $extension = $container->getExtension('security');
+ $extension->addSecurityListenerFactory(new WsseFactory());
+ }
+}
}
/**
- * Run a command
+ * Run a command.
*
* @param string $command
* @param array $parameters Parameters to this command (usually 'force' => true)
}
/**
- * Check if the database already exists
+ * Check if the database already exists.
*
- * @return boolean
+ * @return bool
*/
private function isDatabasePresent()
{
/**
* Check if the schema is already created.
- * If we found at least oen table, it means the schema exists
+ * If we found at least oen table, it means the schema exists.
*
- * @return boolean
+ * @return bool
*/
private function isSchemaPresent()
{
'rss' => array(
'username' => $user->getUsername(),
'token' => $config->getRssToken(),
- )
+ ),
));
}
}
/**
- * Shows unread entries for current user
+ * Shows unread entries for current user.
*
* @Route("/unread", name="unread")
*
}
/**
- * Shows read entries for current user
+ * Shows read entries for current user.
*
* @Route("/archive", name="archive")
*
}
/**
- * Shows starred entries for current user
+ * Shows starred entries for current user.
*
* @Route("/starred", name="starred")
*
}
/**
- * Shows entry content
+ * Shows entry content.
*
* @param Entry $entry
*
}
/**
- * Changes read status for an entry
+ * Changes read status for an entry.
*
* @param Request $request
* @param Entry $entry
}
/**
- * Changes favorite status for an entry
+ * Changes favorite status for an entry.
*
* @param Request $request
* @param Entry $entry
}
/**
- * Deletes entry
+ * Deletes entry.
*
* @param Request $request
* @param Entry $entry
}
/**
- * Check if the logged user can manage the given entry
+ * Check if the logged user can manage the given entry.
*
* @param Entry $entry
*/
class RssController extends Controller
{
/**
- * Shows unread entries for current user
+ * Shows unread entries for current user.
*
* @Route("/{username}/{token}/unread.xml", name="unread_rss", defaults={"_format"="xml"})
* @ParamConverter("user", class="WallabagCoreBundle:User", converter="username_rsstoken_converter")
}
/**
- * Shows read entries for current user
+ * Shows read entries for current user.
*
* @Route("/{username}/{token}/archive.xml", name="archive_rss")
* @ParamConverter("user", class="WallabagCoreBundle:User", converter="username_rsstoken_converter")
}
/**
- * Shows starred entries for current user
+ * Shows starred entries for current user.
*
* @Route("/{username}/{token}/starred.xml", name="starred_rss")
* @ParamConverter("user", class="WallabagCoreBundle:User", converter="username_rsstoken_converter")
}
/**
- * Request forgot password: show form
+ * Request forgot password: show form.
*
* @Route("/forgot-password", name="forgot_password")
+ *
* @Method({"GET", "POST"})
*/
public function forgotPasswordAction(Request $request)
}
/**
- * Tell the user to check his email provider
+ * Tell the user to check his email provider.
*
* @Route("/forgot-password/check-email", name="forgot_password_check_email")
+ *
* @Method({"GET"})
*/
public function checkEmailAction(Request $request)
}
/**
- * Reset user password
+ * Reset user password.
*
* @Route("/forgot-password/{token}", name="forgot_password_reset")
+ *
* @Method({"GET", "POST"})
*/
public function resetAction(Request $request, $token)
$entry3->setContent('This is my content /o/');
$tag1 = new Tag($this->getReference('bob-user'));
- $tag1->setLabel("foo");
+ $tag1->setLabel('foo');
$tag2 = new Tag($this->getReference('bob-user'));
- $tag2->setLabel("bar");
+ $tag2->setLabel('bar');
$entry3->addTag($tag1);
$entry3->addTag($tag2);
$entry4->setContent('This is my content /o/');
$tag1 = new Tag($this->getReference('admin-user'));
- $tag1->setLabel("foo");
+ $tag1->setLabel('foo');
$tag2 = new Tag($this->getReference('admin-user'));
- $tag2->setLabel("bar");
+ $tag2->setLabel('bar');
$entry4->addTag($tag1);
$entry4->addTag($tag2);
namespace Wallabag\CoreBundle\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
-use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Config\FileLocator;
+use Symfony\Component\HttpKernel\DependencyInjection\Extension;
+use Symfony\Component\DependencyInjection\Loader;
class WallabagCoreExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
- $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+ $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
}
*/
public function classToTableName($className)
{
- return strtolower($this->prefix . substr($className, strrpos($className, '\\') + 1));
+ return strtolower($this->prefix.substr($className, strrpos($className, '\\') + 1));
}
/**
*/
public function joinColumnName($propertyName)
{
- return $propertyName . '_' . $this->referenceColumnName();
+ return $propertyName.'_'.$this->referenceColumnName();
}
/**
// ie: not "wallabag_entry_wallabag_tag" but "wallabag_entry_tag"
$target = substr($targetEntity, strrpos($targetEntity, '\\') + 1);
- return strtolower($this->classToTableName($sourceEntity) . '_' .$target);
+ return strtolower($this->classToTableName($sourceEntity).'_'.$target);
}
/**
*/
public function joinKeyColumnName($entityName, $referencedColumnName = null)
{
- return strtolower($this->classToTableName($entityName) . '_' .($referencedColumnName ?: $this->referenceColumnName()));
+ return strtolower($this->classToTableName($entityName).'_'.($referencedColumnName ?: $this->referenceColumnName()));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function embeddedFieldToColumnName($propertyName, $embeddedColumnName, $className = null, $embeddedClassName = null)
+ {
+ return $propertyName.'_'.$embeddedColumnName;
}
}
use Symfony\Component\Validator\Constraints as Assert;
/**
- * Config
+ * Config.
*
* @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\ConfigRepository")
* @ORM\Table
class Config
{
/**
- * @var integer
+ * @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
private $theme;
/**
- * @var integer
+ * @var int
*
* @Assert\NotBlank()
* @Assert\Range(
private $rssToken;
/**
- * @var integer
+ * @var int
*
* @ORM\Column(name="rss_limit", type="integer", nullable=true)
* @Assert\Range(
}
/**
- * Get id
+ * Get id.
*
- * @return integer
+ * @return int
*/
public function getId()
{
}
/**
- * Set theme
+ * Set theme.
+ *
+ * @param string $theme
*
- * @param string $theme
* @return Config
*/
public function setTheme($theme)
}
/**
- * Get theme
+ * Get theme.
*
* @return string
*/
}
/**
- * Set itemsPerPage
+ * Set itemsPerPage.
+ *
+ * @param int $itemsPerPage
*
- * @param integer $itemsPerPage
* @return Config
*/
public function setItemsPerPage($itemsPerPage)
}
/**
- * Get itemsPerPage
+ * Get itemsPerPage.
*
- * @return integer
+ * @return int
*/
public function getItemsPerPage()
{
}
/**
- * Set language
+ * Set language.
+ *
+ * @param string $language
*
- * @param string $language
* @return Config
*/
public function setLanguage($language)
}
/**
- * Get language
+ * Get language.
*
* @return string
*/
}
/**
- * Set user
+ * Set user.
+ *
+ * @param \Wallabag\CoreBundle\Entity\User $user
*
- * @param \Wallabag\CoreBundle\Entity\User $user
* @return Config
*/
public function setUser(\Wallabag\CoreBundle\Entity\User $user = null)
}
/**
- * Get user
+ * Get user.
*
* @return \Wallabag\CoreBundle\Entity\User
*/
}
/**
- * Set rssToken
+ * Set rssToken.
+ *
+ * @param string $rssToken
*
- * @param string $rssToken
* @return Config
*/
public function setRssToken($rssToken)
}
/**
- * Get rssToken
+ * Get rssToken.
*
* @return string
*/
}
/**
- * Set rssLimit
+ * Set rssLimit.
+ *
+ * @param string $rssLimit
*
- * @param string $rssLimit
* @return Config
*/
public function setRssLimit($rssLimit)
}
/**
- * Get rssLimit
+ * Get rssLimit.
*
* @return string
*/
use JMS\Serializer\Annotation\XmlRoot;
/**
- * Entry
+ * Entry.
*
* @XmlRoot("entry")
* @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\EntryRepository")
{
/** @Serializer\XmlAttribute */
/**
- * @var integer
+ * @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
private $url;
/**
- * @var boolean
+ * @var bool
*
* @ORM\Column(name="is_archived", type="boolean")
*/
private $isArchived = false;
/**
- * @var boolean
+ * @var bool
*
* @ORM\Column(name="is_starred", type="boolean")
*/
private $mimetype;
/**
- * @var integer
+ * @var int
*
* @ORM\Column(name="reading_type", type="integer", nullable=true)
*/
private $domainName;
/**
- * @var boolean
+ * @var bool
*
* @ORM\Column(name="is_public", type="boolean", nullable=true, options={"default" = false})
*/
}
/**
- * Get id
+ * Get id.
*
- * @return integer
+ * @return int
*/
public function getId()
{
}
/**
- * Set title
+ * Set title.
+ *
+ * @param string $title
*
- * @param string $title
* @return Entry
*/
public function setTitle($title)
}
/**
- * Get title
+ * Get title.
*
* @return string
*/
}
/**
- * Set url
+ * Set url.
+ *
+ * @param string $url
*
- * @param string $url
* @return Entry
*/
public function setUrl($url)
}
/**
- * Get url
+ * Get url.
*
* @return string
*/
}
/**
- * Set isArchived
+ * Set isArchived.
+ *
+ * @param string $isArchived
*
- * @param string $isArchived
* @return Entry
*/
public function setArchived($isArchived)
}
/**
- * Get isArchived
+ * Get isArchived.
*
* @return string
*/
}
/**
- * Set isStarred
+ * Set isStarred.
+ *
+ * @param string $isStarred
*
- * @param string $isStarred
* @return Entry
*/
public function setStarred($isStarred)
}
/**
- * Get isStarred
+ * Get isStarred.
*
* @return string
*/
}
/**
- * Set content
+ * Set content.
+ *
+ * @param string $content
*
- * @param string $content
* @return Entry
*/
public function setContent($content)
}
/**
- * Get content
+ * Get content.
*
* @return string
*/
}
/**
- * @return boolean
+ * @return bool
*/
public function isPublic()
{
}
/**
- * @param boolean $isPublic
+ * @param bool $isPublic
*/
public function setPublic($isPublic)
{
use Doctrine\Common\Collections\ArrayCollection;
/**
- * Tag
+ * Tag.
*
* @XmlRoot("tag")
* @ORM\Table
class Tag
{
/**
- * @var integer
+ * @var int
*
* @Expose
* @ORM\Column(name="id", type="integer")
$this->entries = new ArrayCollection();
}
/**
- * Get id
+ * Get id.
*
- * @return integer
+ * @return int
*/
public function getId()
{
}
/**
- * Set label
+ * Set label.
+ *
+ * @param string $label
*
- * @param string $label
* @return Tag
*/
public function setLabel($label)
}
/**
- * Get label
+ * Get label.
*
* @return string
*/
use JMS\Serializer\Annotation\Expose;
/**
- * User
+ * User.
*
* @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\UserRepository")
* @ORM\Table
class User implements AdvancedUserInterface, \Serializable
{
/**
- * @var integer
+ * @var int
*
* @Expose
* @ORM\Column(name="id", type="integer")
}
/**
- * Get id
+ * Get id.
*
- * @return integer
+ * @return int
*/
public function getId()
{
}
/**
- * Set username
+ * Set username.
+ *
+ * @param string $username
*
- * @param string $username
* @return User
*/
public function setUsername($username)
}
/**
- * Get username
+ * Get username.
*
* @return string
*/
}
/**
- * Set password
+ * Set password.
+ *
+ * @param string $password
*
- * @param string $password
* @return User
*/
public function setPassword($password)
}
/**
- * Get password
+ * Get password.
*
* @return string
*/
}
/**
- * Set name
+ * Set name.
+ *
+ * @param string $name
*
- * @param string $name
* @return User
*/
public function setName($name)
}
/**
- * Get name
+ * Get name.
*
* @return string
*/
}
/**
- * Set email
+ * Set email.
+ *
+ * @param string $email
*
- * @param string $email
* @return User
*/
public function setEmail($email)
}
/**
- * Get email
+ * Get email.
*
* @return string
*/
public function unserialize($serialized)
{
list(
- $this->id,
- ) = unserialize($serialized);
+ $this->id) = unserialize($serialized);
}
public function isEqualTo(UserInterface $user)
return $this->isActive;
}
/**
- * Set config
+ * Set config.
+ *
+ * @param \Wallabag\CoreBundle\Entity\Config $config
*
- * @param \Wallabag\CoreBundle\Entity\Config $config
* @return User
*/
public function setConfig(\Wallabag\CoreBundle\Entity\Config $config = null)
}
/**
- * Get config
+ * Get config.
*
* @return \Wallabag\CoreBundle\Entity\Config
*/
}
/**
- * Set confirmationToken
+ * Set confirmationToken.
+ *
+ * @param string $confirmationToken
*
- * @param string $confirmationToken
* @return User
*/
public function setConfirmationToken($confirmationToken)
}
/**
- * Get confirmationToken
+ * Get confirmationToken.
*
* @return string
*/
}
/**
- * Set passwordRequestedAt
+ * Set passwordRequestedAt.
+ *
+ * @param \DateTime $passwordRequestedAt
*
- * @param \DateTime $passwordRequestedAt
* @return User
*/
public function setPasswordRequestedAt($passwordRequestedAt)
}
/**
- * Get passwordRequestedAt
+ * Get passwordRequestedAt.
*
* @return \DateTime
*/
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
<?php
+
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
final class Tools
{
/**
- * Download a file (typically, for downloading pictures on web server)
+ * Download a file (typically, for downloading pictures on web server).
*
* @param $url
+ *
* @return bool|mixed|string
*/
public static function getFile($url)
{
$timeout = 15;
- $useragent = "Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0";
+ $useragent = 'Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0';
if (in_array('curl', get_loaded_extensions())) {
# Fetch feed from URL
# FeedBurner requires a proper USER-AGENT...
curl_setopt($curl, CURL_HTTP_VERSION_1_1, true);
- curl_setopt($curl, CURLOPT_ENCODING, "gzip, deflate");
+ curl_setopt($curl, CURLOPT_ENCODING, 'gzip, deflate');
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
$data = curl_exec($curl);
array(
'http' => array(
'timeout' => $timeout,
- 'header' => "User-Agent: ".$useragent,
+ 'header' => 'User-Agent: '.$useragent,
'follow_location' => true,
),
'ssl' => array(
}
/**
- * Encode a URL by using a salt
+ * Encode a URL by using a salt.
*
* @param $string
+ *
* @return string
*/
public static function encodeString($string)
class EntryRepository extends EntityRepository
{
/**
- * Retrieves unread entries for a user
+ * Retrieves unread entries for a user.
*
* @param int $userId
* @param int $firstResult
}
/**
- * Retrieves read entries for a user
+ * Retrieves read entries for a user.
*
* @param int $userId
* @param int $firstResult
}
/**
- * Retrieves starred entries for a user
+ * Retrieves starred entries for a user.
*
* @param int $userId
* @param int $firstResult
}
/**
- * Find Entries
+ * Find Entries.
*
* @param int $userId
* @param bool $isArchived
class UserRepository extends EntityRepository
{
/**
- * Find a user by its username and rss roken
+ * Find a user by its username and rss roken.
*
* @param string $username
* @param string $rssToken
+++ /dev/null
-entries:
- type: rest
- resource: "WallabagCoreBundle:WallabagRest"
- name_prefix: api_
tags:
- { name: twig.extension }
- wsse.security.authentication.provider:
- class: Wallabag\CoreBundle\Security\Authentication\Provider\WsseProvider
- public: false
- arguments: ['', '%kernel.cache_dir%/security/nonces']
-
- wsse.security.authentication.listener:
- class: Wallabag\CoreBundle\Security\Firewall\WsseListener
- public: false
- tags:
- - { name: monolog.logger, channel: wsse }
- arguments: ['@security.context', '@security.authentication.manager', '@logger']
-
wallabag_core.helper.detect_active_theme:
class: Wallabag\CoreBundle\Helper\DetectActiveTheme
arguments:
/**
* This override just add en extra variable (username) to be able to salt the password
- * the way Wallabag v1 does. It will avoid to break compatibility with Wallabag v1
- *
+ * the way Wallabag v1 does. It will avoid to break compatibility with Wallabag v1.
*/
class WallabagPasswordEncoder extends BasePasswordEncoder
{
throw new BadCredentialsException('The credentials were changed from another session.');
}
} else {
- if ("" === ($presentedPassword = $token->getCredentials())) {
+ if ('' === ($presentedPassword = $token->getCredentials())) {
throw new BadCredentialsException('The presented password cannot be empty.');
}
{
public static function extract($url)
{
- $pageContent = Extractor::getPageContent(new Url(base64_encode($url)));
+ $pageContent = self::getPageContent(new Url(base64_encode($url)));
$title = $pageContent['rss']['channel']['item']['title'] ?: 'Untitled';
$body = $pageContent['rss']['channel']['item']['description'];
}
/**
- * Get the content for a given URL (by a call to FullTextFeed)
+ * Get the content for a given URL (by a call to FullTextFeed).
+ *
+ * @param Url $url
*
- * @param Url $url
* @return mixed
*/
public static function getPageContent(Url $url)
$scope = function () {
extract(func_get_arg(1));
$_GET = $_REQUEST = array(
- "url" => $url->getUrl(),
- "max" => 5,
- "links" => "preserve",
- "exc" => "",
- "format" => "json",
- "submit" => "Create Feed",
+ 'url' => $url->getUrl(),
+ 'max' => 5,
+ 'links' => 'preserve',
+ 'exc' => '',
+ 'format' => 'json',
+ 'submit' => 'Create Feed',
);
ob_start();
require func_get_arg(0);
// Silence $scope function to avoid
// issues with FTRSS when error_reporting is to high
// FTRSS generates PHP warnings which break output
- $json = @$scope(__DIR__."/../../../../vendor/wallabag/Fivefilters_Libraries/makefulltextfeed.php", array("url" => $url));
+ $json = @$scope(__DIR__.'/../../../../vendor/wallabag/Fivefilters_Libraries/makefulltextfeed.php', array('url' => $url));
// Clearing and restoring context
foreach ($GLOBALS as $key => $value) {
- if ($key != "GLOBALS" && $key != "_SESSION") {
+ if ($key != 'GLOBALS' && $key != '_SESSION') {
unset($GLOBALS[$key]);
}
}
namespace Wallabag\CoreBundle\Tests\Command;
-use Wallabag\CoreBundle\Tests\WallabagTestCase;
+use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
use Wallabag\CoreBundle\Command\InstallCommand;
use Wallabag\CoreBundle\Tests\Mock\InstallCommandMock;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand;
use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand;
-class InstallCommandTest extends WallabagTestCase
+class InstallCommandTest extends WallabagCoreTestCase
{
public static function tearDownAfterClass()
{
namespace Wallabag\CoreBundle\Tests\Controller;
-use Wallabag\CoreBundle\Tests\WallabagTestCase;
+use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
-class ConfigControllerTest extends WallabagTestCase
+class ConfigControllerTest extends WallabagCoreTestCase
{
public function testLogin()
{
);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
- $content = json_decode($client->getResponse()->getContent(), true);;
+ $content = json_decode($client->getResponse()->getContent(), true);
$this->assertArrayHasKey('token', $content);
}
namespace Wallabag\CoreBundle\Tests\Controller;
-use Wallabag\CoreBundle\Tests\WallabagTestCase;
+use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
use Doctrine\ORM\AbstractQuery;
-class EntryControllerTest extends WallabagTestCase
+class EntryControllerTest extends WallabagCoreTestCase
{
public function testLogin()
{
namespace Wallabag\CoreBundle\Tests\Controller;
-use Wallabag\CoreBundle\Tests\WallabagTestCase;
+use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
-class RssControllerTest extends WallabagTestCase
+class RssControllerTest extends WallabagCoreTestCase
{
public function validateDom($xml, $nb = null)
{
{
return array(
array(
- '/admin/YZIOAUZIAO/unread.xml'
+ '/admin/YZIOAUZIAO/unread.xml',
),
array(
- '/wallace/YZIOAUZIAO/starred.xml'
+ '/wallace/YZIOAUZIAO/starred.xml',
),
array(
- '/wallace/YZIOAUZIAO/archives.xml'
+ '/wallace/YZIOAUZIAO/archives.xml',
),
);
}
namespace Wallabag\CoreBundle\Tests\Controller;
-use Wallabag\CoreBundle\Tests\WallabagTestCase;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
+use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
-class SecurityControllerTest extends WallabagTestCase
+class SecurityControllerTest extends WallabagCoreTestCase
{
public function testLogin()
{
+++ /dev/null
-<?php
-
-namespace Wallabag\CoreBundle\Tests\Controller;
-
-use Wallabag\CoreBundle\Tests\WallabagTestCase;
-
-class WallabagRestControllerTest extends WallabagTestCase
-{
- /**
- * Generate HTTP headers for authenticate user on API
- *
- * @param $username
- * @param $password
- * @param $salt
- *
- * @return array
- */
- private function generateHeaders($username, $password, $salt)
- {
- $encryptedPassword = sha1($password.$username.$salt);
- $nonce = substr(md5(uniqid('nonce_', true)), 0, 16);
-
- $now = new \DateTime('now', new \DateTimeZone('UTC'));
- $created = (string) $now->format('Y-m-d\TH:i:s\Z');
- $digest = base64_encode(sha1(base64_decode($nonce).$created.$encryptedPassword, true));
-
- return array(
- 'HTTP_AUTHORIZATION' => 'Authorization profile="UsernameToken"',
- 'HTTP_x-wsse' => 'X-WSSE: UsernameToken Username="'.$username.'", PasswordDigest="'.$digest.'", Nonce="'.$nonce.'", Created="'.$created.'"',
- );
- }
-
- public function testGetSalt()
- {
- $client = $this->createClient();
- $client->request('GET', '/api/salts/admin.json');
- $this->assertEquals(200, $client->getResponse()->getStatusCode());
- $this->assertNotEmpty(json_decode($client->getResponse()->getContent()));
-
- $client->request('GET', '/api/salts/notfound.json');
- $this->assertEquals(404, $client->getResponse()->getStatusCode());
- }
-
- public function testWithBadHeaders()
- {
- $client = $this->createClient();
-
- $entry = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->getRepository('WallabagCoreBundle:Entry')
- ->findOneByIsArchived(false);
-
- if (!$entry) {
- $this->markTestSkipped('No content found in db.');
- }
-
- $badHeaders = array(
- 'HTTP_AUTHORIZATION' => 'Authorization profile="UsernameToken"',
- 'HTTP_x-wsse' => 'X-WSSE: UsernameToken Username="admin", PasswordDigest="Wr0ngDig3st", Nonce="n0Nc3", Created="2015-01-01T13:37:00Z"',
- );
-
- $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $badHeaders);
- $this->assertEquals(403, $client->getResponse()->getStatusCode());
- }
-
- public function testGetOneEntry()
- {
- $client = $this->createClient();
- $client->request('GET', '/api/salts/admin.json');
- $salt = json_decode($client->getResponse()->getContent());
-
- $headers = $this->generateHeaders('admin', 'mypassword', $salt[0]);
-
- $entry = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->getRepository('WallabagCoreBundle:Entry')
- ->findOneByIsArchived(false);
-
- if (!$entry) {
- $this->markTestSkipped('No content found in db.');
- }
-
- $client->request('GET', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
- $this->assertContains($entry->getTitle(), $client->getResponse()->getContent());
-
- $this->assertTrue(
- $client->getResponse()->headers->contains(
- 'Content-Type',
- 'application/json'
- )
- );
- }
-
- public function testGetEntries()
- {
- $client = $this->createClient();
- $client->request('GET', '/api/salts/admin.json');
- $salt = json_decode($client->getResponse()->getContent());
-
- $headers = $this->generateHeaders('admin', 'mypassword', $salt[0]);
-
- $client->request('GET', '/api/entries', array(), array(), $headers);
-
- $this->assertEquals(200, $client->getResponse()->getStatusCode());
-
- $this->assertGreaterThanOrEqual(1, count(json_decode($client->getResponse()->getContent())));
-
- $this->assertContains('Google', $client->getResponse()->getContent());
-
- $this->assertTrue(
- $client->getResponse()->headers->contains(
- 'Content-Type',
- 'application/json'
- )
- );
- }
-
- public function testDeleteEntry()
- {
- $client = $this->createClient();
- $client->request('GET', '/api/salts/admin.json');
- $salt = json_decode($client->getResponse()->getContent());
-
- $headers = $this->generateHeaders('admin', 'mypassword', $salt[0]);
-
- $entry = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->getRepository('WallabagCoreBundle:Entry')
- ->findOneByUser(1);
-
- if (!$entry) {
- $this->markTestSkipped('No content found in db.');
- }
-
- $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
-
- $this->assertEquals(200, $client->getResponse()->getStatusCode());
-
- // We'll try to delete this entry again
- $client->request('GET', '/api/salts/admin.json');
- $salt = json_decode($client->getResponse()->getContent());
-
- $headers = $this->generateHeaders('admin', 'mypassword', $salt[0]);
-
- $client->request('DELETE', '/api/entries/'.$entry->getId().'.json', array(), array(), $headers);
-
- $this->assertEquals(404, $client->getResponse()->getStatusCode());
- }
-
- public function testGetTagsEntry()
- {
- $client = $this->createClient();
- $client->request('GET', '/api/salts/admin.json');
- $salt = json_decode($client->getResponse()->getContent());
- $headers = $this->generateHeaders('admin', 'mypassword', $salt[0]);
-
- $entry = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->getRepository('WallabagCoreBundle:Entry')
- ->findOneWithTags(1);
-
- $entry = $entry[0];
-
- if (!$entry) {
- $this->markTestSkipped('No content found in db.');
- }
-
- $tags = array();
- foreach ($entry->getTags() as $tag) {
- $tags[] = array('id' => $tag->getId(), 'label' => $tag->getLabel());
- }
-
- $client->request('GET', '/api/entries/'.$entry->getId().'/tags', array(), array(), $headers);
-
- $this->assertEquals(json_encode($tags, JSON_HEX_QUOT), $client->getResponse()->getContent());
- }
-
- public function testPostTagsOnEntry()
- {
- $client = $this->createClient();
- $client->request('GET', '/api/salts/admin.json');
- $salt = json_decode($client->getResponse()->getContent());
- $headers = $this->generateHeaders('admin', 'mypassword', $salt[0]);
-
- $entry = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->getRepository('WallabagCoreBundle:Entry')
- ->findOneByUser(1);
-
- if (!$entry) {
- $this->markTestSkipped('No content found in db.');
- }
-
- $newTags = 'tag1,tag2,tag3';
-
- $client->request('POST', '/api/entries/'.$entry->getId().'/tags', array('tags' => $newTags), array(), $headers);
-
- $this->assertEquals(200, $client->getResponse()->getStatusCode());
-
- $entryDB = $client->getContainer()
- ->get('doctrine.orm.entity_manager')
- ->getRepository('WallabagCoreBundle:Entry')
- ->find($entry->getId());
-
- $tagsInDB = array();
- foreach ($entryDB->getTags()->toArray() as $tag) {
- $tagsInDB[$tag->getId()] = $tag->getLabel();
- }
-
- foreach (explode(',', $newTags) as $tag) {
- $this->assertContains($tag, $tagsInDB);
- }
- }
-}
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
-abstract class WallabagTestCase extends WebTestCase
+abstract class WallabagCoreTestCase extends WebTestCase
{
private $client = null;
class Utils
{
/**
- * Generate a token used for RSS
+ * Generate a token used for RSS.
*
* @return string
*/
$token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
}
- return str_replace('+', '', $token);
+ // remove character which can broken the url
+ return str_replace(array('+', '/'), '', $token);
}
}
}
/**
- * Returns the domain name for a URL
+ * Returns the domain name for a URL.
*
* @param $url
+ *
* @return string
*/
public static function getDomainName($url)
}
/**
- * For a given text, we calculate reading time for an article
+ * For a given text, we calculate reading time for an article.
*
* @param $text
+ *
* @return float
*/
public static function getReadingTime($text)
namespace Wallabag\CoreBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
-use Wallabag\CoreBundle\DependencyInjection\Security\Factory\WsseFactory;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
class WallabagCoreBundle extends Bundle
{
- public function build(ContainerBuilder $container)
- {
- parent::build($container);
-
- $extension = $container->getExtension('security');
- $extension->addSecurityListenerFactory(new WsseFactory());
- }
}