aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Controllers/extensionController.php8
-rw-r--r--app/Models/Feed.php1
-rw-r--r--config.default.php4
-rw-r--r--docs/en/developers/03_Backend/05_Extensions.md1
-rw-r--r--docs/en/users/06_Fever_API.md2
-rw-r--r--docs/fr/developers/03_Backend/05_Extensions.md1
-rw-r--r--extensions/Tumblr-GDPR/README.md4
-rw-r--r--extensions/Tumblr-GDPR/extension.php13
-rw-r--r--extensions/Tumblr-GDPR/metadata.json8
-rw-r--r--lib/Minz/Configuration.php14
-rw-r--r--lib/Minz/ExtensionManager.php26
-rw-r--r--lib/lib_rss.php24
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), '='), '+/', '-_');