diff --git a/api/index.php b/api/index.php index eb79422f9f91c65f6043645fdc8fd623c06155f7..1b713d5619f0b5010e194b17b1024de9a4f08775 100644 --- a/api/index.php +++ b/api/index.php @@ -18,8 +18,8 @@ require_once "functions.php"; require_once "sessions.php"; - ini_set('session.use_cookies', 0); - ini_set("session.gc_maxlifetime", 86400); + ini_set('session.use_cookies', "0"); + ini_set("session.gc_maxlifetime", "86400"); ob_start(); diff --git a/classes/api.php b/classes/api.php index 03eea1927ff58b881af83a6bffdeb5f2db07830e..5677cb9081aff6ac2895c65fb220dd6380d83c75 100755 --- a/classes/api.php +++ b/classes/api.php @@ -292,7 +292,7 @@ class API extends Handler { $sanitize_content = !isset($_REQUEST["sanitize"]) || self::_param_to_bool($_REQUEST["sanitize"]); - if ($article_ids) { + if (count($article_ids) > 0) { $article_qmarks = arr_qmarks($article_ids); diff --git a/classes/digest.php b/classes/digest.php index 77eb92c549cd08a733e9bafd5d2d1ac64c2ed34f..e0c23d705d02f1da0dcd6c631a451d27f3f4e0b6 100644 --- a/classes/digest.php +++ b/classes/digest.php @@ -1,12 +1,6 @@ <?php class Digest { - - /** - * Send by mail a digest of last articles. - * - * @return boolean Return false if digests are not enabled. - */ static function send_headlines_digests() { $user_limit = 15; // amount of users to process (e.g. emails to send out) @@ -81,9 +75,7 @@ class Digest } } } - Debug::log("All done."); - } static function prepare_headlines_digest($user_id, $days = 1, $limit = 1000) { @@ -210,5 +202,4 @@ class Digest return array($tmp, $headlines_count, $affected_ids, $tmp_t); } - } diff --git a/classes/feeds.php b/classes/feeds.php index 63b84edae5a43ff1aa65244f4bb45a9a3416e569..b59504c03b6bf4f5db83522b8c974ea7c1396bf5 100755 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -1067,22 +1067,16 @@ class Feeds extends Handler_Protected { switch ($id) { case 0: return "archive"; - break; case -1: return "star"; - break; case -2: return "rss_feed"; - break; case -3: return "whatshot"; - break; case -4: return "inbox"; - break; case -6: return "restore"; - break; default: if ($id < LABEL_BASE_INDEX) { return "label"; diff --git a/classes/handler/public.php b/classes/handler/public.php index b0ce2306d790500a9bb898a03e0930b0aed46483..3910cf7c1c376ea8af46bd1d485a4bfe4b3c4188 100755 --- a/classes/handler/public.php +++ b/classes/handler/public.php @@ -146,9 +146,9 @@ class Handler_Public extends Handler { $tpl->addBlock('enclosure'); } } else { - $tpl->setVariable('ARTICLE_ENCLOSURE_URL', null, true); - $tpl->setVariable('ARTICLE_ENCLOSURE_TYPE', null, true); - $tpl->setVariable('ARTICLE_ENCLOSURE_LENGTH', null, true); + $tpl->setVariable('ARTICLE_ENCLOSURE_URL', "", true); + $tpl->setVariable('ARTICLE_ENCLOSURE_TYPE', "", true); + $tpl->setVariable('ARTICLE_ENCLOSURE_LENGTH', "", true); } list ($og_image, $og_stream) = Article::_get_image($enclosures, $line['content'], $feed_site_url); @@ -207,8 +207,8 @@ class Handler_Public extends Handler { $article['content'] = Sanitizer::sanitize($line["content"], false, $owner_uid, $feed_site_url, false, $line["id"]); $article['updated'] = date('c', strtotime($line["updated"])); - if ($line['note']) $article['note'] = $line['note']; - if ($article['author']) $article['author'] = $line['author']; + if (!empty($line['note'])) $article['note'] = $line['note']; + if (!empty($line['author'])) $article['author'] = $line['author']; if (count($line["tags"]) > 0) { $article['tags'] = array(); diff --git a/classes/pluginhost.php b/classes/pluginhost.php index a05938111910ef9a7a04192b9ed008876b07d83c..5121c8491daa3e833a5566079af8461b8cf8e1fe 100755 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -108,8 +108,9 @@ class PluginHost { return false; } + // needed for compatibility with API 2 (?) function get_dbh() { - return Db::get(); + return false; } function get_pdo(): PDO { diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php index a26281fee19a6a1540903f95706abaea79160138..adb249dac3c0d37cf6609919771ab44f409937cd 100644 --- a/classes/pref/prefs.php +++ b/classes/pref/prefs.php @@ -311,13 +311,6 @@ class Pref_Prefs extends Handler_Protected { <input dojoType='dijit.form.ValidationTextBox' name='email' required='1' value="<?= $email ?>"> </fieldset> - <?php if (!SINGLE_USER_MODE && !empty($_SESSION["hide_hello"])) { ?> - <fieldset> - <label><?= __('Access level:') ?></label> - <?= $access_level_names[$row["access_level"]] ?> - </fieldset> - <?php } ?> - <hr/> <button dojoType='dijit.form.Button' type='submit' class='alt-primary'> diff --git a/include/functions.php b/include/functions.php index 174ef39f0fde916b39f087f808170d54df133d90..bf9b374a2a0589b14555b6a6fb2fedd1d13ad4d1 100644 --- a/include/functions.php +++ b/include/functions.php @@ -34,8 +34,8 @@ error_reporting(E_ALL & ~E_NOTICE); } - ini_set('display_errors', 0); - ini_set('display_startup_errors', 0); + ini_set('display_errors', "false"); + ini_set('display_startup_errors', "false"); require_once 'config.php'; @@ -281,7 +281,7 @@ } else if (is_string($param)) { return trim(strip_tags($param)); } else { - return trim($param); + return $param; } } @@ -430,7 +430,7 @@ } function uniqid_short() { - return uniqid(base_convert(rand(), 10, 36)); + return uniqid(base_convert((string)rand(), 10, 36)); } function T_sprintf() { diff --git a/include/sanity_check.php b/include/sanity_check.php index 9407b606f42c02e812172584dd8acc29ea91b65a..2786f012f6c1a81b9b5e5bbdad1859f63bce68ea 100755 --- a/include/sanity_check.php +++ b/include/sanity_check.php @@ -40,8 +40,6 @@ array_push($errors, "Configuration file not found. Looks like you forgot to copy config.php-dist to config.php and edit it."); } else { - require_once "sanity_config.php"; - if (!file_exists("config.php")) { array_push($errors, "Please copy config.php-dist to config.php"); } @@ -78,12 +76,14 @@ array_push($errors, "Data export cache is not writable (chmod -R 777 ".CACHE_DIR."/export)"); } + require_once "sanity_config.php"; + if (GENERATED_CONFIG_CHECK != EXPECTED_CONFIG_VERSION) { array_push($errors, "Configuration option checker sanity_config.php is outdated, please recreate it using ./utils/regen_config_checks.sh"); } - foreach ($required_defines as $d) { + foreach (get_required_defines() as $d) { if (!defined($d)) { array_push($errors, "Required configuration file parameter $d is not defined in config.php. You might need to copy it from config.php-dist."); diff --git a/include/sanity_config.php b/include/sanity_config.php index 5059ee83bf66b1864d752245396431b041b5dea6..b304adf54e1ea032131802978373e81eeefdc8c7 100644 --- a/include/sanity_config.php +++ b/include/sanity_config.php @@ -1,3 +1,3 @@ -<?php # This file has been generated at: Fri Feb 12 21:33:46 MSK 2021 +<?php # This file has been generated at: Mon Feb 22 14:17:27 MSK 2021 define('GENERATED_CONFIG_CHECK', 26); -$required_defines = array( 'DB_TYPE', 'DB_HOST', 'DB_USER', 'DB_NAME', 'DB_PASS', 'MYSQL_CHARSET', 'SELF_URL_PATH', 'SINGLE_USER_MODE', 'SIMPLE_UPDATE_MODE', 'PHP_EXECUTABLE', 'LOCK_DIRECTORY', 'CACHE_DIR', 'ICONS_DIR', 'ICONS_URL', 'AUTH_AUTO_CREATE', 'AUTH_AUTO_LOGIN', 'FORCE_ARTICLE_PURGE', 'SESSION_COOKIE_LIFETIME', 'SMTP_FROM_NAME', 'SMTP_FROM_ADDRESS', 'DIGEST_SUBJECT', 'CHECK_FOR_UPDATES', 'PLUGINS', 'LOG_DESTINATION', 'CONFIG_VERSION'); ?> +function get_required_defines() { return [ 'DB_TYPE', 'DB_HOST', 'DB_USER', 'DB_NAME', 'DB_PASS', 'MYSQL_CHARSET', 'SELF_URL_PATH', 'SINGLE_USER_MODE', 'SIMPLE_UPDATE_MODE', 'PHP_EXECUTABLE', 'LOCK_DIRECTORY', 'CACHE_DIR', 'ICONS_DIR', 'ICONS_URL', 'AUTH_AUTO_CREATE', 'AUTH_AUTO_LOGIN', 'FORCE_ARTICLE_PURGE', 'SESSION_COOKIE_LIFETIME', 'SMTP_FROM_NAME', 'SMTP_FROM_ADDRESS', 'DIGEST_SUBJECT', 'CHECK_FOR_UPDATES', 'PLUGINS', 'LOG_DESTINATION', 'CONFIG_VERSION']; } diff --git a/include/sessions.php b/include/sessions.php index 16de53ab2d590a74b9ce61c94fa3e06ccee91fbc..5b372612bed5fbc234a97d8d7eb0eaff5b98afdf 100644 --- a/include/sessions.php +++ b/include/sessions.php @@ -12,14 +12,14 @@ $session_name = (!defined('TTRSS_SESSION_NAME')) ? "ttrss_sid" : TTRSS_SESSION_NAME; if (is_server_https()) { - ini_set("session.cookie_secure", true); + ini_set("session.cookie_secure", "true"); } - ini_set("session.gc_probability", 75); + ini_set("session.gc_probability", "75"); ini_set("session.name", $session_name); - ini_set("session.use_only_cookies", true); + ini_set("session.use_only_cookies", "true"); ini_set("session.gc_maxlifetime", $session_expire); - ini_set("session.cookie_lifetime", 0); + ini_set("session.cookie_lifetime", "0"); function session_get_schema_version() { global $schema_version; diff --git a/phpstan.neon b/phpstan.neon index 0703e0d155c3b277cdb4822ca4c81678683849a5..b2cd978d81295d2e07a7fd72158d8cf783167514 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -2,7 +2,9 @@ parameters: level: 5 ignoreErrors: - '#Constant.*not found#' - - '#Call to an undefined method DOMNode::getAttribute\(\).#' + - '#Comparison operation ">" between int<1, max> and 0 is always true.#' + - '#Access to an undefined property DOMNode::\$tagName.#' + - '#Call to an undefined method DOMNode::(get|remove|set)Attribute\(\).#' - '#PHPDoc tag @param has invalid value#' - message: '##' paths: diff --git a/plugins/af_fsckportal/init.php b/plugins/af_fsckportal/init.php index 04b77a15a048180cc1b5e5f141afa1f13e9d3686..8caa617c6ac5e1fdd3d132d8381ac63844026c6c 100644 --- a/plugins/af_fsckportal/init.php +++ b/plugins/af_fsckportal/init.php @@ -19,9 +19,7 @@ class Af_Fsckportal extends Plugin { $doc = new DOMDocument(); - @$doc->loadHTML('<?xml encoding="UTF-8">' . $article["content"]); - - if ($doc) { + if (@$doc->loadHTML('<?xml encoding="UTF-8">' . $article["content"])) { $xpath = new DOMXPath($doc); $entries = $xpath->query('(//img[@src]|//a[@href])'); @@ -34,7 +32,6 @@ class Af_Fsckportal extends Plugin { } $article["content"] = $doc->saveHTML(); - } return $article; diff --git a/plugins/af_redditimgur/init.php b/plugins/af_redditimgur/init.php index 2677fdd9049110b180f25c73e1ab148f030d005c..713eaea5ca38cc41b40024a8e4871b2270138577 100755 --- a/plugins/af_redditimgur/init.php +++ b/plugins/af_redditimgur/init.php @@ -207,7 +207,7 @@ class Af_RedditImgur extends Plugin { $found = false; // embed before reddit <table> post layout - $anchor = $xpath->query('//body/*')->item(0); + $anchor = $xpath->query('//_body/*')->item(0); // deal with json-provided media content first if ($article["link"] && $anchor) { @@ -217,6 +217,7 @@ class Af_RedditImgur extends Plugin { $this->fallback_preview_urls = []; + // @phpstan-ignore-next-line if ($tmp && $anchor) { $json = json_decode($tmp, true); @@ -346,6 +347,8 @@ class Af_RedditImgur extends Plugin { if (strpos($source_stream, "imgur.com") !== false) $poster_url = str_replace(".mp4", "h.jpg", $source_stream); + else + $poster_url = false; $this->handle_as_video($doc, $entry, $source_stream, $poster_url); diff --git a/update.php b/update.php index 1f79dccf0138e0233ceefbb9f74a85c6d112d89d..71b8cf76c0ef8ab6067dc536d7448e3308a6a87e 100755 --- a/update.php +++ b/update.php @@ -32,7 +32,7 @@ if (DB_TYPE == "pgsql") { $interval_query = "date_updated < NOW() - INTERVAL '$days days'"; - } else if (DB_TYPE == "mysql") { + } else /*if (DB_TYPE == "mysql") */ { $interval_query = "date_updated < DATE_SUB(NOW(), INTERVAL $days DAY)"; } @@ -459,7 +459,7 @@ if (isset($options["list-plugins"])) { $tmppluginhost = new PluginHost(); - $tmppluginhost->load_all($tmppluginhost::KIND_ALL, false); + $tmppluginhost->load_all($tmppluginhost::KIND_ALL); $enabled = array_map("trim", explode(",", PLUGINS)); echo "List of all available plugins:\n"; diff --git a/utils/regen_config_checks.sh b/utils/regen_config_checks.sh index e8b1ed830d7d12eadae6a79e3c33bb5c05483415..b20ce0480fdccf851853a834a2ca7846ecb3ff63 100755 --- a/utils/regen_config_checks.sh +++ b/utils/regen_config_checks.sh @@ -8,10 +8,10 @@ echo -n "define('GENERATED_CONFIG_CHECK', " >> $DESTINATION grep CONFIG_VERSION config.php-dist | awk -F ' |\)' '{ print $2 }' | xargs echo -n >> $DESTINATION echo ");" >> $DESTINATION -echo -n "\$required_defines = array( " >> $DESTINATION +echo -n "function get_required_defines() { return [ " >> $DESTINATION grep define\( config.php-dist | awk -F\' '{ print "*" $2 "*," }' | grep -v DB_PORT | xargs echo -n | sed -e s/,$// -e s/*/\'/g >> $DESTINATION -echo "); ?>" >> $DESTINATION +echo "]; }" >> $DESTINATION