diff options
| -rw-r--r-- | app/Controllers/extensionController.php | 8 | ||||
| -rw-r--r-- | app/Models/Feed.php | 1 | ||||
| -rw-r--r-- | config.default.php | 4 | ||||
| -rw-r--r-- | docs/en/developers/03_Backend/05_Extensions.md | 1 | ||||
| -rw-r--r-- | docs/en/users/06_Fever_API.md | 2 | ||||
| -rw-r--r-- | docs/fr/developers/03_Backend/05_Extensions.md | 1 | ||||
| -rw-r--r-- | extensions/Tumblr-GDPR/README.md | 4 | ||||
| -rw-r--r-- | extensions/Tumblr-GDPR/extension.php | 13 | ||||
| -rw-r--r-- | extensions/Tumblr-GDPR/metadata.json | 8 | ||||
| -rw-r--r-- | lib/Minz/Configuration.php | 14 | ||||
| -rw-r--r-- | lib/Minz/ExtensionManager.php | 26 | ||||
| -rw-r--r-- | lib/lib_rss.php | 24 |
12 files changed, 65 insertions, 41 deletions
diff --git a/app/Controllers/extensionController.php b/app/Controllers/extensionController.php index 311fd2e96..806e5a696 100644 --- a/app/Controllers/extensionController.php +++ b/app/Controllers/extensionController.php @@ -140,7 +140,7 @@ class FreshRSS_extension_Controller extends Minz_ActionController { if ($res === true) { $ext_list = $conf->extensions_enabled; - array_push_unique($ext_list, $ext_name); + $ext_list[$ext_name] = true; $conf->extensions_enabled = $ext_list; $conf->save(); @@ -196,7 +196,11 @@ class FreshRSS_extension_Controller extends Minz_ActionController { if ($res === true) { $ext_list = $conf->extensions_enabled; - array_remove($ext_list, $ext_name); + $legacyKey = array_search($ext_name, $ext_list, true); + if ($legacyKey !== false) { //Legacy format FreshRSS < 1.11.1 + unset($ext_list[$legacyKey]); + } + $ext_list[$ext_name] = false; $conf->extensions_enabled = $ext_list; $conf->save(); diff --git a/app/Models/Feed.php b/app/Models/Feed.php index 07a7a5459..cc2196dac 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -286,6 +286,7 @@ class FreshRSS_Feed extends Minz_Model { if (!$loadDetails) { //Only activates auto-discovery when adding a new feed $feed->set_autodiscovery_level(SIMPLEPIE_LOCATOR_NONE); } + Minz_ExtensionManager::callHook('simplepie_before_init', $feed, $this); $mtime = $feed->init(); if ((!$mtime) || $feed->error()) { diff --git a/config.default.php b/config.default.php index e6297a160..5b993f9e5 100644 --- a/config.default.php +++ b/config.default.php @@ -145,7 +145,9 @@ return array( ), # List of enabled FreshRSS extensions. - 'extensions_enabled' => array(), + 'extensions_enabled' => array( + 'Tumblr-GDPR' => true, + ), # Disable self-update, 'disable_update' => false, diff --git a/docs/en/developers/03_Backend/05_Extensions.md b/docs/en/developers/03_Backend/05_Extensions.md index 034328e07..ae304f6e0 100644 --- a/docs/en/developers/03_Backend/05_Extensions.md +++ b/docs/en/developers/03_Backend/05_Extensions.md @@ -366,6 +366,7 @@ The following events are available: - `entry_before_insert` (`function($entry) -> Entry | null`) : will be executed when a feed is refreshed and new entries will be imported into the database. The new entry (instance of FreshRSS_Entry) will be passed as parameter. - `feed_before_insert` (`function($feed) -> Feed | null`) : will be executed when a new feed is imported into the database. The new feed (instance of FreshRSS_Feed) will be passed as parameter. - `post_update` (`function(none) -> none`) : **TODO** add documentation +- `simplepie_before_init` (`function($simplePie, $feed) -> none`) : **TODO** add documentation ### Writing your own configure.phtml diff --git a/docs/en/users/06_Fever_API.md b/docs/en/users/06_Fever_API.md index 6d8a103b9..7d2af8b02 100644 --- a/docs/en/users/06_Fever_API.md +++ b/docs/en/users/06_Fever_API.md @@ -43,7 +43,7 @@ Following features are implemented: - setting starred marker for item(s) - setting read marker for feed - setting read marker for category -- supports FreshRSS extensions, which use th `entry_before_display` hook +- supports FreshRSS extensions, which use the `entry_before_display` hook Following features are not supported: - **Hot Links** aka **hot** as there is nothing in FreshRSS yet that is similar or could be used to simulate it diff --git a/docs/fr/developers/03_Backend/05_Extensions.md b/docs/fr/developers/03_Backend/05_Extensions.md index f844accd1..2ee81b781 100644 --- a/docs/fr/developers/03_Backend/05_Extensions.md +++ b/docs/fr/developers/03_Backend/05_Extensions.md @@ -329,6 +329,7 @@ TODO : - `entry_before_insert` (`function($entry) -> Entry | null`) - `feed_before_insert` (`function($feed) -> Feed | null`) - `post_update` (`function(none) -> none`) +- `simplepie_before_init` (`function($simplePie, $feed) -> none`) ### Écrire le fichier configure.phtml diff --git a/extensions/Tumblr-GDPR/README.md b/extensions/Tumblr-GDPR/README.md new file mode 100644 index 000000000..fc5e4dd50 --- /dev/null +++ b/extensions/Tumblr-GDPR/README.md @@ -0,0 +1,4 @@ +# Tumblr-GDPR + +Needed for accessing [Tumblr](https://www.tumblr.com/) RSS feeds from the European Union: +bypass the [GPDR](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation) check, implying consent. diff --git a/extensions/Tumblr-GDPR/extension.php b/extensions/Tumblr-GDPR/extension.php new file mode 100644 index 000000000..7a7708c9f --- /dev/null +++ b/extensions/Tumblr-GDPR/extension.php @@ -0,0 +1,13 @@ +<?php + +class TumblrGdprExtension extends Minz_Extension { + public function init() { + $this->registerHook('simplepie_before_init', array('TumblrGdprExtension', 'curlHook')); + } + + public static function curlHook($simplePie, $feed) { + if (preg_match('#^https?://[a-zA-Z_0-9-]+.tumblr.com/#i', $feed->url())) { + $simplePie->set_useragent(FRESHRSS_USERAGENT . ' like Googlebot'); + } + } +} diff --git a/extensions/Tumblr-GDPR/metadata.json b/extensions/Tumblr-GDPR/metadata.json new file mode 100644 index 000000000..b5c33787b --- /dev/null +++ b/extensions/Tumblr-GDPR/metadata.json @@ -0,0 +1,8 @@ +{ + "name": "Tumblr-GDPR", + "author": "Alkarex", + "description": "Bypass Tumblr’ GPDR check (implying consent) for the European Union", + "version": 1.0, + "entrypoint": "TumblrGdpr", + "type": "system" +} diff --git a/lib/Minz/Configuration.php b/lib/Minz/Configuration.php index 5470dc85f..3e486d68e 100644 --- a/lib/Minz/Configuration.php +++ b/lib/Minz/Configuration.php @@ -90,15 +90,15 @@ class Minz_Configuration { private $configuration_setter = null; public function removeExtension($ext_name) { - self::$extensions_enabled = array_diff( - self::$extensions_enabled, - array($ext_name) - ); + unset(self::$extensions_enabled[$ext_name]); + $legacyKey = array_search($ext_name, self::$extensions_enabled, true); + if ($legacyKey !== false) { //Legacy format FreshRSS < 1.11.1 + unset(self::$extensions_enabled[$legacyKey]); + } } public function addExtension($ext_name) { - $found = array_search($ext_name, self::$extensions_enabled) !== false; - if (!$found) { - self::$extensions_enabled[] = $ext_name; + if (!isset(self::$extensions_enabled[$ext_name])) { + self::$extensions_enabled[$ext_name] = true; } } diff --git a/lib/Minz/ExtensionManager.php b/lib/Minz/ExtensionManager.php index 10c49a8b6..3914217ac 100644 --- a/lib/Minz/ExtensionManager.php +++ b/lib/Minz/ExtensionManager.php @@ -35,6 +35,10 @@ class Minz_ExtensionManager { 'list' => array(), 'signature' => 'OneToOne', ), + 'simplepie_before_init' => array( // function($simplePie, $feed) -> none + 'list' => array(), + 'signature' => 'PassArguments', + ), ); private static $ext_to_hooks = array(); @@ -160,7 +164,8 @@ class Minz_ExtensionManager { self::$ext_list[$name] = $ext; if ($ext->getType() === 'system' && - in_array($name, self::$ext_auto_enabled)) { + (!empty(self::$ext_auto_enabled[$name]) || + in_array($name, self::$ext_auto_enabled, true))) { //Legacy format < FreshRSS 1.11.1 self::enable($ext->getName()); } @@ -189,8 +194,12 @@ class Minz_ExtensionManager { * @param string[] $ext_list the names of extensions we want to load. */ public static function enableByList($ext_list) { - foreach ($ext_list as $ext_name) { - self::enable($ext_name); + foreach ($ext_list as $ext_name => $ext_status) { + if (is_int($ext_name)) { //Legacy format int=>name + self::enable($ext_status); + } elseif ($ext_status) { //New format name=>Boolean + self::enable($ext_name); + } } } @@ -255,10 +264,15 @@ class Minz_ExtensionManager { } $signature = self::$hook_list[$hook_name]['signature']; - $signature = 'self::call' . $signature; $args = func_get_args(); - - return call_user_func_array($signature, $args); + if ($signature === 'PassArguments') { + array_shift($args); + foreach (self::$hook_list[$hook_name]['list'] as $function) { + call_user_func_array($function, $args); + } + } else { + return call_user_func_array('self::call' . $signature, $args); + } } /** diff --git a/lib/lib_rss.php b/lib/lib_rss.php index 04bbb2515..5f460862e 100644 --- a/lib/lib_rss.php +++ b/lib/lib_rss.php @@ -480,7 +480,6 @@ function recursive_unlink($dir) { return rmdir($dir); } - /** * Remove queries where $get is appearing. * @param $get the get attribute which should be removed. @@ -497,29 +496,6 @@ function remove_query_by_get($get, $queries) { return $final_queries; } - -/** - * Add a value in an array and take care it is unique. - * @param $array the array in which we add the value. - * @param $value the value to add. - */ -function array_push_unique(&$array, $value) { - $found = array_search($value, $array) !== false; - if (!$found) { - $array[] = $value; - } -} - - -/** - * Remove a value from an array. - * @param $array the array from wich value is removed. - * @param $value the value to remove. - */ -function array_remove(&$array, $value) { - $array = array_diff($array, array($value)); -} - //RFC 4648 function base64url_encode($data) { return strtr(rtrim(base64_encode($data), '='), '+/', '-_'); |
