diff options
Diffstat (limited to 'classes/pref/filters.php')
-rwxr-xr-x | classes/pref/filters.php | 104 |
1 files changed, 62 insertions, 42 deletions
diff --git a/classes/pref/filters.php b/classes/pref/filters.php index 29d309dbb..6e6e3d9ee 100755 --- a/classes/pref/filters.php +++ b/classes/pref/filters.php @@ -1,20 +1,19 @@ <?php class Pref_Filters extends Handler_Protected { - function csrf_ignore($method) { + function csrf_ignore(string $method): bool { $csrf_ignored = array("index", "getfiltertree", "savefilterorder"); return array_search($method, $csrf_ignored) !== false; } - function filtersortreset() { + function filtersortreset(): void { $sth = $this->pdo->prepare("UPDATE ttrss_filters2 SET order_id = 0 WHERE owner_uid = ?"); $sth->execute([$_SESSION['uid']]); - return; } - function savefilterorder() { + function savefilterorder(): void { $data = json_decode($_POST['payload'], true); #file_put_contents("/tmp/saveorder.json", clean($_POST['payload'])); @@ -40,11 +39,9 @@ class Pref_Filters extends Handler_Protected { } } } - - return; } - function testFilterDo() { + function testFilterDo(): void { $offset = (int) clean($_REQUEST["offset"]); $limit = (int) clean($_REQUEST["limit"]); @@ -59,7 +56,9 @@ class Pref_Filters extends Handler_Protected { $res = $this->pdo->query("SELECT id,name FROM ttrss_filter_types"); - $filter_types = array(); + /** @var array<int, string> */ + $filter_types = []; + while ($line = $res->fetch()) { $filter_types[$line["id"]] = $line["name"]; } @@ -67,7 +66,10 @@ class Pref_Filters extends Handler_Protected { $scope_qparts = array(); $rctr = 0; + + /** @var string $r */ foreach (clean($_REQUEST["rule"]) AS $r) { + /** @var array{'reg_exp': string, 'filter_type': int, 'feed_id': array<int, int|string>, 'name': string}|null */ $rule = json_decode($r, true); if ($rule && $rctr < 5) { @@ -75,19 +77,21 @@ class Pref_Filters extends Handler_Protected { unset($rule["filter_type"]); $scope_inner_qparts = []; + + /** @var int|string $feed_id may be a category string (e.g. 'CAT:7') or feed ID int */ foreach ($rule["feed_id"] as $feed_id) { - if (strpos($feed_id, "CAT:") === 0) { - $cat_id = (int) substr($feed_id, 4); - array_push($scope_inner_qparts, "cat_id = " . $this->pdo->quote($cat_id)); - } else if ($feed_id > 0) { - array_push($scope_inner_qparts, "feed_id = " . $this->pdo->quote($feed_id)); - } - } + if (strpos("$feed_id", "CAT:") === 0) { + $cat_id = (int) substr("$feed_id", 4); + array_push($scope_inner_qparts, "cat_id = " . $cat_id); + } else if (is_numeric($feed_id) && $feed_id > 0) { + array_push($scope_inner_qparts, "feed_id = " . (int)$feed_id); + } + } - if (count($scope_inner_qparts) > 0) { - array_push($scope_qparts, "(" . implode(" OR ", $scope_inner_qparts) . ")"); - } + if (count($scope_inner_qparts) > 0) { + array_push($scope_qparts, "(" . implode(" OR ", $scope_inner_qparts) . ")"); + } array_push($filter["rules"], $rule); @@ -162,7 +166,7 @@ class Pref_Filters extends Handler_Protected { print json_encode($rv); } - private function _get_rules_list($filter_id) { + private function _get_rules_list(int $filter_id): string { $sth = $this->pdo->prepare("SELECT reg_exp, inverse, match_on, @@ -203,7 +207,7 @@ class Pref_Filters extends Handler_Protected { } else { $where = $line["cat_filter"] ? - Feeds::_get_cat_title($line["cat_id"]) : + Feeds::_get_cat_title($line["cat_id"] ?? 0) : ($line["feed_id"] ? Feeds::_get_title($line["feed_id"]) : __("All feeds")); } @@ -222,7 +226,7 @@ class Pref_Filters extends Handler_Protected { return $rv; } - function getfiltertree() { + function getfiltertree(): void { $root = array(); $root['id'] = 'root'; $root['name'] = __('Filters'); @@ -307,10 +311,9 @@ class Pref_Filters extends Handler_Protected { $fl['items'] = array($root); print json_encode($fl); - return; } - function edit() { + function edit(): void { $filter_id = (int) clean($_REQUEST["id"] ?? 0); @@ -406,7 +409,10 @@ class Pref_Filters extends Handler_Protected { } } - private function _get_rule_name($rule) { + /** + * @param array<string, mixed>|null $rule + */ + private function _get_rule_name(?array $rule = null): string { if (!$rule) $rule = json_decode(clean($_REQUEST["rule"]), true); $feeds = $rule["feed_id"]; @@ -446,11 +452,18 @@ class Pref_Filters extends Handler_Protected { "<span class='field'>$filter_type</span>", "<span class='feed'>$feed</span>", isset($rule["inverse"]) ? __("(inverse)") : "") . "</span>"; } - function printRuleName() { + function printRuleName(): void { print $this->_get_rule_name(json_decode(clean($_REQUEST["rule"]), true)); } - private function _get_action_name($action) { + /** + * @param array<string, mixed>|null $action + */ + private function _get_action_name(?array $action = null): string { + if (!$action) { + return ""; + } + $sth = $this->pdo->prepare("SELECT description FROM ttrss_filter_actions WHERE id = ?"); $sth->execute([(int)$action["action_id"]]); @@ -484,12 +497,12 @@ class Pref_Filters extends Handler_Protected { return $title; } - function printActionName() { - print $this->_get_action_name(json_decode(clean($_REQUEST["action"]), true)); + function printActionName(): void { + print $this->_get_action_name(json_decode(clean($_REQUEST["action"] ?? ""), true)); } - function editSave() { - $filter_id = clean($_REQUEST["id"]); + function editSave(): void { + $filter_id = (int) clean($_REQUEST["id"]); $enabled = checkbox_to_sql_bool(clean($_REQUEST["enabled"] ?? false)); $match_any_rule = checkbox_to_sql_bool(clean($_REQUEST["match_any_rule"] ?? false)); $inverse = checkbox_to_sql_bool(clean($_REQUEST["inverse"] ?? false)); @@ -510,7 +523,7 @@ class Pref_Filters extends Handler_Protected { $this->pdo->commit(); } - function remove() { + function remove(): void { $ids = explode(",", clean($_REQUEST["ids"])); $ids_qmarks = arr_qmarks($ids); @@ -520,7 +533,7 @@ class Pref_Filters extends Handler_Protected { $sth->execute(array_merge($ids, [$_SESSION['uid']])); } - private function _save_rules_and_actions($filter_id) { + private function _save_rules_and_actions(int $filter_id): void { $sth = $this->pdo->prepare("DELETE FROM ttrss_filters2_rules WHERE filter_id = ?"); $sth->execute([$filter_id]); @@ -597,7 +610,7 @@ class Pref_Filters extends Handler_Protected { } } - function add () { + function add(): void { $enabled = checkbox_to_sql_bool(clean($_REQUEST["enabled"] ?? false)); $match_any_rule = checkbox_to_sql_bool(clean($_REQUEST["match_any_rule"] ?? false)); $title = clean($_REQUEST["title"]); @@ -625,7 +638,7 @@ class Pref_Filters extends Handler_Protected { $this->pdo->commit(); } - function index() { + function index(): void { if (array_key_exists("search", $_REQUEST)) { $filter_search = clean($_REQUEST["search"]); $_SESSION["prefs_filter_search"] = $filter_search; @@ -691,7 +704,8 @@ class Pref_Filters extends Handler_Protected { <?php } - function editrule() { + function editrule(): void { + /** @var array<int, int|string> */ $feed_ids = explode(",", clean($_REQUEST["ids"])); print json_encode([ @@ -699,7 +713,10 @@ class Pref_Filters extends Handler_Protected { ]); } - private function _get_name($id) { + /** + * @return array<int, string> + */ + private function _get_name(int $id): array { $sth = $this->pdo->prepare( "SELECT title,match_any_rule,f.inverse AS inverse,COUNT(DISTINCT r.id) AS num_rules,COUNT(DISTINCT a.id) AS num_actions @@ -745,8 +762,9 @@ class Pref_Filters extends Handler_Protected { return []; } - function join() { - $ids = explode(",", clean($_REQUEST["ids"])); + function join(): void { + /** @var array<int, int> */ + $ids = array_map("intval", explode(",", clean($_REQUEST["ids"]))); if (count($ids) > 1) { $base_id = array_shift($ids); @@ -775,7 +793,7 @@ class Pref_Filters extends Handler_Protected { } } - private function _optimize($id) { + private function _optimize(int $id): void { $this->pdo->beginTransaction(); @@ -830,9 +848,11 @@ class Pref_Filters extends Handler_Protected { $this->pdo->commit(); } - private function _feed_multi_select($id, $default_ids = [], - $attributes = "", $include_all_feeds = true, - $root_id = null, $nest_level = 0) { + /** + * @param array<int, int|string> $default_ids + */ + private function _feed_multi_select(string $id, array $default_ids = [], string $attributes = "", + bool $include_all_feeds = true, ?int $root_id = null, int $nest_level = 0): string { $pdo = Db::pdo(); |