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 @@ $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 { "; print ""; - - } // 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"] ?? "");