From 2c41bc7fbc9013e79e929a31e3824cf040afc54a Mon Sep 17 00:00:00 2001
From: wn_ <invalid@email.com>
Date: Fri, 12 Nov 2021 06:16:18 +0000
Subject: [PATCH] Address PHPStan warnings in 'classes/mailer.php',
 'classes/opml.php', and 'classes/pluginhandler.php'.

---
 classes/mailer.php        | 14 ++++++++++----
 classes/opml.php          | 32 ++++++++++++++++++++------------
 classes/pluginhandler.php |  2 +-
 3 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/classes/mailer.php b/classes/mailer.php
index 8238904ee..4eb13aec8 100644
--- a/classes/mailer.php
+++ b/classes/mailer.php
@@ -1,8 +1,12 @@
 <?php
 class Mailer {
-	private $last_error = "";
+	private string $last_error = "";
 
-	function mail($params) {
+	/**
+	 * @param array<string, mixed> $params
+	 * @return bool|int bool if the default mail function handled the request, otherwise an int as described in Mailer#mail()
+	 */
+	function mail(array $params) {
 
 		$to_name = $params["to_name"] ?? "";
 		$to_address = $params["to_address"];
@@ -26,6 +30,8 @@ class Mailer {
 		// 4. set error message if needed via passed Mailer instance function set_error()
 
 		foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_SEND_MAIL) as $p) {
+			// Implemented via plugin, so ignore the undefined method 'hook_send_mail'.
+			// @phpstan-ignore-next-line
 			$rc = $p->hook_send_mail($this, $params);
 
 			if ($rc == 1)
@@ -46,12 +52,12 @@ class Mailer {
 		return $rc;
 	}
 
-	function set_error($message) {
+	function set_error(string $message): void {
 		$this->last_error = $message;
 		user_error("Error sending mail: $message", E_USER_WARNING);
 	}
 
-	function error() {
+	function error(): string {
 		return $this->last_error;
 	}
 }
diff --git a/classes/opml.php b/classes/opml.php
index f60918061..b9f5f2eab 100644
--- a/classes/opml.php
+++ b/classes/opml.php
@@ -7,6 +7,9 @@ class OPML extends Handler_Protected {
 		return array_search($method, $csrf_ignored) !== false;
 	}
 
+	/**
+	 * @return bool|int|void false if writing the file failed, true if printing succeeded, int if bytes were written to a file, or void if $owner_uid is missing
+	 */
 	function export() {
 		$output_name = sprintf("tt-rss_%s_%s.opml", $_SESSION["name"], date("Y-m-d"));
 		$include_settings = $_REQUEST["include_settings"] == "1";
@@ -17,7 +20,7 @@ class OPML extends Handler_Protected {
 		return $rc;
 	}
 
-	function import() {
+	function import(): void {
 		$owner_uid = $_SESSION["uid"];
 
 		header('Content-Type: text/html; charset=utf-8');
@@ -42,13 +45,11 @@ class OPML extends Handler_Protected {
 			</form>";
 
 		print "</div></body></html>";
-
-
 	}
 
 	// Export
 
-	private function opml_export_category(int $owner_uid, int $cat_id, bool $hide_private_feeds = false, bool $include_settings = true) {
+	private function opml_export_category(int $owner_uid, int $cat_id, bool $hide_private_feeds = false, bool $include_settings = true): string {
 
 		if ($hide_private_feeds)
 			$hide_qpart = "(private IS false AND auth_login = '' AND auth_pass = '')";
@@ -124,6 +125,9 @@ class OPML extends Handler_Protected {
 		return $out;
 	}
 
+	/**
+	 * @return bool|int|void false if writing the file failed, true if printing succeeded, int if bytes were written to a file, or void if $owner_uid is missing
+	 */
 	function opml_export(string $filename, int $owner_uid, bool $hide_private_feeds = false, bool $include_settings = true, bool $file_output = false) {
 		if (!$owner_uid) return;
 
@@ -290,13 +294,14 @@ class OPML extends Handler_Protected {
 
 		if ($file_output)
 			return file_put_contents($filename, $res) > 0;
-		else
-			print $res;
+
+		print $res;
+		return true;
 	}
 
 	// Import
 
-	private function opml_import_feed(DOMNode $node, int $cat_id, int $owner_uid, int $nest) {
+	private function opml_import_feed(DOMNode $node, int $cat_id, int $owner_uid, int $nest): void {
 		$attrs = $node->attributes;
 
 		$feed_title = mb_substr($attrs->getNamedItem('text')->nodeValue, 0, 250);
@@ -341,7 +346,7 @@ class OPML extends Handler_Protected {
 		}
 	}
 
-	private function opml_import_label(DOMNode $node, int $owner_uid, int $nest) {
+	private function opml_import_label(DOMNode $node, int $owner_uid, int $nest): void {
 		$attrs = $node->attributes;
 		$label_name = $attrs->getNamedItem('label-name')->nodeValue;
 
@@ -358,7 +363,7 @@ class OPML extends Handler_Protected {
 		}
 	}
 
-	private function opml_import_preference(DOMNode $node, int $owner_uid, int $nest) {
+	private function opml_import_preference(DOMNode $node, int $owner_uid, int $nest): void {
 		$attrs = $node->attributes;
 		$pref_name = $attrs->getNamedItem('pref-name')->nodeValue;
 
@@ -372,7 +377,7 @@ class OPML extends Handler_Protected {
 		}
 	}
 
-	private function opml_import_filter(DOMNode $node, int $owner_uid, int $nest) {
+	private function opml_import_filter(DOMNode $node, int $owner_uid, int $nest): void {
 		$attrs = $node->attributes;
 
 		$filter_type = $attrs->getNamedItem('filter-type')->nodeValue;
@@ -526,7 +531,7 @@ class OPML extends Handler_Protected {
 		}
 	}
 
-	private function opml_import_category(DOMDocument $doc, ?DOMNode $root_node, int $owner_uid, int $parent_id, int $nest) {
+	private function opml_import_category(DOMDocument $doc, ?DOMNode $root_node, int $owner_uid, int $parent_id, int $nest): void {
 		$default_cat_id = (int) $this->get_feed_category('Imported feeds', $owner_uid, 0);
 
 		if ($root_node) {
@@ -601,6 +606,9 @@ class OPML extends Handler_Protected {
 	}
 
 	/** $filename is optional; assumes HTTP upload with $_FILES otherwise */
+	/**
+	 * @return bool|void false on failure, true if successful, void if $owner_uid is missing
+	 */
 	function opml_import(int $owner_uid, string $filename = "") {
 		if (!$owner_uid) return;
 
@@ -667,7 +675,7 @@ class OPML extends Handler_Protected {
 		return true;
 	}
 
-	private function opml_notice(string $msg, int $prefix_length = 0) {
+	private function opml_notice(string $msg, int $prefix_length = 0): void {
 		if (php_sapi_name() == "cli") {
 			Debug::log(str_repeat("   ", $prefix_length) . $msg);
 		} else {
diff --git a/classes/pluginhandler.php b/classes/pluginhandler.php
index 9b3772ddc..5c73920e5 100644
--- a/classes/pluginhandler.php
+++ b/classes/pluginhandler.php
@@ -4,7 +4,7 @@ class PluginHandler extends Handler_Protected {
 		return true;
 	}
 
-	function catchall($method) {
+	function catchall(string $method): void {
 		$plugin_name = clean($_REQUEST["plugin"]);
 		$plugin = PluginHost::getInstance()->get_plugin($plugin_name);
 		$csrf_token = ($_POST["csrf_token"] ?? "");
-- 
GitLab