Typing IHandler methods, typing Handler_Public, fix type of $feed_id (might be tag).

This commit is contained in:
wn_ 2021-11-13 14:05:43 +00:00
parent 25775bb407
commit 1ec003ce35
7 changed files with 49 additions and 28 deletions

View File

@ -27,7 +27,7 @@ class API extends Handler {
]); ]);
} }
function before($method) { function before(string $method): bool {
if (parent::before($method)) { if (parent::before($method)) {
header("Content-Type: text/json"); header("Content-Type: text/json");

View File

@ -2067,7 +2067,12 @@ class Feeds extends Handler_Protected {
->delete_many(); ->delete_many();
} }
static function _update_access_key(int $feed_id, bool $is_cat, int $owner_uid): ?string { /**
* @param string $feed_id may be a feed ID or tag
*
* @see Handler_Public#generate_syndicated_feed()
*/
static function _update_access_key(string $feed_id, bool $is_cat, int $owner_uid): ?string {
$key = ORM::for_table('ttrss_access_keys') $key = ORM::for_table('ttrss_access_keys')
->where('owner_uid', $owner_uid) ->where('owner_uid', $owner_uid)
->where('feed_id', $feed_id) ->where('feed_id', $feed_id)
@ -2077,7 +2082,12 @@ class Feeds extends Handler_Protected {
return self::_get_access_key($feed_id, $is_cat, $owner_uid); return self::_get_access_key($feed_id, $is_cat, $owner_uid);
} }
static function _get_access_key(int $feed_id, bool $is_cat, int $owner_uid): ?string { /**
* @param string $feed_id may be a feed ID or tag
*
* @see Handler_Public#generate_syndicated_feed()
*/
static function _get_access_key(string $feed_id, bool $is_cat, int $owner_uid): ?string {
$key = ORM::for_table('ttrss_access_keys') $key = ORM::for_table('ttrss_access_keys')
->where('owner_uid', $owner_uid) ->where('owner_uid', $owner_uid)
->where('feed_id', $feed_id) ->where('feed_id', $feed_id)

View File

@ -1,9 +1,16 @@
<?php <?php
class Handler implements IHandler { class Handler implements IHandler {
// TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
/** @var PDO */
protected $pdo; protected $pdo;
/** @var array<int|string, mixed> */
protected $args; protected $args;
function __construct($args) { /**
* @param array<int|string, mixed> $args
*/
function __construct(array $args) {
$this->pdo = Db::pdo(); $this->pdo = Db::pdo();
$this->args = $args; $this->args = $args;
} }
@ -12,11 +19,11 @@ class Handler implements IHandler {
return false; return false;
} }
function before($method) { function before(string $method): bool {
return true; return true;
} }
function after() { function after(): bool {
return true; return true;
} }

View File

@ -1,6 +1,6 @@
<?php <?php
class Handler_Administrative extends Handler_Protected { class Handler_Administrative extends Handler_Protected {
function before($method) { function before(string $method): bool {
if (parent::before($method)) { if (parent::before($method)) {
if (($_SESSION["access_level"] ?? 0) >= UserHelper::ACCESS_LEVEL_ADMIN) { if (($_SESSION["access_level"] ?? 0) >= UserHelper::ACCESS_LEVEL_ADMIN) {
return true; return true;

View File

@ -1,7 +1,7 @@
<?php <?php
class Handler_Protected extends Handler { class Handler_Protected extends Handler {
function before($method) { function before(string $method): bool {
return parent::before($method) && !empty($_SESSION['uid']); return parent::before($method) && !empty($_SESSION['uid']);
} }
} }

View File

@ -1,10 +1,12 @@
<?php <?php
class Handler_Public extends Handler { class Handler_Public extends Handler {
// $feed may be a tag /**
* @param string $feed may be a feed ID or tag
*/
private function generate_syndicated_feed(int $owner_uid, string $feed, bool $is_cat, private function generate_syndicated_feed(int $owner_uid, string $feed, bool $is_cat,
int $limit, int $offset, string $search, string $view_mode = "", int $limit, int $offset, string $search, string $view_mode = "",
string $format = 'atom', string $order = "", string $orig_guid = "", string $start_ts = "") { string $format = 'atom', string $order = "", string $orig_guid = "", string $start_ts = ""): void {
$note_style = "background-color : #fff7d5; $note_style = "background-color : #fff7d5;
border-width : 1px; ". border-width : 1px; ".
@ -52,11 +54,13 @@ class Handler_Public extends Handler {
PluginHost::feed_to_pfeed_id((int)$feed)); PluginHost::feed_to_pfeed_id((int)$feed));
if ($handler) { if ($handler) {
// 'get_headlines' is implemented by the plugin.
// @phpstan-ignore-next-line
$qfh_ret = $handler->get_headlines(PluginHost::feed_to_pfeed_id((int)$feed), $params); $qfh_ret = $handler->get_headlines(PluginHost::feed_to_pfeed_id((int)$feed), $params);
} else { } else {
user_error("Failed to find handler for plugin feed ID: $feed", E_USER_ERROR); user_error("Failed to find handler for plugin feed ID: $feed", E_USER_ERROR);
return false; return;
} }
} else { } else {
@ -247,7 +251,7 @@ class Handler_Public extends Handler {
} }
} }
function getUnread() { function getUnread(): void {
$login = clean($_REQUEST["login"]); $login = clean($_REQUEST["login"]);
$fresh = clean($_REQUEST["fresh"]) == "1"; $fresh = clean($_REQUEST["fresh"]) == "1";
@ -265,7 +269,7 @@ class Handler_Public extends Handler {
} }
} }
function getProfiles() { function getProfiles(): void {
$login = clean($_REQUEST["login"]); $login = clean($_REQUEST["login"]);
$rv = []; $rv = [];
@ -288,7 +292,7 @@ class Handler_Public extends Handler {
print json_encode($rv); print json_encode($rv);
} }
function logout() { function logout(): void {
if (validate_csrf($_POST["csrf_token"])) { if (validate_csrf($_POST["csrf_token"])) {
UserHelper::logout(); UserHelper::logout();
header("Location: index.php"); header("Location: index.php");
@ -298,7 +302,7 @@ class Handler_Public extends Handler {
} }
} }
function rss() { function rss(): void {
$feed = clean($_REQUEST["id"]); $feed = clean($_REQUEST["id"]);
$key = clean($_REQUEST["key"]); $key = clean($_REQUEST["key"]);
$is_cat = clean($_REQUEST["is_cat"] ?? false); $is_cat = clean($_REQUEST["is_cat"] ?? false);
@ -333,21 +337,21 @@ class Handler_Public extends Handler {
header('HTTP/1.1 403 Forbidden'); header('HTTP/1.1 403 Forbidden');
} }
function updateTask() { function updateTask(): void {
PluginHost::getInstance()->run_hooks(PluginHost::HOOK_UPDATE_TASK); PluginHost::getInstance()->run_hooks(PluginHost::HOOK_UPDATE_TASK);
} }
function housekeepingTask() { function housekeepingTask(): void {
PluginHost::getInstance()->run_hooks(PluginHost::HOOK_HOUSE_KEEPING); PluginHost::getInstance()->run_hooks(PluginHost::HOOK_HOUSE_KEEPING);
} }
function globalUpdateFeeds() { function globalUpdateFeeds(): void {
RPC::updaterandomfeed_real(); RPC::updaterandomfeed_real();
PluginHost::getInstance()->run_hooks(PluginHost::HOOK_UPDATE_TASK); PluginHost::getInstance()->run_hooks(PluginHost::HOOK_UPDATE_TASK);
} }
function login() { function login(): void {
if (!Config::get(Config::SINGLE_USER_MODE)) { if (!Config::get(Config::SINGLE_USER_MODE)) {
$login = clean($_POST["login"]); $login = clean($_POST["login"]);
@ -403,12 +407,12 @@ class Handler_Public extends Handler {
} }
} }
function index() { function index(): void {
header("Content-Type: text/plain"); header("Content-Type: text/plain");
print Errors::to_json(Errors::E_UNKNOWN_METHOD); print Errors::to_json(Errors::E_UNKNOWN_METHOD);
} }
function forgotpass() { function forgotpass(): void {
startup_gettext(); startup_gettext();
session_start(); session_start();
@ -587,7 +591,7 @@ class Handler_Public extends Handler {
print "</html>"; print "</html>";
} }
function dbupdate() { function dbupdate(): void {
startup_gettext(); startup_gettext();
if (!Config::get(Config::SINGLE_USER_MODE) && ($_SESSION["access_level"] ?? 0) < 10) { if (!Config::get(Config::SINGLE_USER_MODE) && ($_SESSION["access_level"] ?? 0) < 10) {
@ -730,7 +734,7 @@ class Handler_Public extends Handler {
<?php <?php
} }
function cached() { function cached(): void {
list ($cache_dir, $filename) = explode("/", $_GET["file"], 2); list ($cache_dir, $filename) = explode("/", $_GET["file"], 2);
// we do not allow files with extensions at the moment // we do not allow files with extensions at the moment
@ -746,7 +750,7 @@ class Handler_Public extends Handler {
} }
} }
private function _make_article_tag_uri($id, $timestamp) { private function _make_article_tag_uri(int $id, string $timestamp): string {
$timestamp = date("Y-m-d", strtotime($timestamp)); $timestamp = date("Y-m-d", strtotime($timestamp));
@ -756,7 +760,7 @@ class Handler_Public extends Handler {
// this should be used very carefully because this endpoint is exposed to unauthenticated users // this should be used very carefully because this endpoint is exposed to unauthenticated users
// plugin data is not loaded because there's no user context and owner_uid/session may or may not be available // plugin data is not loaded because there's no user context and owner_uid/session may or may not be available
// in general, don't do anything user-related in here and do not modify $_SESSION // in general, don't do anything user-related in here and do not modify $_SESSION
public function pluginhandler() { public function pluginhandler(): void {
$host = new PluginHost(); $host = new PluginHost();
$plugin_name = basename(clean($_REQUEST["plugin"])); $plugin_name = basename(clean($_REQUEST["plugin"]));
@ -788,7 +792,7 @@ class Handler_Public extends Handler {
} }
} }
static function _render_login_form(string $return_to = "") { static function _render_login_form(string $return_to = ""): void {
header('Cache-Control: public'); header('Cache-Control: public');
if ($return_to) if ($return_to)

View File

@ -1,6 +1,6 @@
<?php <?php
interface IHandler { interface IHandler {
function csrf_ignore(string $method): bool; function csrf_ignore(string $method): bool;
function before($method); function before(string $method): bool;
function after(); function after(): bool;
} }