* deal with some phpstan warnings in base plugin class
* arguably better hack for incompatible plugins causing E_COMPILE_ERROR
This commit is contained in:
parent
c3ffa08807
commit
af2f4460ce
|
@ -140,10 +140,19 @@ abstract class Plugin {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param FeedParser $parser
|
||||||
|
* @param int $feed_id
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
function hook_feed_parsed($parser, $feed_id) {
|
function hook_feed_parsed($parser, $feed_id) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string,string> $cli_options
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
function hook_update_task($cli_options) {
|
function hook_update_task($cli_options) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -170,44 +179,94 @@ abstract class Plugin {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, string> $hotkeys
|
||||||
|
* @return array<string, string>
|
||||||
|
*/
|
||||||
function hook_hotkey_map($hotkeys) {
|
function hook_hotkey_map($hotkeys) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, mixed> $article
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
function hook_render_article($article) {
|
function hook_render_article($article) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, mixed> $article
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
function hook_render_article_cdm($article) {
|
function hook_render_article_cdm($article) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $feed_data
|
||||||
|
* @param string $fetch_url
|
||||||
|
* @param int $owner_uid
|
||||||
|
* @param int $feed
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
function hook_feed_fetched($feed_data, $fetch_url, $owner_uid, $feed) {
|
function hook_feed_fetched($feed_data, $fetch_url, $owner_uid, $feed) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function hook_sanitize($doc, $site_url, $allowed_elements, $disallowed_attributes, $article_id) {
|
function hook_sanitize($doc, $site_url, $allowed_elements, $disallowed_attributes, $article_id) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array{'article': array<string,mixed>} $params
|
||||||
|
* @return array<string, string>
|
||||||
|
*/
|
||||||
function hook_render_article_api($params) {
|
function hook_render_article_api($params) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return string */
|
||||||
function hook_toolbar_button() {
|
function hook_toolbar_button() {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return string */
|
||||||
function hook_action_item() {
|
function hook_action_item() {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $feed_id
|
||||||
|
* @param bool $is_cat
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
function hook_headline_toolbar_button($feed_id, $is_cat) {
|
function hook_headline_toolbar_button($feed_id, $is_cat) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string,string> $hotkeys
|
||||||
|
* @return array<string,string>
|
||||||
|
*/
|
||||||
function hook_hotkey_info($hotkeys) {
|
function hook_hotkey_info($hotkeys) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
function hook_article_left_button($row) {
|
function hook_article_left_button($row) {
|
||||||
|
@ -230,6 +289,7 @@ abstract class Plugin {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return void */
|
||||||
function hook_house_keeping() {
|
function hook_house_keeping() {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -262,6 +322,7 @@ abstract class Plugin {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return void */
|
||||||
function hook_main_toolbar_button() {
|
function hook_main_toolbar_button() {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -296,24 +357,57 @@ abstract class Plugin {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** NOTE: $article_filters should be renamed $filter_actions because that's what this is
|
||||||
|
* @param int $feed_id
|
||||||
|
* @param int $owner_uid
|
||||||
|
* @param array<string,mixed> $article
|
||||||
|
* @param array<string,mixed> $matched_filters
|
||||||
|
* @param array<string,string|bool|int> $matched_rules
|
||||||
|
* @param array<string,string> $article_filters
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
function hook_filter_triggered($feed_id, $owner_uid, $article, $matched_filters, $matched_rules, $article_filters) {
|
function hook_filter_triggered($feed_id, $owner_uid, $article, $matched_filters, $matched_rules, $article_filters) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $url
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
function hook_get_full_text($url) {
|
function hook_get_full_text($url) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string,string> $enclosures
|
||||||
|
* @param string $content
|
||||||
|
* @param string $site_url
|
||||||
|
* @param array<string,mixed> $article
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
function hook_article_image($enclosures, $content, $site_url, $article) {
|
function hook_article_image($enclosures, $content, $site_url, $article) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return string */
|
||||||
function hook_feed_tree() {
|
function hook_feed_tree() {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $url
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
function hook_iframe_whitelisted($url) {
|
function hook_iframe_whitelisted($url) {
|
||||||
user_error("Dummy method invoked.", E_USER_ERROR);
|
user_error("Dummy method invoked.", E_USER_ERROR);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function hook_enclosure_imported($enclosure, $feed) {
|
function hook_enclosure_imported($enclosure, $feed) {
|
||||||
|
|
|
@ -434,16 +434,24 @@ class PluginHost {
|
||||||
|
|
||||||
// WIP hack
|
// WIP hack
|
||||||
// we can't catch incompatible method signatures via Throwable
|
// we can't catch incompatible method signatures via Throwable
|
||||||
// maybe also auto-disable user plugin in this situation? idk -fox
|
// this also enables global tt-rss safe mode in case there are more plugins like this
|
||||||
if ($_SESSION["plugin_blacklist.$class"] ?? false) {
|
if (($_SESSION["plugin_blacklist"][$class] ?? 0)) {
|
||||||
user_error("Plugin $class has caused a PHP Fatal Error so it won't be loaded again in this session.", E_USER_NOTICE);
|
|
||||||
|
// only report once per-plugin per-session
|
||||||
|
if ($_SESSION["plugin_blacklist"][$class] < 2) {
|
||||||
|
user_error("Plugin $class has caused a PHP fatal error so it won't be loaded again in this session.", E_USER_WARNING);
|
||||||
|
$_SESSION["plugin_blacklist"][$class] = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_SESSION["safe_mode"] = 1;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$_SESSION["plugin_blacklist.$class"] = true;
|
$_SESSION["plugin_blacklist"][$class] = 1;
|
||||||
require_once $file;
|
require_once $file;
|
||||||
$_SESSION["plugin_blacklist.$class"] = false;
|
unset($_SESSION["plugin_blacklist"][$class]);
|
||||||
|
|
||||||
} catch (Error $err) {
|
} catch (Error $err) {
|
||||||
user_error($err, E_USER_WARNING);
|
user_error($err, E_USER_WARNING);
|
||||||
|
|
|
@ -17,7 +17,7 @@ class Pref_Prefs extends Handler_Protected {
|
||||||
const PI_ERR_PLUGIN_NOT_FOUND = "PI_ERR_PLUGIN_NOT_FOUND";
|
const PI_ERR_PLUGIN_NOT_FOUND = "PI_ERR_PLUGIN_NOT_FOUND";
|
||||||
const PI_ERR_NO_WORKDIR = "PI_ERR_NO_WORKDIR";
|
const PI_ERR_NO_WORKDIR = "PI_ERR_NO_WORKDIR";
|
||||||
|
|
||||||
function csrf_ignore(string $method): bool {
|
function csrf_ignore($method) : bool {
|
||||||
$csrf_ignored = array("index", "updateself", "otpqrcode");
|
$csrf_ignored = array("index", "updateself", "otpqrcode");
|
||||||
|
|
||||||
return array_search($method, $csrf_ignored) !== false;
|
return array_search($method, $csrf_ignored) !== false;
|
||||||
|
|
Loading…
Reference in New Issue