From 0e2bf8417f75befc7e658efdb53747bdb89a776e Mon Sep 17 00:00:00 2001 From: Denis Filimonov Date: Wed, 30 Nov 2016 07:49:45 +0400 Subject: [PATCH] Add integration with Wallabag2 (#574) --- app/controllers/config.php | 2 +- app/handlers/service.php | 118 ++++++++++++++++++++++- app/locales/ar_AR/translations.php | 3 + app/locales/cs_CZ/translations.php | 3 + app/locales/de_DE/translations.php | 3 + app/locales/es_ES/translations.php | 3 + app/locales/fr_FR/translations.php | 3 + app/locales/it_IT/translations.php | 3 + app/locales/ja_JP/translations.php | 3 + app/locales/pt_BR/translations.php | 3 + app/locales/ru_RU/translations.php | 3 + app/locales/sr_RS/translations.php | 3 + app/locales/sr_RS@latin/translations.php | 3 + app/locales/tr_TR/translations.php | 3 + app/locales/zh_CN/translations.php | 3 + app/templates/services.php | 24 ++++- vendor/composer/ClassLoader.php | 12 ++- 17 files changed, 184 insertions(+), 11 deletions(-) diff --git a/app/controllers/config.php b/app/controllers/config.php index 676e055..edce1c8 100644 --- a/app/controllers/config.php +++ b/app/controllers/config.php @@ -232,7 +232,7 @@ Router\get_action('services', function () { // Update bookmark services Router\post_action('services', function () { - $values = Request\values() + array('pinboard_enabled' => 0, 'instapaper_enabled' => 0); + $values = Request\values() + array('pinboard_enabled' => 0, 'instapaper_enabled' => 0, 'wallabag_enabled' => 0); Helper\check_csrf_values($values); if (Model\Config\save($values)) { diff --git a/app/handlers/service.php b/app/handlers/service.php index ec2e8e8..62de47b 100644 --- a/app/handlers/service.php +++ b/app/handlers/service.php @@ -18,6 +18,10 @@ function sync($item_id) if ((bool) Config\get('instapaper_enabled')) { instapaper_sync($item); } + + if ((bool) Config\get('wallabag_enabled')) { + wallabag_sync($item); + } } function instapaper_sync(array $item) @@ -31,7 +35,7 @@ function instapaper_sync(array $item) $url = 'https://www.instapaper.com/api/add?'.http_build_query($params); - $client = api_call($url); + $client = api_get_call($url); if ($client !== false) { return $client->getStatusCode() === 201; @@ -52,7 +56,7 @@ function pinboard_sync(array $item) $url = 'https://api.pinboard.in/v1/posts/add?'.http_build_query($params); - $client = api_call($url); + $client = api_get_call($url); if ($client !== false) { $response = json_decode($client->getContent(), true); @@ -62,14 +66,122 @@ function pinboard_sync(array $item) return false; } -function api_call($url) +function wallabag_sync(array $item) +{ + return wallabag_has_url($item['url']) + ? false + : wallabag_add_item($item['url'], $item['title']); +} + +function wallabag_has_url($url) +{ + $token = wallabag_get_access_token(); + if ($token === false) { + return false; + } + $apiUrl = rtrim(Config\get('wallabag_url'), '\/') . '/api/entries/exists.json?url=' . urlencode($url); + $headers = array('Authorization: Bearer ' . $token); + $response = api_get_call($apiUrl, $headers); + if ($response !== false) { + $response = json_decode($response->getContent(), true); + } + return !empty($response['exists']); +} + +function wallabag_add_item($url, $title) +{ + $token = wallabag_get_access_token(); + if ($token === false) { + return false; + } + $apiUrl = rtrim(Config\get('wallabag_url'), '\/') . '/api/entries.json'; + $headers = array('Authorization: Bearer ' . $token); + $data = array( + 'url' => $url, + 'title' => $title, + ); + $response = api_post_call($apiUrl, $data, $headers); + if ($response !== false) { + $response = json_decode($response, true); + } + return !empty($response['id']); +} + +function wallabag_get_access_token() +{ + if (!empty($_SESSION['wallabag_access_token'])) { + return $_SESSION['wallabag_access_token']; + } + $url = rtrim(Config\get('wallabag_url'), '\/') . '/oauth/v2/token'; + $data = array( + 'grant_type' => 'password', + 'client_id' => Config\get('wallabag_client_id'), + 'client_secret' => Config\get('wallabag_client_secret'), + 'username' => Config\get('wallabag_username'), + 'password' => Config\get('wallabag_password') + ); + $response = api_post_call($url, $data); + if ($response !== false) { + $response = json_decode($response, true); + if (!empty($response['access_token'])) { + $_SESSION['wallabag_access_token'] = $response['access_token']; + return $_SESSION['wallabag_access_token']; + } + } + return false; +} + +function api_get_call($url, array $headers = array()) { try { $client = Client::getInstance(); $client->setUserAgent(Config\HTTP_USER_AGENT); + if ($headers) { + $client->setHeaders($headers); + } $client->execute($url); return $client; } catch (ClientException $e) { return false; } } + +function api_post_call($url, array $data, array $headers = array()) +{ + return function_exists('curl_init') + ? post_curl($url, $data, $headers) + : post_stream($url, $data, $headers); +} + +function post_curl($url, array $data, array $headers = array()) +{ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + if ($headers) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); + $result = curl_exec($ch); + curl_close($ch); + return $result; +} + +function post_stream($url, array $data, array $headers = array()) +{ + $contentType = array('Content-Type: application/x-www-form-urlencoded'); + $headers = $headers + ? array_merge($headers, $contentType) + : $contentType; + $options = array( + 'http' => array( + 'method' => 'POST', + 'header' => implode("\r\n", $headers), + 'content' => http_build_query($data) + ) + ); + $context = stream_context_create($options); + $result = file_get_contents($url, false, $context); + return $result; +} diff --git a/app/locales/ar_AR/translations.php b/app/locales/ar_AR/translations.php index db235a7..3abbf85 100644 --- a/app/locales/ar_AR/translations.php +++ b/app/locales/ar_AR/translations.php @@ -247,4 +247,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/cs_CZ/translations.php b/app/locales/cs_CZ/translations.php index 7001e82..1e28af8 100644 --- a/app/locales/cs_CZ/translations.php +++ b/app/locales/cs_CZ/translations.php @@ -247,4 +247,7 @@ return array( 'Last login:' => 'Poslední přihlášení:', 'Search' => 'Hledat', 'There are no results for your search' => 'Žádné výsledky pro toto hledání', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/de_DE/translations.php b/app/locales/de_DE/translations.php index 50f7556..10b59d9 100644 --- a/app/locales/de_DE/translations.php +++ b/app/locales/de_DE/translations.php @@ -247,4 +247,7 @@ return array( 'Last login:' => 'Letzte Anmeldung:', 'Search' => 'Suchen', 'There are no results for your search' => 'Deine Suche lieferte keine Ergebnisse', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/es_ES/translations.php b/app/locales/es_ES/translations.php index e709873..5f8fb56 100644 --- a/app/locales/es_ES/translations.php +++ b/app/locales/es_ES/translations.php @@ -247,4 +247,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/fr_FR/translations.php b/app/locales/fr_FR/translations.php index 03e7e26..08f4a15 100644 --- a/app/locales/fr_FR/translations.php +++ b/app/locales/fr_FR/translations.php @@ -247,4 +247,7 @@ return array( 'Last login:' => 'Dernière connexion :', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/it_IT/translations.php b/app/locales/it_IT/translations.php index 6cd72a7..5fc5341 100644 --- a/app/locales/it_IT/translations.php +++ b/app/locales/it_IT/translations.php @@ -247,4 +247,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/ja_JP/translations.php b/app/locales/ja_JP/translations.php index a90b283..44f9a58 100644 --- a/app/locales/ja_JP/translations.php +++ b/app/locales/ja_JP/translations.php @@ -249,4 +249,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/pt_BR/translations.php b/app/locales/pt_BR/translations.php index 80cd3e0..7da3e3f 100644 --- a/app/locales/pt_BR/translations.php +++ b/app/locales/pt_BR/translations.php @@ -247,4 +247,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/ru_RU/translations.php b/app/locales/ru_RU/translations.php index 536c777..30bb13d 100644 --- a/app/locales/ru_RU/translations.php +++ b/app/locales/ru_RU/translations.php @@ -247,4 +247,7 @@ return array( 'Last login:' => 'Последний вход:', 'Search' => 'Поиск', 'There are no results for your search' => 'По вашему запросу ничего не нашлось', + 'Send bookmarks to Wallabag' => 'Отправлять закладки в Wallabag', + 'Wallabag username' => 'Имя пользователя Wallabag', + 'Wallabag password' => 'Пароль Wallabag', ); diff --git a/app/locales/sr_RS/translations.php b/app/locales/sr_RS/translations.php index 0d74004..c1791bd 100644 --- a/app/locales/sr_RS/translations.php +++ b/app/locales/sr_RS/translations.php @@ -247,4 +247,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/sr_RS@latin/translations.php b/app/locales/sr_RS@latin/translations.php index 45ba9c2..5e1651b 100644 --- a/app/locales/sr_RS@latin/translations.php +++ b/app/locales/sr_RS@latin/translations.php @@ -247,4 +247,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/tr_TR/translations.php b/app/locales/tr_TR/translations.php index fe7b497..40d39f1 100644 --- a/app/locales/tr_TR/translations.php +++ b/app/locales/tr_TR/translations.php @@ -247,4 +247,7 @@ return array( 'Last login:' => 'En son sisteme giriş zamanı:', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/locales/zh_CN/translations.php b/app/locales/zh_CN/translations.php index cd707d0..8965f28 100644 --- a/app/locales/zh_CN/translations.php +++ b/app/locales/zh_CN/translations.php @@ -247,4 +247,7 @@ return array( // 'Last login:' => '', // 'Search' => '', // 'There are no results for your search' => '', + // 'Send bookmarks to Wallabag' => '', + // 'Wallabag username' => '', + // 'Wallabag password' => '', ); diff --git a/app/templates/services.php b/app/templates/services.php index a6f298f..ca241af 100644 --- a/app/templates/services.php +++ b/app/templates/services.php @@ -16,7 +16,7 @@
- +


@@ -39,7 +39,27 @@
- + +

+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index ff6ecfb..ac67d30 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -53,8 +53,8 @@ class ClassLoader private $useIncludePath = false; private $classMap = array(); - private $classMapAuthoritative = false; + private $missingClasses = array(); public function getPrefixes() { @@ -322,20 +322,20 @@ class ClassLoader if (isset($this->classMap[$class])) { return $this->classMap[$class]; } - if ($this->classMapAuthoritative) { + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM - if ($file === null && defined('HHVM_VERSION')) { + if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } - if ($file === null) { + if (false === $file) { // Remember that this class does not exist. - return $this->classMap[$class] = false; + $this->missingClasses[$class] = true; } return $file; @@ -399,6 +399,8 @@ class ClassLoader if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } + + return false; } }