aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--composer.lock67
-rw-r--r--src/Wallabag/CoreBundle/Helper/FileCookieJar.php91
-rw-r--r--src/Wallabag/CoreBundle/Resources/config/services.yml6
3 files changed, 129 insertions, 35 deletions
diff --git a/composer.lock b/composer.lock
index 2bce514a..e72ea474 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1470,16 +1470,16 @@
1470 }, 1470 },
1471 { 1471 {
1472 "name": "egulias/email-validator", 1472 "name": "egulias/email-validator",
1473 "version": "2.1.9", 1473 "version": "2.1.10",
1474 "source": { 1474 "source": {
1475 "type": "git", 1475 "type": "git",
1476 "url": "https://github.com/egulias/EmailValidator.git", 1476 "url": "https://github.com/egulias/EmailValidator.git",
1477 "reference": "128cc721d771ec2c46ce59698f4ca42b73f71b25" 1477 "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec"
1478 }, 1478 },
1479 "dist": { 1479 "dist": {
1480 "type": "zip", 1480 "type": "zip",
1481 "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/128cc721d771ec2c46ce59698f4ca42b73f71b25", 1481 "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec",
1482 "reference": "128cc721d771ec2c46ce59698f4ca42b73f71b25", 1482 "reference": "a6c8d7101b19a451c1707b1b79bbbc56e4bdb7ec",
1483 "shasum": "" 1483 "shasum": ""
1484 }, 1484 },
1485 "require": { 1485 "require": {
@@ -1489,7 +1489,8 @@
1489 "require-dev": { 1489 "require-dev": {
1490 "dominicsayers/isemail": "dev-master", 1490 "dominicsayers/isemail": "dev-master",
1491 "phpunit/phpunit": "^4.8.35||^5.7||^6.0", 1491 "phpunit/phpunit": "^4.8.35||^5.7||^6.0",
1492 "satooshi/php-coveralls": "^1.0.1" 1492 "satooshi/php-coveralls": "^1.0.1",
1493 "symfony/phpunit-bridge": "^4.4@dev"
1493 }, 1494 },
1494 "suggest": { 1495 "suggest": {
1495 "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" 1496 "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
@@ -1523,7 +1524,7 @@
1523 "validation", 1524 "validation",
1524 "validator" 1525 "validator"
1525 ], 1526 ],
1526 "time": "2019-06-23T10:14:27+00:00" 1527 "time": "2019-07-19T20:52:08+00:00"
1527 }, 1528 },
1528 { 1529 {
1529 "name": "electrolinux/php-html5lib", 1530 "name": "electrolinux/php-html5lib",
@@ -3673,16 +3674,16 @@
3673 }, 3674 },
3674 { 3675 {
3675 "name": "j0k3r/graby-site-config", 3676 "name": "j0k3r/graby-site-config",
3676 "version": "1.0.86", 3677 "version": "1.0.88",
3677 "source": { 3678 "source": {
3678 "type": "git", 3679 "type": "git",
3679 "url": "https://github.com/j0k3r/graby-site-config.git", 3680 "url": "https://github.com/j0k3r/graby-site-config.git",
3680 "reference": "9c0ae4ee74e737c6ccf913da9bcb169850d38a30" 3681 "reference": "b485a36c31736b8834ebf62f42bd97fb333eefa7"
3681 }, 3682 },
3682 "dist": { 3683 "dist": {
3683 "type": "zip", 3684 "type": "zip",
3684 "url": "https://api.github.com/repos/j0k3r/graby-site-config/zipball/9c0ae4ee74e737c6ccf913da9bcb169850d38a30", 3685 "url": "https://api.github.com/repos/j0k3r/graby-site-config/zipball/b485a36c31736b8834ebf62f42bd97fb333eefa7",
3685 "reference": "9c0ae4ee74e737c6ccf913da9bcb169850d38a30", 3686 "reference": "b485a36c31736b8834ebf62f42bd97fb333eefa7",
3686 "shasum": "" 3687 "shasum": ""
3687 }, 3688 },
3688 "require": { 3689 "require": {
@@ -3709,7 +3710,7 @@
3709 } 3710 }
3710 ], 3711 ],
3711 "description": "Graby site config files", 3712 "description": "Graby site config files",
3712 "time": "2019-06-25T10:46:50+00:00" 3713 "time": "2019-07-23T15:40:40+00:00"
3713 }, 3714 },
3714 { 3715 {
3715 "name": "j0k3r/httplug-ssrf-plugin", 3716 "name": "j0k3r/httplug-ssrf-plugin",
@@ -5162,16 +5163,16 @@
5162 }, 5163 },
5163 { 5164 {
5164 "name": "pagerfanta/pagerfanta", 5165 "name": "pagerfanta/pagerfanta",
5165 "version": "v2.1.2", 5166 "version": "v2.1.3",
5166 "source": { 5167 "source": {
5167 "type": "git", 5168 "type": "git",
5168 "url": "https://github.com/whiteoctober/Pagerfanta.git", 5169 "url": "https://github.com/whiteoctober/Pagerfanta.git",
5169 "reference": "45a85ad426316ae37f2d007022e5b4c95bc3aef4" 5170 "reference": "a53ff01d521648d9dbca19b93ac6bc75a59b0972"
5170 }, 5171 },
5171 "dist": { 5172 "dist": {
5172 "type": "zip", 5173 "type": "zip",
5173 "url": "https://api.github.com/repos/whiteoctober/Pagerfanta/zipball/45a85ad426316ae37f2d007022e5b4c95bc3aef4", 5174 "url": "https://api.github.com/repos/whiteoctober/Pagerfanta/zipball/a53ff01d521648d9dbca19b93ac6bc75a59b0972",
5174 "reference": "45a85ad426316ae37f2d007022e5b4c95bc3aef4", 5175 "reference": "a53ff01d521648d9dbca19b93ac6bc75a59b0972",
5175 "shasum": "" 5176 "shasum": ""
5176 }, 5177 },
5177 "require": { 5178 "require": {
@@ -5227,7 +5228,7 @@
5227 "paginator", 5228 "paginator",
5228 "paging" 5229 "paging"
5229 ], 5230 ],
5230 "time": "2019-04-02T08:50:39+00:00" 5231 "time": "2019-07-17T20:56:16+00:00"
5231 }, 5232 },
5232 { 5233 {
5233 "name": "paragonie/random_compat", 5234 "name": "paragonie/random_compat",
@@ -7016,16 +7017,16 @@
7016 }, 7017 },
7017 { 7018 {
7018 "name": "scheb/two-factor-bundle", 7019 "name": "scheb/two-factor-bundle",
7019 "version": "v3.19.1", 7020 "version": "v3.21.0",
7020 "source": { 7021 "source": {
7021 "type": "git", 7022 "type": "git",
7022 "url": "https://github.com/scheb/two-factor-bundle.git", 7023 "url": "https://github.com/scheb/two-factor-bundle.git",
7023 "reference": "634b9b40ea0b6769f274ac994067f08012d96c44" 7024 "reference": "94cc6f2e0fd8a7b683246d95fcad9b15ca828fc6"
7024 }, 7025 },
7025 "dist": { 7026 "dist": {
7026 "type": "zip", 7027 "type": "zip",
7027 "url": "https://api.github.com/repos/scheb/two-factor-bundle/zipball/634b9b40ea0b6769f274ac994067f08012d96c44", 7028 "url": "https://api.github.com/repos/scheb/two-factor-bundle/zipball/94cc6f2e0fd8a7b683246d95fcad9b15ca828fc6",
7028 "reference": "634b9b40ea0b6769f274ac994067f08012d96c44", 7029 "reference": "94cc6f2e0fd8a7b683246d95fcad9b15ca828fc6",
7029 "shasum": "" 7030 "shasum": ""
7030 }, 7031 },
7031 "require": { 7032 "require": {
@@ -7074,7 +7075,7 @@
7074 "two-factor", 7075 "two-factor",
7075 "two-step" 7076 "two-step"
7076 ], 7077 ],
7077 "time": "2019-07-01T19:12:43+00:00" 7078 "time": "2019-07-12T16:11:05+00:00"
7078 }, 7079 },
7079 { 7080 {
7080 "name": "sensio/distribution-bundle", 7081 "name": "sensio/distribution-bundle",
@@ -7203,7 +7204,7 @@
7203 }, 7204 },
7204 { 7205 {
7205 "name": "sensiolabs/security-checker", 7206 "name": "sensiolabs/security-checker",
7206 "version": "v6.0.1", 7207 "version": "v6.0.2",
7207 "source": { 7208 "source": {
7208 "type": "git", 7209 "type": "git",
7209 "url": "https://github.com/sensiolabs/security-checker.git", 7210 "url": "https://github.com/sensiolabs/security-checker.git",
@@ -8076,7 +8077,7 @@
8076 }, 8077 },
8077 { 8078 {
8078 "name": "Gert de Pagter", 8079 "name": "Gert de Pagter",
8079 "email": "BackEndTea@gmail.com" 8080 "email": "backendtea@gmail.com"
8080 } 8081 }
8081 ], 8082 ],
8082 "description": "Symfony polyfill for ctype functions", 8083 "description": "Symfony polyfill for ctype functions",
@@ -9436,16 +9437,16 @@
9436 }, 9437 },
9437 { 9438 {
9438 "name": "zendframework/zend-diactoros", 9439 "name": "zendframework/zend-diactoros",
9439 "version": "2.1.2", 9440 "version": "2.1.3",
9440 "source": { 9441 "source": {
9441 "type": "git", 9442 "type": "git",
9442 "url": "https://github.com/zendframework/zend-diactoros.git", 9443 "url": "https://github.com/zendframework/zend-diactoros.git",
9443 "reference": "37bf68b428850ee26ed7c3be6c26236dd95a95f1" 9444 "reference": "279723778c40164bcf984a2df12ff2c6ec5e61c1"
9444 }, 9445 },
9445 "dist": { 9446 "dist": {
9446 "type": "zip", 9447 "type": "zip",
9447 "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/37bf68b428850ee26ed7c3be6c26236dd95a95f1", 9448 "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/279723778c40164bcf984a2df12ff2c6ec5e61c1",
9448 "reference": "37bf68b428850ee26ed7c3be6c26236dd95a95f1", 9449 "reference": "279723778c40164bcf984a2df12ff2c6ec5e61c1",
9449 "shasum": "" 9450 "shasum": ""
9450 }, 9451 },
9451 "require": { 9452 "require": {
@@ -9498,7 +9499,7 @@
9498 "psr", 9499 "psr",
9499 "psr-7" 9500 "psr-7"
9500 ], 9501 ],
9501 "time": "2019-04-29T21:11:00+00:00" 9502 "time": "2019-07-10T16:13:25+00:00"
9502 }, 9503 },
9503 { 9504 {
9504 "name": "zendframework/zend-eventmanager", 9505 "name": "zendframework/zend-eventmanager",
@@ -9723,16 +9724,16 @@
9723 }, 9724 },
9724 { 9725 {
9725 "name": "doctrine/data-fixtures", 9726 "name": "doctrine/data-fixtures",
9726 "version": "v1.3.1", 9727 "version": "v1.3.2",
9727 "source": { 9728 "source": {
9728 "type": "git", 9729 "type": "git",
9729 "url": "https://github.com/doctrine/data-fixtures.git", 9730 "url": "https://github.com/doctrine/data-fixtures.git",
9730 "reference": "3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a" 9731 "reference": "09b16943b27f3d80d63988d100ff256148c2f78b"
9731 }, 9732 },
9732 "dist": { 9733 "dist": {
9733 "type": "zip", 9734 "type": "zip",
9734 "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a", 9735 "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/09b16943b27f3d80d63988d100ff256148c2f78b",
9735 "reference": "3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a", 9736 "reference": "09b16943b27f3d80d63988d100ff256148c2f78b",
9736 "shasum": "" 9737 "shasum": ""
9737 }, 9738 },
9738 "require": { 9739 "require": {
@@ -9779,7 +9780,7 @@
9779 "keywords": [ 9780 "keywords": [
9780 "database" 9781 "database"
9781 ], 9782 ],
9782 "time": "2018-03-20T09:06:36+00:00" 9783 "time": "2019-07-10T18:30:35+00:00"
9783 }, 9784 },
9784 { 9785 {
9785 "name": "doctrine/doctrine-fixtures-bundle", 9786 "name": "doctrine/doctrine-fixtures-bundle",
diff --git a/src/Wallabag/CoreBundle/Helper/FileCookieJar.php b/src/Wallabag/CoreBundle/Helper/FileCookieJar.php
new file mode 100644
index 00000000..9a63e949
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Helper/FileCookieJar.php
@@ -0,0 +1,91 @@
1<?php
2
3namespace Wallabag\CoreBundle\Helper;
4
5use GuzzleHttp\Cookie\FileCookieJar as BaseFileCookieJar;
6use GuzzleHttp\Cookie\SetCookie;
7use GuzzleHttp\Utils;
8use Psr\Log\LoggerInterface;
9
10/**
11 * Overidden Cookie behavior to:
12 * - fix multiple concurrent writes (see https://github.com/guzzle/guzzle/pull/1884)
13 * - ignore error when the cookie file is malformatted (resulting in clearing it).
14 */
15class FileCookieJar extends BaseFileCookieJar
16{
17 private $logger;
18
19 /**
20 * @param LoggerInterface $logger Only used to log info when something goes wrong
21 * @param string $cookieFile File to store the cookie data
22 */
23 public function __construct(LoggerInterface $logger, $cookieFile)
24 {
25 parent::__construct($cookieFile);
26
27 $this->logger = $logger;
28 }
29
30 /**
31 * Saves the cookies to a file.
32 *
33 * @param string $filename File to save
34 *
35 * @throws \RuntimeException if the file cannot be found or created
36 */
37 public function save($filename)
38 {
39 $json = [];
40 foreach ($this as $cookie) {
41 if ($cookie->getExpires() && !$cookie->getDiscard()) {
42 $json[] = $cookie->toArray();
43 }
44 }
45
46 if (false === file_put_contents($filename, json_encode($json), LOCK_EX)) {
47 // @codeCoverageIgnoreStart
48 throw new \RuntimeException("Unable to save file {$filename}");
49 // @codeCoverageIgnoreEnd
50 }
51 }
52
53 /**
54 * Load cookies from a JSON formatted file.
55 *
56 * Old cookies are kept unless overwritten by newly loaded ones.
57 *
58 * @param string $filename cookie file to load
59 *
60 * @throws \RuntimeException if the file cannot be loaded
61 */
62 public function load($filename)
63 {
64 $json = file_get_contents($filename);
65 if (false === $json) {
66 // @codeCoverageIgnoreStart
67 throw new \RuntimeException("Unable to load file {$filename}");
68 // @codeCoverageIgnoreEnd
69 }
70
71 try {
72 $data = Utils::jsonDecode($json, true);
73 } catch (\InvalidArgumentException $e) {
74 $this->logger->error('JSON inside the cookie is broken', [
75 'json' => $json,
76 'error_msg' => $e->getMessage(),
77 ]);
78
79 // cookie file is invalid, just ignore the exception and it'll reset the whole cookie file
80 $data = '';
81 }
82
83 if (\is_array($data)) {
84 foreach (Utils::jsonDecode($json, true) as $cookie) {
85 $this->setCookie(new SetCookie($cookie));
86 }
87 } elseif (\strlen($data)) {
88 throw new \RuntimeException("Invalid cookie file: {$filename}");
89 }
90 }
91}
diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml
index 31986951..3f3d4de7 100644
--- a/src/Wallabag/CoreBundle/Resources/config/services.yml
+++ b/src/Wallabag/CoreBundle/Resources/config/services.yml
@@ -82,8 +82,10 @@ services:
82 - ["addSubscriber", ["@bd_guzzle_site_authenticator.authenticator_subscriber"]] 82 - ["addSubscriber", ["@bd_guzzle_site_authenticator.authenticator_subscriber"]]
83 83
84 wallabag_core.guzzle.cookie_jar: 84 wallabag_core.guzzle.cookie_jar:
85 class: GuzzleHttp\Cookie\FileCookieJar 85 class: Wallabag\CoreBundle\Helper\FileCookieJar
86 arguments: ["%kernel.cache_dir%/cookiejar.json"] 86 arguments:
87 - "@logger"
88 - "%kernel.cache_dir%/cookiejar.json"
87 89
88 wallabag_core.content_proxy: 90 wallabag_core.content_proxy:
89 class: Wallabag\CoreBundle\Helper\ContentProxy 91 class: Wallabag\CoreBundle\Helper\ContentProxy