diff --git a/core/polyfills.php b/core/polyfills.php index 2102d7d0..26231298 100644 --- a/core/polyfills.php +++ b/core/polyfills.php @@ -511,6 +511,24 @@ function no_escape(string $input): string return $input; } +/** + * Given a 1-indexed numeric-ish thing, return a zero-indexed + * number between 0 and $max + */ +function page_number(string $input, ?int $max=null): int +{ + if (!is_numeric($input)) { + $pageNumber = 0; + } elseif ($input <= 0) { + $pageNumber = 0; + } elseif (!is_null($max) && $input >= $max) { + $pageNumber = $max - 1; + } else { + $pageNumber = $input - 1; + } + return $pageNumber; +} + function clamp(?int $val, ?int $min=null, ?int $max=null): int { if (!is_numeric($val) || (!is_null($min) && $val < $min)) { diff --git a/ext/forum/main.php b/ext/forum/main.php index 95945df4..5906488f 100644 --- a/ext/forum/main.php +++ b/ext/forum/main.php @@ -249,19 +249,10 @@ class Forum extends Extension { global $config, $database; $threadsPerPage = $config->get_int('forumThreadsPerPage', 15); - $totalPages = ceil($database->get_one("SELECT COUNT(*) FROM forum_threads") / $threadsPerPage); + $totalPages = (int)ceil($database->get_one("SELECT COUNT(*) FROM forum_threads") / $threadsPerPage); if ($event->count_args() >= 2) { - $pageNumber = $event->get_arg(1); - if (!is_numeric($pageNumber)) { - $pageNumber = 0; - } elseif ($pageNumber <= 0) { - $pageNumber = 0; - } elseif ($pageNumber >= $totalPages) { - $pageNumber = $totalPages - 1; - } else { - $pageNumber--; - } + $pageNumber = page_number($event->get_arg(1), $totalPages); } else { $pageNumber = 0; } @@ -286,20 +277,11 @@ class Forum extends Extension global $config, $database; $threadID = int_escape($event->get_arg(1)); $postsPerPage = $config->get_int('forumPostsPerPage', 15); - $totalPages = ceil($database->get_one("SELECT COUNT(*) FROM forum_posts WHERE thread_id = :id", ['id'=>$threadID]) / $postsPerPage); + $totalPages = (int)ceil($database->get_one("SELECT COUNT(*) FROM forum_posts WHERE thread_id = :id", ['id'=>$threadID]) / $postsPerPage); $threadTitle = $this->get_thread_title($threadID); if ($event->count_args() >= 3) { - $pageNumber = $event->get_arg(2); - if (!is_numeric($pageNumber)) { - $pageNumber = 0; - } elseif ($pageNumber <= 0) { - $pageNumber = 0; - } elseif ($pageNumber >= $totalPages) { - $pageNumber = $totalPages - 1; - } else { - $pageNumber--; - } + $pageNumber = page_number($event->get_arg(2), $totalPages); } else { $pageNumber = 0; } diff --git a/ext/pools/main.php b/ext/pools/main.php index 57755648..447d19a4 100644 --- a/ext/pools/main.php +++ b/ext/pools/main.php @@ -237,7 +237,7 @@ class Pools extends Extension break; case "updated": - $this->get_history(int_escape($event->get_arg(1))); + $this->get_history(page_number($event->get_arg(1))); break; case "revert": @@ -832,14 +832,6 @@ class Pools extends Extension { global $config, $database; - if (is_null($pageNumber) || !is_numeric($pageNumber)) { - $pageNumber = 0; - } elseif ($pageNumber <= 0) { - $pageNumber = 0; - } else { - $pageNumber--; - } - $historiesPerPage = $config->get_int(PoolsConfig::UPDATED_PER_PAGE); $history = $database->get_all("