aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2023-04-05 23:26:38 +0200
committerGravatar GitHub <noreply@github.com> 2023-04-05 23:26:38 +0200
commit2118448133e327294ad2b69ed8736bc29879103d (patch)
tree00c003056dedbd8e3554801d6493a25641a260a5
parent4f078958b5603900592e14f9f3189bbebfc81bab (diff)
PHPStan level 6 for more files (#5264)
7 more files passing (see phpstan-next.txt)
-rw-r--r--app/Controllers/authController.php2
-rw-r--r--app/Controllers/updateController.php15
-rw-r--r--app/Models/Auth.php22
-rw-r--r--app/Models/FormAuth.php9
-rw-r--r--lib/Minz/ActionController.php16
-rw-r--r--lib/Minz/FrontController.php9
-rw-r--r--lib/Minz/ModelArray.php13
-rw-r--r--lib/Minz/Url.php20
-rw-r--r--tests/phpstan-next.txt7
9 files changed, 63 insertions, 50 deletions
diff --git a/app/Controllers/authController.php b/app/Controllers/authController.php
index 30fd705f5..81043bcf7 100644
--- a/app/Controllers/authController.php
+++ b/app/Controllers/authController.php
@@ -162,7 +162,7 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController {
// All is good, go back to the original request or the index.
$url = Minz_Url::unserialize(Minz_Request::param('original_request'));
- if ($url === null) {
+ if (empty($url)) {
$url = [ 'c' => 'index', 'a' => 'index' ];
}
Minz_Request::good(_t('feedback.auth.login.success'), $url);
diff --git a/app/Controllers/updateController.php b/app/Controllers/updateController.php
index 82ccd20c9..742806ba3 100644
--- a/app/Controllers/updateController.php
+++ b/app/Controllers/updateController.php
@@ -4,14 +4,14 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
const LASTUPDATEFILE = 'last_update.txt';
- public static function isGit() {
+ public static function isGit(): bool {
return is_dir(FRESHRSS_PATH . '/.git/');
}
/**
* Automatic change to the new name of edge branch since FreshRSS 1.18.0.
*/
- public static function migrateToGitEdge() {
+ public static function migrateToGitEdge(): bool {
$errorMessage = 'Error during git checkout to edge branch. Please change branch manually!';
if (!is_writable(FRESHRSS_PATH . '/.git/config')) {
@@ -44,7 +44,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
return true;
}
- public static function hasGitUpdate() {
+ public static function hasGitUpdate(): bool {
$cwd = getcwd();
chdir(FRESHRSS_PATH);
$output = array();
@@ -66,6 +66,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
strpos($line, '[behind') !== false || strpos($line, '[ahead') !== false || strpos($line, '[gone') !== false;
}
+ /** @return string|true */
public static function gitPull() {
$cwd = getcwd();
chdir(FRESHRSS_PATH);
@@ -109,7 +110,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
}
}
- public function indexAction() {
+ public function indexAction(): void {
FreshRSS_View::prependTitle(_t('admin.update.title') . ' · ');
if (file_exists(UPDATE_FILENAME)) {
@@ -135,7 +136,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
}
}
- public function checkAction() {
+ public function checkAction(): void {
$this->view->_path('update/index.phtml');
if (file_exists(UPDATE_FILENAME)) {
@@ -216,7 +217,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
}
}
- public function applyAction() {
+ public function applyAction(): void {
if (FreshRSS_Context::$system_conf->disable_update || !file_exists(UPDATE_FILENAME) || !touch(FRESHRSS_PATH . '/index.html')) {
Minz_Request::forward(array('c' => 'update'), true);
}
@@ -278,7 +279,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController {
/**
* This action displays information about installation.
*/
- public function checkInstallAction() {
+ public function checkInstallAction(): void {
FreshRSS_View::prependTitle(_t('admin.check_install.title') . ' · ');
$this->view->status_php = check_install_php();
diff --git a/app/Models/Auth.php b/app/Models/Auth.php
index 65e761fb8..ccf244033 100644
--- a/app/Models/Auth.php
+++ b/app/Models/Auth.php
@@ -9,12 +9,13 @@ class FreshRSS_Auth {
*/
const DEFAULT_COOKIE_DURATION = 7776000;
+ /** @var bool */
private static $login_ok = false;
/**
* This method initializes authentication system.
*/
- public static function init() {
+ public static function init(): bool {
if (isset($_SESSION['REMOTE_USER']) && $_SESSION['REMOTE_USER'] !== httpAuthUser()) {
//HTTP REMOTE_USER has changed
self::removeAccess();
@@ -47,9 +48,9 @@ class FreshRSS_Auth {
* Required session parameters are also set in this method (such as
* currentUser).
*
- * @return boolean true if user can be connected, false else.
+ * @return bool true if user can be connected, false otherwise.
*/
- private static function accessControl() {
+ private static function accessControl(): bool {
$auth_type = FreshRSS_Context::$system_conf->auth_type;
switch ($auth_type) {
case 'form':
@@ -100,7 +101,7 @@ class FreshRSS_Auth {
/**
* Gives access to the current user.
*/
- public static function giveAccess() {
+ public static function giveAccess(): bool {
FreshRSS_Context::initUser();
if (FreshRSS_Context::$user_conf == null) {
self::$login_ok = false;
@@ -136,7 +137,7 @@ class FreshRSS_Auth {
* @param string $scope general (default) or admin
* @return boolean true if user has corresponding access, false else.
*/
- public static function hasAccess($scope = 'general') {
+ public static function hasAccess($scope = 'general'): bool {
if (FreshRSS_Context::$user_conf == null) {
return false;
}
@@ -159,7 +160,7 @@ class FreshRSS_Auth {
/**
* Removes all accesses for the current user.
*/
- public static function removeAccess() {
+ public static function removeAccess(): void {
self::$login_ok = false;
Minz_Session::_params([
'loginOk' => false,
@@ -200,18 +201,18 @@ class FreshRSS_Auth {
/**
* Return if authentication is enabled on this instance of FRSS.
*/
- public static function accessNeedsLogin() {
+ public static function accessNeedsLogin(): bool {
return FreshRSS_Context::$system_conf->auth_type !== 'none';
}
/**
* Return if authentication requires a PHP action.
*/
- public static function accessNeedsAction() {
+ public static function accessNeedsAction(): bool {
return FreshRSS_Context::$system_conf->auth_type === 'form';
}
- public static function csrfToken() {
+ public static function csrfToken(): string {
$csrf = Minz_Session::param('csrf');
if ($csrf == '') {
$salt = FreshRSS_Context::$system_conf->salt;
@@ -220,7 +221,8 @@ class FreshRSS_Auth {
}
return $csrf;
}
- public static function isCsrfOk($token = null) {
+
+ public static function isCsrfOk(?string $token = null): bool {
$csrf = Minz_Session::param('csrf');
if ($token === null) {
$token = $_POST['_csrf'] ?? '';
diff --git a/app/Models/FormAuth.php b/app/Models/FormAuth.php
index 653eba04b..476daba53 100644
--- a/app/Models/FormAuth.php
+++ b/app/Models/FormAuth.php
@@ -13,7 +13,8 @@ class FreshRSS_FormAuth {
return password_verify($nonce . $hash, $challenge);
}
- public static function getCredentialsFromCookie() {
+ /** @return array<string> */
+ public static function getCredentialsFromCookie(): array {
$token = Minz_Session::getLongTermCookie('FreshRSS_login');
if (!ctype_alnum($token)) {
return array();
@@ -36,6 +37,7 @@ class FreshRSS_FormAuth {
return [];
}
+ /** @return string|false */
private static function renewCookie(string $token) {
$token_file = DATA_PATH . '/tokens/' . $token . '.txt';
if (touch($token_file)) {
@@ -48,6 +50,7 @@ class FreshRSS_FormAuth {
return false;
}
+ /** @return string|false */
public static function makeCookie(string $username, string $password_hash) {
do {
$token = sha1(FreshRSS_Context::$system_conf->salt . $username . uniqid('' . mt_rand(), true));
@@ -61,7 +64,7 @@ class FreshRSS_FormAuth {
return self::renewCookie($token);
}
- public static function deleteCookie() {
+ public static function deleteCookie(): void {
$token = Minz_Session::getLongTermCookie('FreshRSS_login');
if (ctype_alnum($token)) {
Minz_Session::deleteLongTermCookie('FreshRSS_login');
@@ -73,7 +76,7 @@ class FreshRSS_FormAuth {
}
}
- public static function purgeTokens() {
+ public static function purgeTokens(): void {
$limits = FreshRSS_Context::$system_conf->limits;
$cookie_duration = empty($limits['cookie_duration']) ? FreshRSS_Auth::DEFAULT_COOKIE_DURATION : $limits['cookie_duration'];
$oldest = time() - $cookie_duration;
diff --git a/lib/Minz/ActionController.php b/lib/Minz/ActionController.php
index c29ae8ad8..8cc9fbc0b 100644
--- a/lib/Minz/ActionController.php
+++ b/lib/Minz/ActionController.php
@@ -17,9 +17,13 @@ class Minz_ActionController {
/** @var array<string,string> */
private $csp_policies;
+ /** @var Minz_View */
protected $view;
- // Gives the possibility to override the default View type.
+ /**
+ * Gives the possibility to override the default View type.
+ * @var class-string
+ */
public static $viewType = 'Minz_View';
public function __construct () {
@@ -37,7 +41,7 @@ class Minz_ActionController {
/**
* Getteur
*/
- public function view () {
+ public function view(): Minz_View {
return $this->view;
}
@@ -45,7 +49,7 @@ class Minz_ActionController {
* Set default CSP policies.
* @param array<string,string> $policies An array where keys are directives and values are sources.
*/
- public static function _defaultCsp($policies) {
+ public static function _defaultCsp(array $policies): void {
if (!isset($policies['default-src'])) {
Minz_Log::warning('Default CSP policy is not declared', ADMIN_LOG);
}
@@ -61,9 +65,9 @@ class Minz_ActionController {
* - https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
* - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/default-src
*
- * @param array $policies An array where keys are directives and values are sources.
+ * @param array<string,string> $policies An array where keys are directives and values are sources.
*/
- protected function _csp($policies) {
+ protected function _csp(array $policies): void {
if (!isset($policies['default-src'])) {
$action = Minz_Request::controllerName() . '#' . Minz_Request::actionName();
Minz_Log::warning(
@@ -77,7 +81,7 @@ class Minz_ActionController {
/**
* Send HTTP Content-Security-Policy header based on declared policies.
*/
- public function declareCspHeader() {
+ public function declareCspHeader(): void {
$policies = [];
foreach ($this->csp_policies as $directive => $sources) {
$policies[] = $directive . ' ' . $sources;
diff --git a/lib/Minz/FrontController.php b/lib/Minz/FrontController.php
index a5f73b59f..4837f89c1 100644
--- a/lib/Minz/FrontController.php
+++ b/lib/Minz/FrontController.php
@@ -24,6 +24,8 @@
* It is generally invoqued by an index.php file at the root.
*/
class Minz_FrontController {
+
+ /** @var Minz_Dispatcher */
protected $dispatcher;
/**
@@ -53,7 +55,7 @@ class Minz_FrontController {
/**
* Démarre l'application (lance le dispatcher et renvoie la réponse)
*/
- public function run() {
+ public function run(): void {
try {
$this->dispatcher->run();
} catch (Minz_Exception $e) {
@@ -80,8 +82,9 @@ class Minz_FrontController {
/**
* Kills the programme
+ * @return never
*/
- public static function killApp($txt = '') {
+ public static function killApp(string $txt = '') {
header('HTTP 1.1 500 Internal Server Error', true, 500);
if (function_exists('errorMessageInfo')) {
//If the application has defined a custom error message function
@@ -90,7 +93,7 @@ class Minz_FrontController {
die('### Application problem ###<br />' . "\n" . $txt);
}
- private function setReporting() {
+ private function setReporting(): void {
$envType = getenv('FRESHRSS_ENV');
if ($envType == '') {
$conf = Minz_Configuration::get('system');
diff --git a/lib/Minz/ModelArray.php b/lib/Minz/ModelArray.php
index 72de35f35..0d8b71f91 100644
--- a/lib/Minz/ModelArray.php
+++ b/lib/Minz/ModelArray.php
@@ -10,6 +10,7 @@
class Minz_ModelArray {
/**
* $filename est le nom du fichier
+ * @var string
*/
protected $filename;
@@ -22,7 +23,8 @@ class Minz_ModelArray {
$this->filename = $filename;
}
- protected function loadArray() {
+ /** @return array<string,mixed> */
+ protected function loadArray(): array {
if (!file_exists($this->filename)) {
throw new Minz_FileNotExistException($this->filename, Minz_Exception::WARNING);
} elseif (($handle = $this->getLock()) === false) {
@@ -42,8 +44,9 @@ class Minz_ModelArray {
/**
* Sauve le tableau $array dans le fichier $filename
- **/
- protected function writeArray($array) {
+ * @param array<string,mixed> $array
+ */
+ protected function writeArray(array $array): bool {
if (file_put_contents($this->filename, "<?php\n return " . var_export($array, true) . ';', LOCK_EX) === false) {
throw new Minz_PermissionDeniedException($this->filename);
}
@@ -53,6 +56,7 @@ class Minz_ModelArray {
return true;
}
+ /** @return resource|false */
private function getLock() {
$handle = fopen($this->filename, 'r');
if ($handle === false) {
@@ -73,7 +77,8 @@ class Minz_ModelArray {
}
}
- private function releaseLock($handle) {
+ /** @param resource $handle */
+ private function releaseLock($handle): void {
flock($handle, LOCK_UN);
fclose($handle);
}
diff --git a/lib/Minz/Url.php b/lib/Minz/Url.php
index 0780a636f..efffb7f25 100644
--- a/lib/Minz/Url.php
+++ b/lib/Minz/Url.php
@@ -15,7 +15,7 @@ class Minz_Url {
* @param bool|string $absolute
* @return string Formatted URL
*/
- public static function display ($url = array (), $encoding = 'html', $absolute = false) {
+ public static function display($url = [], string $encoding = 'html', $absolute = false): string {
$isArray = is_array($url);
if ($isArray) {
@@ -60,7 +60,7 @@ class Minz_Url {
* @param string $encodage pour indiquer comment encoder les & (& ou &amp; pour html)
* @return string uri sous la forme ?key=value&key2=value2
*/
- private static function printUri($url, $encodage) {
+ private static function printUri($url, string $encodage): string {
$uri = '';
$separator = '?';
$anchor = '';
@@ -129,7 +129,8 @@ class Minz_Url {
return $url_checked;
}
- public static function serialize($url = []) {
+ /** @param array<string,string|array<string,string>> $url */
+ public static function serialize(array $url = []): string {
try {
return base64_encode(json_encode($url, JSON_THROW_ON_ERROR));
} catch (\Throwable $exception) {
@@ -137,19 +138,20 @@ class Minz_Url {
}
}
- public static function unserialize($url = '') {
+ /** @return array<string,string|array<string,string>> */
+ public static function unserialize(string $url = ''): array {
try {
- return json_decode(base64_decode($url), true, JSON_THROW_ON_ERROR);
+ return json_decode(base64_decode($url), true, JSON_THROW_ON_ERROR) ?? [];
} catch (\Throwable $exception) {
- return '';
+ return [];
}
}
/**
* Returns an array representing the URL as passed in the address bar
- * @return array URL representation
+ * @return array<string,string|array<string,string>> URL representation
*/
- public static function build () {
+ public static function build(): array {
$url = [
'c' => $_GET['c'] ?? Minz_Request::defaultControllerName(),
'a' => $_GET['a'] ?? Minz_Request::defaultActionName(),
@@ -170,7 +172,7 @@ class Minz_Url {
* @param string|int ...$args
* @return string|false
*/
-function _url ($controller, $action, ...$args) {
+function _url(string $controller, string $action, ...$args) {
$nb_args = count($args);
if ($nb_args % 2 !== 0) {
diff --git a/tests/phpstan-next.txt b/tests/phpstan-next.txt
index 6ecfe6b6c..9085f1cee 100644
--- a/tests/phpstan-next.txt
+++ b/tests/phpstan-next.txt
@@ -5,10 +5,8 @@
# find . -type d -name 'vendor' -prune -o -name '*.php' -exec sh -c 'vendor/bin/phpstan analyse --level 6 --memory-limit 512M {} >/dev/null 2>/dev/null || echo {}' \;
./app/Controllers/feedController.php
-./app/Controllers/updateController.php
./app/Controllers/userController.php
./app/install.php
-./app/Models/Auth.php
./app/Models/Category.php
./app/Models/CategoryDAO.php
./app/Models/ConfigurationSetter.php
@@ -16,7 +14,6 @@
./app/Models/Feed.php
./app/Models/FeedDAO.php
./app/Models/FilterAction.php
-./app/Models/FormAuth.php
./app/Models/Search.php
./app/Models/Share.php
./app/Models/TagDAO.php
@@ -28,16 +25,12 @@
./cli/i18n/I18nFile.php
./cli/i18n/I18nValue.php
./lib/http-conditional.php
-./lib/Minz/ActionController.php
./lib/Minz/Configuration.php
./lib/Minz/Dispatcher.php
-./lib/Minz/FrontController.php
./lib/Minz/Log.php
./lib/Minz/Migrator.php
-./lib/Minz/ModelArray.php
./lib/Minz/Paginator.php
./lib/Minz/Request.php
./lib/Minz/Session.php
./lib/Minz/Translate.php
-./lib/Minz/Url.php
./lib/Minz/View.php