From be4e7b13403666fc477d4b563ea8c075d0fd2022 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov <noreply@fakecake.org>
Date: Mon, 22 Feb 2021 14:41:09 +0300
Subject: [PATCH] fix several issues reported by phpstan

---
 api/index.php                   |  4 ++--
 classes/api.php                 |  2 +-
 classes/digest.php              |  9 ---------
 classes/feeds.php               |  6 ------
 classes/handler/public.php      | 10 +++++-----
 classes/pluginhost.php          |  3 ++-
 classes/pref/prefs.php          |  7 -------
 include/functions.php           |  8 ++++----
 include/sanity_check.php        |  6 +++---
 include/sanity_config.php       |  4 ++--
 include/sessions.php            |  8 ++++----
 phpstan.neon                    |  4 +++-
 plugins/af_fsckportal/init.php  |  5 +----
 plugins/af_redditimgur/init.php |  5 ++++-
 update.php                      |  4 ++--
 utils/regen_config_checks.sh    |  4 ++--
 16 files changed, 35 insertions(+), 54 deletions(-)

diff --git a/api/index.php b/api/index.php
index eb79422f9..1b713d561 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 03eea1927..5677cb908 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 77eb92c54..e0c23d705 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 63b84edae..b59504c03 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 b0ce2306d..3910cf7c1 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 a05938111..5121c8491 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 a26281fee..adb249dac 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 174ef39f0..bf9b374a2 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 9407b606f..2786f012f 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 5059ee83b..b304adf54 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 16de53ab2..5b372612b 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 0703e0d15..b2cd978d8 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 04b77a15a..8caa617c6 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 2677fdd90..713eaea5c 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 1f79dccf0..71b8cf76c 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 e8b1ed830..b20ce0480 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
 
 
-- 
GitLab