diff options
| author | 2023-12-18 17:59:16 +0100 | |
|---|---|---|
| committer | 2023-12-18 17:59:16 +0100 | |
| commit | a80a5f48a16e7d232168a7aaa68e9a1804235ce1 (patch) | |
| tree | a515b88592629dea7e83b96e26e2452d3f98a98e /app/Controllers | |
| parent | 6bb45a87268157aab961a6a4a728d9a9bbe043b0 (diff) | |
Pass PHPStan level 8 (#5946)
* Pass PHPStan level 8
And prepare for PHPStan level 9 https://phpstan.org/user-guide/rule-levels
* Revert wrong replace in comment
* Fix PHPStan level 8
* Update PHPStan and other dev dependencies
* Remove obsolete comment
* noVariableVariables and towards bleedingEdge
https://github.com/phpstan/phpstan-strict-rules
https://phpstan.org/blog/what-is-bleeding-edge
* More bleedingEdge
* A bit more PHPStan level 9
* More PHPStan level 9
* Prepare for booleansInConditions
Ignore int and null
* Revert wrong line
* More fixes
* Fix keep_max_n_unread
* Stricter attribute functions
* Stricter callHooks and more PHPStan level 9
* More typing
* A tiny more
Diffstat (limited to 'app/Controllers')
| -rw-r--r-- | app/Controllers/apiController.php | 10 | ||||
| -rw-r--r-- | app/Controllers/authController.php | 63 | ||||
| -rw-r--r-- | app/Controllers/categoryController.php | 34 | ||||
| -rw-r--r-- | app/Controllers/configureController.php | 171 | ||||
| -rw-r--r-- | app/Controllers/entryController.php | 2 | ||||
| -rw-r--r-- | app/Controllers/extensionController.php | 10 | ||||
| -rw-r--r-- | app/Controllers/feedController.php | 43 | ||||
| -rw-r--r-- | app/Controllers/importExportController.php | 8 | ||||
| -rw-r--r-- | app/Controllers/indexController.php | 16 | ||||
| -rw-r--r-- | app/Controllers/javascriptController.php | 11 | ||||
| -rw-r--r-- | app/Controllers/subscriptionController.php | 28 | ||||
| -rw-r--r-- | app/Controllers/tagController.php | 6 | ||||
| -rw-r--r-- | app/Controllers/updateController.php | 6 | ||||
| -rw-r--r-- | app/Controllers/userController.php | 61 |
14 files changed, 244 insertions, 225 deletions
diff --git a/app/Controllers/apiController.php b/app/Controllers/apiController.php index 7568f9831..2d9fad535 100644 --- a/app/Controllers/apiController.php +++ b/app/Controllers/apiController.php @@ -13,18 +13,20 @@ class FreshRSS_api_Controller extends FreshRSS_ActionController { */ public static function updatePassword(string $apiPasswordPlain) { $username = Minz_User::name(); - $userConfig = FreshRSS_Context::$user_conf; + if ($username == null) { + return _t('feedback.api.password.failed'); + } $apiPasswordHash = FreshRSS_password_Util::hash($apiPasswordPlain); - $userConfig->apiPasswordHash = $apiPasswordHash; + FreshRSS_Context::userConf()->apiPasswordHash = $apiPasswordHash; $feverKey = FreshRSS_fever_Util::updateKey($username, $apiPasswordPlain); if (!$feverKey) { return _t('feedback.api.password.failed'); } - $userConfig->feverKey = $feverKey; - if ($userConfig->save()) { + FreshRSS_Context::userConf()->feverKey = $feverKey; + if (FreshRSS_Context::userConf()->save()) { return false; } else { return _t('feedback.api.password.failed'); diff --git a/app/Controllers/authController.php b/app/Controllers/authController.php index 06eca7d9e..85a722761 100644 --- a/app/Controllers/authController.php +++ b/app/Controllers/authController.php @@ -28,23 +28,26 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { $anon = Minz_Request::paramBoolean('anon_access'); $anon_refresh = Minz_Request::paramBoolean('anon_refresh'); - $auth_type = Minz_Request::paramString('auth_type') ?: 'none'; + $auth_type = Minz_Request::paramString('auth_type') ?: 'form'; $unsafe_autologin = Minz_Request::paramBoolean('unsafe_autologin'); $api_enabled = Minz_Request::paramBoolean('api_enabled'); - if ($anon !== FreshRSS_Context::$system_conf->allow_anonymous || - $auth_type !== FreshRSS_Context::$system_conf->auth_type || - $anon_refresh !== FreshRSS_Context::$system_conf->allow_anonymous_refresh || - $unsafe_autologin !== FreshRSS_Context::$system_conf->unsafe_autologin_enabled || - $api_enabled !== FreshRSS_Context::$system_conf->api_enabled) { - - // TODO: test values from form - FreshRSS_Context::$system_conf->auth_type = $auth_type; - FreshRSS_Context::$system_conf->allow_anonymous = $anon; - FreshRSS_Context::$system_conf->allow_anonymous_refresh = $anon_refresh; - FreshRSS_Context::$system_conf->unsafe_autologin_enabled = $unsafe_autologin; - FreshRSS_Context::$system_conf->api_enabled = $api_enabled; - - $ok &= FreshRSS_Context::$system_conf->save(); + if ($anon !== FreshRSS_Context::systemConf()->allow_anonymous || + $auth_type !== FreshRSS_Context::systemConf()->auth_type || + $anon_refresh !== FreshRSS_Context::systemConf()->allow_anonymous_refresh || + $unsafe_autologin !== FreshRSS_Context::systemConf()->unsafe_autologin_enabled || + $api_enabled !== FreshRSS_Context::systemConf()->api_enabled) { + + if (in_array($auth_type, ['form', 'http_auth', 'none'], true)) { + FreshRSS_Context::systemConf()->auth_type = $auth_type; + } else { + FreshRSS_Context::systemConf()->auth_type = 'form'; + } + FreshRSS_Context::systemConf()->allow_anonymous = $anon; + FreshRSS_Context::systemConf()->allow_anonymous_refresh = $anon_refresh; + FreshRSS_Context::systemConf()->unsafe_autologin_enabled = $unsafe_autologin; + FreshRSS_Context::systemConf()->api_enabled = $api_enabled; + + $ok &= FreshRSS_Context::systemConf()->save(); } invalidateHttpCache(); @@ -69,7 +72,7 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { Minz_Request::forward(['c' => 'index', 'a' => 'index'], true); } - $auth_type = FreshRSS_Context::$system_conf->auth_type; + $auth_type = FreshRSS_Context::systemConf()->auth_type; FreshRSS_Context::initUser(Minz_User::INTERNAL_USER, false); switch ($auth_type) { case 'form': @@ -114,7 +117,7 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { FreshRSS_View::prependTitle(_t('gen.auth.login') . ' · '); FreshRSS_View::appendScript(Minz_Url::display('/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js'))); - $limits = FreshRSS_Context::$system_conf->limits; + $limits = FreshRSS_Context::systemConf()->limits; $this->view->cookie_days = (int)round($limits['cookie_duration'] / 86400, 1); $isPOST = Minz_Request::isPost() && !Minz_Session::paramBoolean('POST_to_GET'); @@ -128,39 +131,39 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { usleep(random_int(100, 10000)); //Primitive mitigation of timing attacks, in μs FreshRSS_Context::initUser($username); - if (FreshRSS_Context::$user_conf == null) { + if (!FreshRSS_Context::hasUserConf()) { // Initialise the default user to be able to display the error page - FreshRSS_Context::initUser(FreshRSS_Context::$system_conf->default_user); + FreshRSS_Context::initUser(FreshRSS_Context::systemConf()->default_user); Minz_Error::error(403, _t('feedback.auth.login.invalid'), false); return; } - if (!FreshRSS_Context::$user_conf->enabled || FreshRSS_Context::$user_conf->passwordHash == '') { + if (!FreshRSS_Context::userConf()->enabled || FreshRSS_Context::userConf()->passwordHash == '') { usleep(random_int(100, 5000)); //Primitive mitigation of timing attacks, in μs Minz_Error::error(403, _t('feedback.auth.login.invalid'), false); return; } $ok = FreshRSS_FormAuth::checkCredentials( - $username, FreshRSS_Context::$user_conf->passwordHash, $nonce, $challenge + $username, FreshRSS_Context::userConf()->passwordHash, $nonce, $challenge ); if ($ok) { // Set session parameter to give access to the user. Minz_Session::_params([ Minz_User::CURRENT_USER => $username, - 'passwordHash' => FreshRSS_Context::$user_conf->passwordHash, + 'passwordHash' => FreshRSS_Context::userConf()->passwordHash, 'csrf' => false, ]); FreshRSS_Auth::giveAccess(); // Set cookie parameter if needed. if (Minz_Request::paramBoolean('keep_logged_in')) { - FreshRSS_FormAuth::makeCookie($username, FreshRSS_Context::$user_conf->passwordHash); + FreshRSS_FormAuth::makeCookie($username, FreshRSS_Context::userConf()->passwordHash); } else { FreshRSS_FormAuth::deleteCookie(); } - Minz_Translate::init(FreshRSS_Context::$user_conf->language); + Minz_Translate::init(FreshRSS_Context::userConf()->language); // All is good, go back to the original request or the index. $url = Minz_Url::unserialize(Minz_Request::paramString('original_request')); @@ -176,7 +179,7 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { Minz_Request::setBadNotification(_t('feedback.auth.login.invalid')); Minz_Request::forward(['c' => 'auth', 'a' => 'login'], false); } - } elseif (FreshRSS_Context::$system_conf->unsafe_autologin_enabled) { + } elseif (FreshRSS_Context::systemConf()->unsafe_autologin_enabled) { $username = Minz_Request::paramString('u'); $password = Minz_Request::paramString('p'); Minz_Request::_param('p'); @@ -188,11 +191,11 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { FreshRSS_FormAuth::deleteCookie(); FreshRSS_Context::initUser($username); - if (FreshRSS_Context::$user_conf == null) { + if (!FreshRSS_Context::hasUserConf()) { return; } - $s = FreshRSS_Context::$user_conf->passwordHash; + $s = FreshRSS_Context::userConf()->passwordHash; $ok = password_verify($password, $s); unset($password); if ($ok) { @@ -203,7 +206,7 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { ]); FreshRSS_Auth::giveAccess(); - Minz_Translate::init(FreshRSS_Context::$user_conf->language); + Minz_Translate::init(FreshRSS_Context::userConf()->language); Minz_Request::good(_t('feedback.auth.login.success'), ['c' => 'index', 'a' => 'index']); } else { @@ -242,8 +245,8 @@ class FreshRSS_auth_Controller extends FreshRSS_ActionController { } $this->view->show_tos_checkbox = file_exists(TOS_FILENAME); - $this->view->show_email_field = FreshRSS_Context::$system_conf->force_email_validation; - $this->view->preferred_language = Minz_Translate::getLanguage(null, Minz_Request::getPreferredLanguages(), FreshRSS_Context::$system_conf->language); + $this->view->show_email_field = FreshRSS_Context::systemConf()->force_email_validation; + $this->view->preferred_language = Minz_Translate::getLanguage(null, Minz_Request::getPreferredLanguages(), FreshRSS_Context::systemConf()->language); FreshRSS_View::prependTitle(_t('gen.auth.registration.title') . ' · '); } diff --git a/app/Controllers/categoryController.php b/app/Controllers/categoryController.php index daee1666a..780f03f02 100644 --- a/app/Controllers/categoryController.php +++ b/app/Controllers/categoryController.php @@ -33,7 +33,7 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { $url_redirect = ['c' => 'subscription', 'a' => 'add']; - $limits = FreshRSS_Context::$system_conf->limits; + $limits = FreshRSS_Context::systemConf()->limits; $this->view->categories = $catDAO->listCategories(false) ?: []; if (count($this->view->categories) >= $limits['max_categories']) { @@ -61,10 +61,10 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { $opml_url = checkUrl(Minz_Request::paramString('opml_url')); if ($opml_url != '') { $cat->_kind(FreshRSS_Category::KIND_DYNAMIC_OPML); - $cat->_attributes('opml_url', $opml_url); + $cat->_attribute('opml_url', $opml_url); } else { $cat->_kind(FreshRSS_Category::KIND_NORMAL); - $cat->_attributes('opml_url', null); + $cat->_attribute('opml_url', null); } if ($catDAO->addCategoryObject($cat)) { @@ -102,7 +102,7 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { $category->_filtersAction('read', Minz_Request::paramTextToArray('filteractions_read')); if (Minz_Request::paramBoolean('use_default_purge_options')) { - $category->_attributes('archiving', null); + $category->_attribute('archiving', null); } else { if (!Minz_Request::paramBoolean('enable_keep_max')) { $keepMax = false; @@ -117,7 +117,7 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { } else { $keepPeriod = false; } - $category->_attributes('archiving', [ + $category->_attribute('archiving', [ 'keep_period' => $keepPeriod, 'keep_max' => $keepMax, 'keep_min' => Minz_Request::paramInt('keep_min'), @@ -128,15 +128,15 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { } $position = Minz_Request::paramInt('position') ?: null; - $category->_attributes('position', $position); + $category->_attribute('position', $position); $opml_url = checkUrl(Minz_Request::paramString('opml_url')); if ($opml_url != '') { $category->_kind(FreshRSS_Category::KIND_DYNAMIC_OPML); - $category->_attributes('opml_url', $opml_url); + $category->_attribute('opml_url', $opml_url); } else { $category->_kind(FreshRSS_Category::KIND_NORMAL); - $category->_attributes('opml_url', null); + $category->_attribute('opml_url', null); } $values = [ @@ -190,9 +190,10 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { } // Remove related queries. - FreshRSS_Context::$user_conf->queries = remove_query_by_get( - 'c_' . $id, FreshRSS_Context::$user_conf->queries); - FreshRSS_Context::$user_conf->save(); + /** @var array<array{'get'?:string,'name'?:string,'order'?:string,'search'?:string,'state'?:int,'url'?:string}> $queries */ + $queries = remove_query_by_get('c_' . $id, FreshRSS_Context::userConf()->queries); + FreshRSS_Context::userConf()->queries = $queries; + FreshRSS_Context::userConf()->save(); Minz_Request::good(_t('feedback.sub.category.deleted'), $url_redirect); } @@ -230,10 +231,11 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { // Remove related queries foreach ($feeds as $feed) { - FreshRSS_Context::$user_conf->queries = remove_query_by_get( - 'f_' . $feed->id(), FreshRSS_Context::$user_conf->queries); + /** @var array<array{'get'?:string,'name'?:string,'order'?:string,'search'?:string,'state'?:int,'url'?:string}> */ + $queries = remove_query_by_get('f_' . $feed->id(), FreshRSS_Context::userConf()->queries); + FreshRSS_Context::userConf()->queries = $queries; } - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->save(); Minz_Request::good(_t('feedback.sub.category.emptied'), $url_redirect); } else { @@ -258,11 +260,13 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { $id = Minz_Request::paramInt('id'); if ($id === 0) { Minz_Request::bad(_t('feedback.sub.category.no_id'), $url_redirect); + return; } $category = $catDAO->searchById($id); if ($category === null) { Minz_Request::bad(_t('feedback.sub.category.not_exist'), $url_redirect); + return; } invalidateHttpCache(); @@ -288,7 +292,7 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController { $successes = 0; $errors = 0; $catDAO = FreshRSS_Factory::createCategoryDao(); - $categories = $catDAO->listCategoriesOrderUpdate(FreshRSS_Context::$user_conf->dynamic_opml_ttl_default ?? 86400); + $categories = $catDAO->listCategoriesOrderUpdate(FreshRSS_Context::userConf()->dynamic_opml_ttl_default ?? 86400); foreach ($categories as $category) { if ($category->refreshDynamicOpml()) { $successes++; diff --git a/app/Controllers/configureController.php b/app/Controllers/configureController.php index d7c087620..c52a5d23c 100644 --- a/app/Controllers/configureController.php +++ b/app/Controllers/configureController.php @@ -44,32 +44,32 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { */ public function displayAction(): void { if (Minz_Request::isPost()) { - FreshRSS_Context::$user_conf->language = Minz_Request::paramString('language') ?: 'en'; - FreshRSS_Context::$user_conf->timezone = Minz_Request::paramString('timezone'); - FreshRSS_Context::$user_conf->theme = Minz_Request::paramString('theme') ?: FreshRSS_Themes::$defaultTheme; - FreshRSS_Context::$user_conf->darkMode = Minz_Request::paramString('darkMode') ?: 'no'; - FreshRSS_Context::$user_conf->content_width = Minz_Request::paramString('content_width') ?: 'thin'; - FreshRSS_Context::$user_conf->topline_read = Minz_Request::paramBoolean('topline_read'); - FreshRSS_Context::$user_conf->topline_favorite = Minz_Request::paramBoolean('topline_favorite'); - FreshRSS_Context::$user_conf->topline_date = Minz_Request::paramBoolean('topline_date'); - FreshRSS_Context::$user_conf->topline_link = Minz_Request::paramBoolean('topline_link'); - FreshRSS_Context::$user_conf->topline_website = Minz_Request::paramString('topline_website'); - FreshRSS_Context::$user_conf->topline_thumbnail = Minz_Request::paramString('topline_thumbnail'); - FreshRSS_Context::$user_conf->topline_summary = Minz_Request::paramBoolean('topline_summary'); - FreshRSS_Context::$user_conf->topline_display_authors = Minz_Request::paramBoolean('topline_display_authors'); - FreshRSS_Context::$user_conf->bottomline_read = Minz_Request::paramBoolean('bottomline_read'); - FreshRSS_Context::$user_conf->bottomline_favorite = Minz_Request::paramBoolean('bottomline_favorite'); - FreshRSS_Context::$user_conf->bottomline_sharing = Minz_Request::paramBoolean('bottomline_sharing'); - FreshRSS_Context::$user_conf->bottomline_tags = Minz_Request::paramBoolean('bottomline_tags'); - FreshRSS_Context::$user_conf->bottomline_myLabels = Minz_Request::paramBoolean('bottomline_myLabels'); - FreshRSS_Context::$user_conf->bottomline_date = Minz_Request::paramBoolean('bottomline_date'); - FreshRSS_Context::$user_conf->bottomline_link = Minz_Request::paramBoolean('bottomline_link'); - FreshRSS_Context::$user_conf->show_nav_buttons = Minz_Request::paramBoolean('show_nav_buttons'); - FreshRSS_Context::$user_conf->html5_notif_timeout = Minz_Request::paramInt('html5_notif_timeout'); - FreshRSS_Context::$user_conf->save(); - - Minz_Session::_param('language', FreshRSS_Context::$user_conf->language); - Minz_Translate::reset(FreshRSS_Context::$user_conf->language); + FreshRSS_Context::userConf()->language = Minz_Request::paramString('language') ?: 'en'; + FreshRSS_Context::userConf()->timezone = Minz_Request::paramString('timezone'); + FreshRSS_Context::userConf()->theme = Minz_Request::paramString('theme') ?: FreshRSS_Themes::$defaultTheme; + FreshRSS_Context::userConf()->darkMode = Minz_Request::paramString('darkMode') ?: 'no'; + FreshRSS_Context::userConf()->content_width = Minz_Request::paramString('content_width') ?: 'thin'; + FreshRSS_Context::userConf()->topline_read = Minz_Request::paramBoolean('topline_read'); + FreshRSS_Context::userConf()->topline_favorite = Minz_Request::paramBoolean('topline_favorite'); + FreshRSS_Context::userConf()->topline_date = Minz_Request::paramBoolean('topline_date'); + FreshRSS_Context::userConf()->topline_link = Minz_Request::paramBoolean('topline_link'); + FreshRSS_Context::userConf()->topline_website = Minz_Request::paramString('topline_website'); + FreshRSS_Context::userConf()->topline_thumbnail = Minz_Request::paramString('topline_thumbnail'); + FreshRSS_Context::userConf()->topline_summary = Minz_Request::paramBoolean('topline_summary'); + FreshRSS_Context::userConf()->topline_display_authors = Minz_Request::paramBoolean('topline_display_authors'); + FreshRSS_Context::userConf()->bottomline_read = Minz_Request::paramBoolean('bottomline_read'); + FreshRSS_Context::userConf()->bottomline_favorite = Minz_Request::paramBoolean('bottomline_favorite'); + FreshRSS_Context::userConf()->bottomline_sharing = Minz_Request::paramBoolean('bottomline_sharing'); + FreshRSS_Context::userConf()->bottomline_tags = Minz_Request::paramBoolean('bottomline_tags'); + FreshRSS_Context::userConf()->bottomline_myLabels = Minz_Request::paramBoolean('bottomline_myLabels'); + FreshRSS_Context::userConf()->bottomline_date = Minz_Request::paramBoolean('bottomline_date'); + FreshRSS_Context::userConf()->bottomline_link = Minz_Request::paramBoolean('bottomline_link'); + FreshRSS_Context::userConf()->show_nav_buttons = Minz_Request::paramBoolean('show_nav_buttons'); + FreshRSS_Context::userConf()->html5_notif_timeout = Minz_Request::paramInt('html5_notif_timeout'); + FreshRSS_Context::userConf()->save(); + + Minz_Session::_param('language', FreshRSS_Context::userConf()->language); + Minz_Translate::reset(FreshRSS_Context::userConf()->language); invalidateHttpCache(); Minz_Request::good(_t('feedback.conf.updated'), [ 'c' => 'configure', 'a' => 'display' ]); @@ -111,27 +111,31 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { */ public function readingAction(): void { if (Minz_Request::isPost()) { - FreshRSS_Context::$user_conf->posts_per_page = Minz_Request::paramInt('posts_per_page') ?: 10; - FreshRSS_Context::$user_conf->view_mode = Minz_Request::paramString('view_mode', true) ?: 'normal'; - FreshRSS_Context::$user_conf->default_view = Minz_Request::paramString('default_view') ?: 'adaptive'; - FreshRSS_Context::$user_conf->show_fav_unread = Minz_Request::paramBoolean('show_fav_unread'); - FreshRSS_Context::$user_conf->auto_load_more = Minz_Request::paramBoolean('auto_load_more'); - FreshRSS_Context::$user_conf->display_posts = Minz_Request::paramBoolean('display_posts'); - FreshRSS_Context::$user_conf->display_categories = Minz_Request::paramString('display_categories') ?: 'active'; - FreshRSS_Context::$user_conf->show_tags = Minz_Request::paramString('show_tags') ?: '0'; - FreshRSS_Context::$user_conf->show_tags_max = Minz_Request::paramInt('show_tags_max'); - FreshRSS_Context::$user_conf->show_author_date = Minz_Request::paramString('show_author_date') ?: '0'; - FreshRSS_Context::$user_conf->show_feed_name = Minz_Request::paramString('show_feed_name') ?: 't'; - FreshRSS_Context::$user_conf->hide_read_feeds = Minz_Request::paramBoolean('hide_read_feeds'); - FreshRSS_Context::$user_conf->onread_jump_next = Minz_Request::paramBoolean('onread_jump_next'); - FreshRSS_Context::$user_conf->lazyload = Minz_Request::paramBoolean('lazyload'); - FreshRSS_Context::$user_conf->sides_close_article = Minz_Request::paramBoolean('sides_close_article'); - FreshRSS_Context::$user_conf->sticky_post = Minz_Request::paramBoolean('sticky_post'); - FreshRSS_Context::$user_conf->reading_confirm = Minz_Request::paramBoolean('reading_confirm'); - FreshRSS_Context::$user_conf->auto_remove_article = Minz_Request::paramBoolean('auto_remove_article'); - FreshRSS_Context::$user_conf->mark_updated_article_unread = Minz_Request::paramBoolean('mark_updated_article_unread'); - FreshRSS_Context::$user_conf->sort_order = Minz_Request::paramString('sort_order') ?: 'DESC'; - FreshRSS_Context::$user_conf->mark_when = [ + FreshRSS_Context::userConf()->posts_per_page = Minz_Request::paramInt('posts_per_page') ?: 10; + FreshRSS_Context::userConf()->view_mode = Minz_Request::paramString('view_mode', true) ?: 'normal'; + FreshRSS_Context::userConf()->default_view = Minz_Request::paramString('default_view') ?: 'adaptive'; + FreshRSS_Context::userConf()->show_fav_unread = Minz_Request::paramBoolean('show_fav_unread'); + FreshRSS_Context::userConf()->auto_load_more = Minz_Request::paramBoolean('auto_load_more'); + FreshRSS_Context::userConf()->display_posts = Minz_Request::paramBoolean('display_posts'); + FreshRSS_Context::userConf()->display_categories = Minz_Request::paramString('display_categories') ?: 'active'; + FreshRSS_Context::userConf()->show_tags = Minz_Request::paramString('show_tags') ?: '0'; + FreshRSS_Context::userConf()->show_tags_max = Minz_Request::paramInt('show_tags_max'); + FreshRSS_Context::userConf()->show_author_date = Minz_Request::paramString('show_author_date') ?: '0'; + FreshRSS_Context::userConf()->show_feed_name = Minz_Request::paramString('show_feed_name') ?: 't'; + FreshRSS_Context::userConf()->hide_read_feeds = Minz_Request::paramBoolean('hide_read_feeds'); + FreshRSS_Context::userConf()->onread_jump_next = Minz_Request::paramBoolean('onread_jump_next'); + FreshRSS_Context::userConf()->lazyload = Minz_Request::paramBoolean('lazyload'); + FreshRSS_Context::userConf()->sides_close_article = Minz_Request::paramBoolean('sides_close_article'); + FreshRSS_Context::userConf()->sticky_post = Minz_Request::paramBoolean('sticky_post'); + FreshRSS_Context::userConf()->reading_confirm = Minz_Request::paramBoolean('reading_confirm'); + FreshRSS_Context::userConf()->auto_remove_article = Minz_Request::paramBoolean('auto_remove_article'); + FreshRSS_Context::userConf()->mark_updated_article_unread = Minz_Request::paramBoolean('mark_updated_article_unread'); + if (in_array(Minz_Request::paramString('sort_order'), ['ASC', 'DESC'], true)) { + FreshRSS_Context::userConf()->sort_order = Minz_Request::paramString('sort_order'); + } else { + FreshRSS_Context::userConf()->sort_order = 'DESC'; + } + FreshRSS_Context::userConf()->mark_when = [ 'article' => Minz_Request::paramBoolean('mark_open_article'), 'gone' => Minz_Request::paramBoolean('read_upon_gone'), 'max_n_unread' => Minz_Request::paramBoolean('enable_keep_max_n_unread') ? Minz_Request::paramInt('keep_max_n_unread') : false, @@ -142,8 +146,8 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { 'site' => Minz_Request::paramBoolean('mark_open_site'), 'focus' => Minz_Request::paramBoolean('mark_focus'), ]; - FreshRSS_Context::$user_conf->_filtersAction('read', Minz_Request::paramTextToArray('filteractions_read')); - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->_filtersAction('read', Minz_Request::paramTextToArray('filteractions_read')); + FreshRSS_Context::userConf()->save(); invalidateHttpCache(); Minz_Request::good(_t('feedback.conf.updated'), [ 'c' => 'configure', 'a' => 'reading' ]); @@ -168,8 +172,8 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { if (Minz_Request::isPost()) { $params = $_POST; - FreshRSS_Context::$user_conf->sharing = $params['share']; - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->sharing = $params['share']; + FreshRSS_Context::userConf()->save(); invalidateHttpCache(); Minz_Request::good(_t('feedback.conf.updated'), [ 'c' => 'configure', 'a' => 'integration' ]); @@ -199,8 +203,8 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { $default = Minz_Configuration::load(FRESHRSS_PATH . '/config-user.default.php'); $shortcuts = $default['shortcuts']; } - FreshRSS_Context::$user_conf->shortcuts = array_map('trim', $shortcuts); - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->shortcuts = array_map('trim', $shortcuts); + FreshRSS_Context::userConf()->save(); invalidateHttpCache(); Minz_Request::good(_t('feedback.conf.shortcuts_updated'), ['c' => 'configure', 'a' => 'shortcut']); @@ -237,8 +241,8 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { $keepPeriod = false; } - FreshRSS_Context::$user_conf->ttl_default = Minz_Request::paramInt('ttl_default') ?: FreshRSS_Feed::TTL_DEFAULT; - FreshRSS_Context::$user_conf->archiving = [ + FreshRSS_Context::userConf()->ttl_default = Minz_Request::paramInt('ttl_default') ?: FreshRSS_Feed::TTL_DEFAULT; + FreshRSS_Context::userConf()->archiving = [ 'keep_period' => $keepPeriod, 'keep_max' => $keepMax, 'keep_min' => Minz_Request::paramInt('keep_min_default'), @@ -246,9 +250,9 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { 'keep_labels' => Minz_Request::paramBoolean('keep_labels'), 'keep_unreads' => Minz_Request::paramBoolean('keep_unreads'), ]; - FreshRSS_Context::$user_conf->keep_history_default = null; //Legacy < FreshRSS 1.15 - FreshRSS_Context::$user_conf->old_entries = null; //Legacy < FreshRSS 1.15 - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->keep_history_default = null; //Legacy < FreshRSS 1.15 + FreshRSS_Context::userConf()->old_entries = null; //Legacy < FreshRSS 1.15 + FreshRSS_Context::userConf()->save(); invalidateHttpCache(); Minz_Request::good(_t('feedback.conf.updated'), [ 'c' => 'configure', 'a' => 'archiving' ]); @@ -259,8 +263,8 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { 'keep_period_count' => '3', 'keep_period_unit' => 'P1M', ]; - if (!empty(FreshRSS_Context::$user_conf->archiving['keep_period'])) { - $keepPeriod = FreshRSS_Context::$user_conf->archiving['keep_period']; + if (!empty(FreshRSS_Context::userConf()->archiving['keep_period'])) { + $keepPeriod = FreshRSS_Context::userConf()->archiving['keep_period']; if (preg_match('/^PT?(?P<count>\d+)[YMWDH]$/', $keepPeriod, $matches)) { $volatile = [ 'enable_keep_period' => true, @@ -269,7 +273,7 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { ]; } } - FreshRSS_Context::$user_conf->volatile = $volatile; + FreshRSS_Context::userConf()->volatile = $volatile; $entryDAO = FreshRSS_Factory::createEntryDao(); $this->view->nb_total = $entryDAO->count(); @@ -316,13 +320,13 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { } $queries[$key] = (new FreshRSS_UserQuery($query, $feed_dao, $category_dao, $tag_dao))->toArray(); } - FreshRSS_Context::$user_conf->queries = $queries; - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->queries = $queries; + FreshRSS_Context::userConf()->save(); Minz_Request::good(_t('feedback.conf.updated'), [ 'c' => 'configure', 'a' => 'queries' ]); } else { $this->view->queries = []; - foreach (FreshRSS_Context::$user_conf->queries as $key => $query) { + foreach (FreshRSS_Context::userConf()->queries as $key => $query) { $this->view->queries[intval($key)] = new FreshRSS_UserQuery($query, $feed_dao, $category_dao, $tag_dao); } } @@ -354,7 +358,7 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { } $id = Minz_Request::paramInt('id'); - if (Minz_Request::paramTernary('id') === null || empty(FreshRSS_Context::$user_conf->queries[$id])) { + if (Minz_Request::paramTernary('id') === null || empty(FreshRSS_Context::userConf()->queries[$id])) { Minz_Error::error(404); return; } @@ -363,7 +367,7 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { $feed_dao = FreshRSS_Factory::createFeedDao(); $tag_dao = FreshRSS_Factory::createTagDao(); - $query = new FreshRSS_UserQuery(FreshRSS_Context::$user_conf->queries[$id], $feed_dao, $category_dao, $tag_dao); + $query = new FreshRSS_UserQuery(FreshRSS_Context::userConf()->queries[$id], $feed_dao, $category_dao, $tag_dao); $this->view->query = $query; $this->view->queryId = $id; $this->view->categories = $category_dao->listCategories(false) ?: []; @@ -371,7 +375,6 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { $this->view->tags = $tag_dao->listTags() ?: []; if (Minz_Request::isPost()) { - /** @var array<string,string|array<string,string>> $params */ $params = array_filter(Minz_Request::paramArray('query')); $queryParams = []; if (!empty($params['get']) && is_string($params['get'])) { @@ -393,10 +396,10 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { $queryParams['name'] = $name; $queryParams['url'] = Minz_Url::display(['params' => $queryParams]); - $queries = FreshRSS_Context::$user_conf->queries; + $queries = FreshRSS_Context::userConf()->queries; $queries[$id] = (new FreshRSS_UserQuery($queryParams, $feed_dao, $category_dao, $tag_dao))->toArray(); - FreshRSS_Context::$user_conf->queries = $queries; - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->queries = $queries; + FreshRSS_Context::userConf()->save(); Minz_Request::good(_t('feedback.conf.updated'), [ 'c' => 'configure', 'a' => 'queries', 'params' => ['id' => (string)$id] ]); } @@ -409,15 +412,15 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { */ public function deleteQueryAction(): void { $id = Minz_Request::paramInt('id'); - if (Minz_Request::paramTernary('id') === null || empty(FreshRSS_Context::$user_conf->queries[$id])) { + if (Minz_Request::paramTernary('id') === null || empty(FreshRSS_Context::userConf()->queries[$id])) { Minz_Error::error(404); return; } - $queries = FreshRSS_Context::$user_conf->queries; + $queries = FreshRSS_Context::userConf()->queries; unset($queries[$id]); - FreshRSS_Context::$user_conf->queries = $queries; - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->queries = $queries; + FreshRSS_Context::userConf()->save(); Minz_Request::good(_t('feedback.conf.updated'), [ 'c' => 'configure', 'a' => 'queries' ]); } @@ -434,7 +437,7 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { $feed_dao = FreshRSS_Factory::createFeedDao(); $tag_dao = FreshRSS_Factory::createTagDao(); $queries = []; - foreach (FreshRSS_Context::$user_conf->queries as $key => $query) { + foreach (FreshRSS_Context::userConf()->queries as $key => $query) { $queries[$key] = (new FreshRSS_UserQuery($query, $feed_dao, $category_dao, $tag_dao))->toArray(); } $params = $_GET; @@ -443,8 +446,8 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { $params['name'] = _t('conf.query.number', count($queries) + 1); $queries[] = (new FreshRSS_UserQuery($params, $feed_dao, $category_dao, $tag_dao))->toArray(); - FreshRSS_Context::$user_conf->queries = $queries; - FreshRSS_Context::$user_conf->save(); + FreshRSS_Context::userConf()->queries = $queries; + FreshRSS_Context::userConf()->save(); Minz_Request::good(_t('feedback.conf.query_created', $params['name']), [ 'c' => 'configure', 'a' => 'queries' ]); } @@ -473,17 +476,17 @@ class FreshRSS_configure_Controller extends FreshRSS_ActionController { } if (Minz_Request::isPost()) { - $limits = FreshRSS_Context::$system_conf->limits; + $limits = FreshRSS_Context::systemConf()->limits; $limits['max_registrations'] = Minz_Request::paramInt('max-registrations') ?: 1; $limits['max_feeds'] = Minz_Request::paramInt('max-feeds') ?: 16384; $limits['max_categories'] = Minz_Request::paramInt('max-categories') ?: 16384; $limits['cookie_duration'] = Minz_Request::paramInt('cookie-duration') ?: FreshRSS_Auth::DEFAULT_COOKIE_DURATION; - FreshRSS_Context::$system_conf->limits = $limits; - FreshRSS_Context::$system_conf->title = Minz_Request::paramString('instance-name') ?: 'FreshRSS'; - FreshRSS_Context::$system_conf->auto_update_url = Minz_Request::paramString('auto-update-url'); - FreshRSS_Context::$system_conf->force_email_validation = Minz_Request::paramBoolean('force-email-validation'); - FreshRSS_Context::$system_conf->base_url = Minz_Request::paramString('base-url'); - FreshRSS_Context::$system_conf->save(); + FreshRSS_Context::systemConf()->limits = $limits; + FreshRSS_Context::systemConf()->title = Minz_Request::paramString('instance-name') ?: 'FreshRSS'; + FreshRSS_Context::systemConf()->auto_update_url = Minz_Request::paramString('auto-update-url'); + FreshRSS_Context::systemConf()->force_email_validation = Minz_Request::paramBoolean('force-email-validation'); + FreshRSS_Context::systemConf()->base_url = Minz_Request::paramString('base-url'); + FreshRSS_Context::systemConf()->save(); invalidateHttpCache(); diff --git a/app/Controllers/entryController.php b/app/Controllers/entryController.php index 1ce490ea1..c30c6b6fa 100644 --- a/app/Controllers/entryController.php +++ b/app/Controllers/entryController.php @@ -209,7 +209,7 @@ class FreshRSS_entry_Controller extends FreshRSS_ActionController { $feedDAO->beginTransaction(); foreach ($feeds as $feed) { - $nb_total += $feed->cleanOldEntries(); + $nb_total += ($feed->cleanOldEntries() ?: 0); } $feedDAO->updateCachedValues(); diff --git a/app/Controllers/extensionController.php b/app/Controllers/extensionController.php index 0158b2f76..9cfc6ff68 100644 --- a/app/Controllers/extensionController.php +++ b/app/Controllers/extensionController.php @@ -54,7 +54,7 @@ class FreshRSS_extension_Controller extends FreshRSS_ActionController { // fetch the list as an array /** @var array<string,mixed> $list*/ $list = json_decode($json, true); - if (empty($list)) { + if (empty($list) || !is_array($list)) { Minz_Log::warning('Failed to convert extension file list'); return []; } @@ -136,9 +136,9 @@ class FreshRSS_extension_Controller extends FreshRSS_ActionController { $conf = null; if ($type === 'system') { - $conf = FreshRSS_Context::$system_conf; + $conf = FreshRSS_Context::systemConf(); } elseif ($type === 'user') { - $conf = FreshRSS_Context::$user_conf; + $conf = FreshRSS_Context::userConf(); } $res = $ext->install(); @@ -198,9 +198,9 @@ class FreshRSS_extension_Controller extends FreshRSS_ActionController { $conf = null; if ($type === 'system') { - $conf = FreshRSS_Context::$system_conf; + $conf = FreshRSS_Context::systemConf(); } elseif ($type === 'user') { - $conf = FreshRSS_Context::$user_conf; + $conf = FreshRSS_Context::userConf(); } $res = $ext->uninstall(); diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php index aec39587e..cc560a224 100644 --- a/app/Controllers/feedController.php +++ b/app/Controllers/feedController.php @@ -15,11 +15,11 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { // Token is useful in the case that anonymous refresh is forbidden // and CRON task cannot be used with php command so the user can // set a CRON task to refresh his feeds by using token inside url - $token = FreshRSS_Context::$user_conf->token; + $token = FreshRSS_Context::userConf()->token; $token_param = Minz_Request::paramString('token'); $token_is_ok = ($token != '' && $token == $token_param); $action = Minz_Request::actionName(); - $allow_anonymous_refresh = FreshRSS_Context::$system_conf->allow_anonymous_refresh; + $allow_anonymous_refresh = FreshRSS_Context::systemConf()->allow_anonymous_refresh; if ($action !== 'actualize' || !($allow_anonymous_refresh || $token_is_ok)) { Minz_Error::error(403); @@ -45,7 +45,7 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { $url = trim($url); - /** @var string|null $url */ + /** @var string|null $urlHooked */ $urlHooked = Minz_ExtensionManager::callHook('check_url_before_add', $url); if ($urlHooked === null) { throw new FreshRSS_FeedNotAdded_Exception($url); @@ -72,7 +72,7 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { $feed->_name($title); } $feed->_kind($kind); - $feed->_attributes('', $attributes); + $feed->_attributes($attributes); $feed->_httpAuth($http_auth); $feed->_categoryId($cat_id); switch ($kind) { @@ -151,7 +151,7 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { 'params' => [], ]; - $limits = FreshRSS_Context::$system_conf->limits; + $limits = FreshRSS_Context::systemConf()->limits; $this->view->feeds = $feedDAO->listFeeds(); if (count($this->view->feeds) >= $limits['max_feeds']) { Minz_Request::bad(_t('feedback.sub.feed.over_max', $limits['max_feeds']), $url_redirect); @@ -377,7 +377,7 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { } // WebSub (PubSubHubbub) support - $pubsubhubbubEnabledGeneral = FreshRSS_Context::$system_conf->pubsubhubbub_enabled; + $pubsubhubbubEnabledGeneral = FreshRSS_Context::systemConf()->pubsubhubbub_enabled; $pshbMinAge = time() - (3600 * 24); //TODO: Make a configuration. $updated_feeds = 0; @@ -406,14 +406,14 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { $mtime = $feed->cacheModifiedTime() ?: 0; $ttl = $feed->ttl(); if ($ttl === FreshRSS_Feed::TTL_DEFAULT) { - $ttl = FreshRSS_Context::$user_conf->ttl_default; + $ttl = FreshRSS_Context::userConf()->ttl_default; } if ($simplePiePush === null && $feed_id === null && (time() <= $feed->lastUpdate() + $ttl)) { //Too early to refresh from source, but check whether the feed was updated by another user $ε = 10; // negligible offset errors in seconds if ($mtime <= 0 || $feed->lastUpdate() + $ε >= $mtime || - time() + $ε >= $mtime + FreshRSS_Context::$system_conf->limits['cache_duration']) { // is cache still valid? + time() + $ε >= $mtime + FreshRSS_Context::systemConf()->limits['cache_duration']) { // is cache still valid? continue; //Nothing newer from other users } Minz_Log::debug('Feed ' . $feed->url(false) . ' was updated at ' . date('c', $feed->lastUpdate()) . @@ -475,17 +475,20 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { $nbMarkedUnread = 0; if (count($newGuids) > 0) { - $titlesAsRead = []; - $readWhenSameTitleInFeed = $feed->attributes('read_when_same_title_in_feed'); - if ($readWhenSameTitleInFeed == false) { - $readWhenSameTitleInFeed = FreshRSS_Context::$user_conf->mark_when['same_title_in_feed']; + if ($feed->attributeBoolean('read_when_same_title_in_feed') === null) { + $readWhenSameTitleInFeed = (int)FreshRSS_Context::userConf()->mark_when['same_title_in_feed']; + } elseif ($feed->attributeBoolean('read_when_same_title_in_feed') === false) { + $readWhenSameTitleInFeed = 0; + } else { + $readWhenSameTitleInFeed = $feed->attributeInt('read_when_same_title_in_feed') ?? 0; } if ($readWhenSameTitleInFeed > 0) { - /** @var array<string,bool> $titlesAsRead*/ - $titlesAsRead = array_flip($feedDAO->listTitles($feed->id(), (int)$readWhenSameTitleInFeed)); + $titlesAsRead = array_flip($feedDAO->listTitles($feed->id(), $readWhenSameTitleInFeed)); + } else { + $titlesAsRead = []; } - $mark_updated_article_unread = $feed->attributes('mark_updated_article_unread') ?? FreshRSS_Context::$user_conf->mark_updated_article_unread; + $mark_updated_article_unread = $feed->attributeBoolean('mark_updated_article_unread') ?? FreshRSS_Context::userConf()->mark_updated_article_unread; // For this feed, check existing GUIDs already in database. $existingHashForGuids = $entryDAO->listHashForFeedGuids($feed->id(), $newGuids) ?: []; @@ -828,10 +831,10 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { // TODO: Delete old favicon // Remove related queries - FreshRSS_Context::$user_conf->queries = remove_query_by_get( - 'f_' . $feed_id, FreshRSS_Context::$user_conf->queries); - FreshRSS_Context::$user_conf->save(); - + /** @var array<array{'get'?:string,'name'?:string,'order'?:string,'search'?:string,'state'?:int,'url'?:string}> $queries */ + $queries = remove_query_by_get('f_' . $feed_id, FreshRSS_Context::userConf()->queries); + FreshRSS_Context::userConf()->queries = $queries; + FreshRSS_Context::userConf()->save(); return true; } return false; @@ -939,7 +942,7 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { //We need another DB connection in parallel for unbuffered streaming Minz_ModelPdo::$usesSharedPdo = false; - if (FreshRSS_Context::$system_conf->db['type'] === 'mysql') { + if (FreshRSS_Context::systemConf()->db['type'] === 'mysql') { // Second parallel connection for unbuffered streaming: MySQL $entryDAO2 = FreshRSS_Factory::createEntryDao(); } else { diff --git a/app/Controllers/importExportController.php b/app/Controllers/importExportController.php index 6d37cc465..0de75d0ff 100644 --- a/app/Controllers/importExportController.php +++ b/app/Controllers/importExportController.php @@ -289,7 +289,7 @@ class FreshRSS_importExport_Controller extends FreshRSS_ActionController { */ private function importJson(string $article_file, bool $starred = false): bool { $article_object = json_decode($article_file, true); - if ($article_object == null) { + if (!is_array($article_object)) { if (FreshRSS_Context::$isCli) { fwrite(STDERR, 'FreshRSS error trying to import a non-JSON file' . "\n"); } else { @@ -299,14 +299,14 @@ class FreshRSS_importExport_Controller extends FreshRSS_ActionController { } $items = $article_object['items'] ?? $article_object; - $mark_as_read = FreshRSS_Context::$user_conf->mark_when['reception'] ? 1 : 0; + $mark_as_read = FreshRSS_Context::userConf()->mark_when['reception'] ? 1 : 0; $error = false; $article_to_feed = []; $nb_feeds = count($this->feedDAO->listFeeds()); $newFeedGuids = []; - $limits = FreshRSS_Context::$system_conf->limits; + $limits = FreshRSS_Context::systemConf()->limits; // First, we check feeds of articles are in DB (and add them if needed). foreach ($items as &$item) { @@ -601,7 +601,7 @@ class FreshRSS_importExport_Controller extends FreshRSS_ActionController { return; } - $username = Minz_User::name(); + $username = Minz_User::name() ?? '_'; $export_service = new FreshRSS_Export_Service($username); $export_opml = Minz_Request::paramBoolean('export_opml'); diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php index a1c25e649..a83307714 100644 --- a/app/Controllers/indexController.php +++ b/app/Controllers/indexController.php @@ -10,7 +10,7 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController { * This action only redirect on the default view mode (normal or global) */ public function indexAction(): void { - $preferred_output = FreshRSS_Context::$user_conf->view_mode; + $preferred_output = FreshRSS_Context::userConf()->view_mode; Minz_Request::forward([ 'c' => 'index', 'a' => $preferred_output, @@ -21,7 +21,7 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController { * This action displays the normal view of FreshRSS. */ public function normalAction(): void { - $allow_anonymous = FreshRSS_Context::$system_conf->allow_anonymous; + $allow_anonymous = FreshRSS_Context::systemConf()->allow_anonymous; if (!FreshRSS_Auth::hasAccess() && !$allow_anonymous) { Minz_Request::forward(['c' => 'auth', 'a' => 'login']); return; @@ -107,7 +107,7 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController { * This action displays the global view of FreshRSS. */ public function globalAction(): void { - $allow_anonymous = FreshRSS_Context::$system_conf->allow_anonymous; + $allow_anonymous = FreshRSS_Context::systemConf()->allow_anonymous; if (!FreshRSS_Auth::hasAccess() && !$allow_anonymous) { Minz_Request::forward(['c' => 'auth', 'a' => 'login']); return; @@ -143,8 +143,8 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController { * This action displays the RSS feed of FreshRSS. */ public function rssAction(): void { - $allow_anonymous = FreshRSS_Context::$system_conf->allow_anonymous; - $token = FreshRSS_Context::$user_conf->token; + $allow_anonymous = FreshRSS_Context::systemConf()->allow_anonymous; + $token = FreshRSS_Context::userConf()->token; $token_param = Minz_Request::paramString('token'); $token_is_ok = ($token != '' && $token === $token_param); @@ -176,8 +176,8 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController { } public function opmlAction(): void { - $allow_anonymous = FreshRSS_Context::$system_conf->allow_anonymous; - $token = FreshRSS_Context::$user_conf->token; + $allow_anonymous = FreshRSS_Context::systemConf()->allow_anonymous; + $token = FreshRSS_Context::userConf()->token; $token_param = Minz_Request::paramString('token'); $token_is_ok = ($token != '' && $token === $token_param); @@ -259,7 +259,7 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController { $date_min = 0; if (FreshRSS_Context::$sinceHours) { $date_min = time() - (FreshRSS_Context::$sinceHours * 3600); - $limit = FreshRSS_Context::$user_conf->max_posts_per_rss; + $limit = FreshRSS_Context::userConf()->max_posts_per_rss; } foreach ($entryDAO->listWhere( diff --git a/app/Controllers/javascriptController.php b/app/Controllers/javascriptController.php index 6dd36dd72..a9c4993df 100644 --- a/app/Controllers/javascriptController.php +++ b/app/Controllers/javascriptController.php @@ -21,10 +21,10 @@ class FreshRSS_javascript_Controller extends FreshRSS_ActionController { Minz_Session::_param('actualize_feeds', false); $catDAO = FreshRSS_Factory::createCategoryDao(); - $this->view->categories = $catDAO->listCategoriesOrderUpdate(FreshRSS_Context::$user_conf->dynamic_opml_ttl_default); + $this->view->categories = $catDAO->listCategoriesOrderUpdate(FreshRSS_Context::userConf()->dynamic_opml_ttl_default); $feedDAO = FreshRSS_Factory::createFeedDao(); - $this->view->feeds = $feedDAO->listFeedsOrderUpdate(FreshRSS_Context::$user_conf->ttl_default); + $this->view->feeds = $feedDAO->listFeedsOrderUpdate(FreshRSS_Context::userConf()->ttl_default); } public function nbUnreadsPerFeedAction(): void { @@ -48,10 +48,11 @@ class FreshRSS_javascript_Controller extends FreshRSS_ActionController { header('Pragma: no-cache'); $user = $_GET['user'] ?? ''; - if (FreshRSS_Context::initUser($user)) { + FreshRSS_Context::initUser($user); + if (!FreshRSS_Context::hasUserConf()) { try { - $salt = FreshRSS_Context::$system_conf->salt; - $s = FreshRSS_Context::$user_conf->passwordHash; + $salt = FreshRSS_Context::systemConf()->salt; + $s = FreshRSS_Context::userConf()->passwordHash; if (strlen($s) >= 60) { //CRYPT_BLOWFISH Salt: "$2a$", a two digit cost parameter, "$", and 22 characters from the alphabet "./0-9A-Za-z". $this->view->salt1 = substr($s, 0, 29); diff --git a/app/Controllers/subscriptionController.php b/app/Controllers/subscriptionController.php index 21c5abb30..07e0fdcf8 100644 --- a/app/Controllers/subscriptionController.php +++ b/app/Controllers/subscriptionController.php @@ -118,13 +118,13 @@ class FreshRSS_subscription_Controller extends FreshRSS_ActionController { $feed->_ttl(Minz_Request::paramInt('ttl') ?: FreshRSS_Feed::TTL_DEFAULT); $feed->_mute(Minz_Request::paramBoolean('mute')); - $feed->_attributes('read_upon_gone', Minz_Request::paramTernary('read_upon_gone')); - $feed->_attributes('mark_updated_article_unread', Minz_Request::paramTernary('mark_updated_article_unread')); - $feed->_attributes('read_upon_reception', Minz_Request::paramTernary('read_upon_reception')); - $feed->_attributes('clear_cache', Minz_Request::paramTernary('clear_cache')); + $feed->_attribute('read_upon_gone', Minz_Request::paramTernary('read_upon_gone')); + $feed->_attribute('mark_updated_article_unread', Minz_Request::paramTernary('mark_updated_article_unread')); + $feed->_attribute('read_upon_reception', Minz_Request::paramTernary('read_upon_reception')); + $feed->_attribute('clear_cache', Minz_Request::paramTernary('clear_cache')); $keep_max_n_unread = Minz_Request::paramTernary('keep_max_n_unread') === true ? Minz_Request::paramInt('keep_max_n_unread') : null; - $feed->_attributes('keep_max_n_unread', $keep_max_n_unread >= 0 ? $keep_max_n_unread : null); + $feed->_attribute('keep_max_n_unread', $keep_max_n_unread >= 0 ? $keep_max_n_unread : null); $read_when_same_title_in_feed = Minz_Request::paramString('read_when_same_title_in_feed'); if ($read_when_same_title_in_feed === '') { @@ -135,7 +135,7 @@ class FreshRSS_subscription_Controller extends FreshRSS_ActionController { $read_when_same_title_in_feed = false; } } - $feed->_attributes('read_when_same_title_in_feed', $read_when_same_title_in_feed); + $feed->_attribute('read_when_same_title_in_feed', $read_when_same_title_in_feed); $cookie = Minz_Request::paramString('curl_params_cookie'); $cookie_file = Minz_Request::paramBoolean('curl_params_cookiefile'); @@ -163,16 +163,16 @@ class FreshRSS_subscription_Controller extends FreshRSS_ActionController { if ($useragent !== '') { $opts[CURLOPT_USERAGENT] = $useragent; } - $feed->_attributes('curl_params', empty($opts) ? null : $opts); + $feed->_attribute('curl_params', empty($opts) ? null : $opts); - $feed->_attributes('content_action', Minz_Request::paramString('content_action', true) ?: 'replace'); + $feed->_attribute('content_action', Minz_Request::paramString('content_action', true) ?: 'replace'); - $feed->_attributes('ssl_verify', Minz_Request::paramTernary('ssl_verify')); + $feed->_attribute('ssl_verify', Minz_Request::paramTernary('ssl_verify')); $timeout = Minz_Request::paramInt('timeout'); - $feed->_attributes('timeout', $timeout > 0 ? $timeout : null); + $feed->_attribute('timeout', $timeout > 0 ? $timeout : null); if (Minz_Request::paramBoolean('use_default_purge_options')) { - $feed->_attributes('archiving', null); + $feed->_attribute('archiving', null); } else { if (Minz_Request::paramBoolean('enable_keep_max')) { $keepMax = Minz_Request::paramInt('keep_max') ?: FreshRSS_Feed::ARCHIVING_RETENTION_COUNT_LIMIT; @@ -187,7 +187,7 @@ class FreshRSS_subscription_Controller extends FreshRSS_ActionController { } else { $keepPeriod = false; } - $feed->_attributes('archiving', [ + $feed->_attribute('archiving', [ 'keep_period' => $keepPeriod, 'keep_max' => $keepMax, 'keep_min' => Minz_Request::paramInt('keep_min'), @@ -223,10 +223,10 @@ class FreshRSS_subscription_Controller extends FreshRSS_ActionController { if (Minz_Request::paramString('xPathItemUid') != '') $xPathSettings['itemUid'] = Minz_Request::paramString('xPathItemUid', true); if (!empty($xPathSettings)) - $feed->_attributes('xpath', $xPathSettings); + $feed->_attribute('xpath', $xPathSettings); } - $feed->_attributes('path_entries_filter', Minz_Request::paramString('path_entries_filter', true)); + $feed->_attribute('path_entries_filter', Minz_Request::paramString('path_entries_filter', true)); $values = [ 'name' => Minz_Request::paramString('name'), diff --git a/app/Controllers/tagController.php b/app/Controllers/tagController.php index 13909d522..190df32b1 100644 --- a/app/Controllers/tagController.php +++ b/app/Controllers/tagController.php @@ -36,7 +36,7 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController { $id_tag = Minz_Request::paramInt('id_tag'); $name_tag = Minz_Request::paramString('name_tag'); $id_entry = Minz_Request::paramString('id_entry'); - $checked = Minz_Request::paramTernary('checked'); + $checked = Minz_Request::paramBoolean('checked'); if ($id_entry != '') { $tagDAO = FreshRSS_Factory::createTagDao(); if ($id_tag == 0 && $name_tag !== '' && $checked) { @@ -85,7 +85,7 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController { } public function getTagsForEntryAction(): void { - if (!FreshRSS_Auth::hasAccess() && !FreshRSS_Context::$system_conf->allow_anonymous) { + if (!FreshRSS_Auth::hasAccess() && !FreshRSS_Context::systemConf()->allow_anonymous) { Minz_Error::error(403); } $this->view->_layout(null); @@ -136,7 +136,7 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController { $tagDAO = FreshRSS_Factory::createTagDao(); $sourceTag = $tagDAO->searchById($sourceId); - $sourceName = $sourceTag === null ? null : $sourceTag->name(); + $sourceName = $sourceTag === null ? '' : $sourceTag->name(); $targetTag = $tagDAO->searchByName($targetName); if ($targetTag === null) { // There is no existing tag with the same target name diff --git a/app/Controllers/updateController.php b/app/Controllers/updateController.php index 43860a50c..78f28e493 100644 --- a/app/Controllers/updateController.php +++ b/app/Controllers/updateController.php @@ -194,7 +194,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController { return; } } else { - $auto_update_url = FreshRSS_Context::$system_conf->auto_update_url . '/?v=' . FRESHRSS_VERSION; + $auto_update_url = FreshRSS_Context::systemConf()->auto_update_url . '/?v=' . FRESHRSS_VERSION; Minz_Log::debug('HTTP GET ' . $auto_update_url); $curlResource = curl_init($auto_update_url); @@ -257,7 +257,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController { } public function applyAction(): void { - if (FreshRSS_Context::$system_conf->disable_update || !file_exists(UPDATE_FILENAME) || !touch(FRESHRSS_PATH . '/index.html')) { + if (FreshRSS_Context::systemConf()->disable_update || !file_exists(UPDATE_FILENAME) || !touch(FRESHRSS_PATH . '/index.html')) { Minz_Request::forward(['c' => 'update'], true); } @@ -270,7 +270,7 @@ class FreshRSS_update_Controller extends FreshRSS_ActionController { $res = do_post_update(); } - Minz_ExtensionManager::callHook('post_update'); + Minz_ExtensionManager::callHookVoid('post_update'); if ($res === true) { @unlink(UPDATE_FILENAME); diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php index 6766182c1..b3fccac24 100644 --- a/app/Controllers/userController.php +++ b/app/Controllers/userController.php @@ -29,8 +29,8 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { if ($email !== null && $userConfig->mail_login !== $email) { $userConfig->mail_login = $email; - if (FreshRSS_Context::$system_conf->force_email_validation) { - $salt = FreshRSS_Context::$system_conf->salt; + if (FreshRSS_Context::systemConf()->force_email_validation) { + $salt = FreshRSS_Context::systemConf()->salt; $userConfig->email_validation_token = sha1($salt . uniqid('' . mt_rand(), true)); $mailer = new FreshRSS_User_Mailer(); $mailer->send_email_need_validation($user, $userConfig); @@ -88,7 +88,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { Minz_Error::error(403); } - $email_not_verified = FreshRSS_Context::$user_conf->email_validation_token != ''; + $email_not_verified = FreshRSS_Context::userConf()->email_validation_token != ''; $this->view->disable_aside = false; if ($email_not_verified) { $this->view->_layout('simple'); @@ -99,17 +99,15 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { FreshRSS_View::appendScript(Minz_Url::display('/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js'))); - if (Minz_Request::isPost()) { - $system_conf = FreshRSS_Context::$system_conf; - $user_config = FreshRSS_Context::$user_conf; - $old_email = $user_config->mail_login; + if (Minz_Request::isPost() && Minz_User::name() != null) { + $old_email = FreshRSS_Context::userConf()->mail_login; $email = Minz_Request::paramString('email'); $passwordPlain = Minz_Request::paramString('newPasswordPlain', true); Minz_Request::_param('newPasswordPlain'); //Discard plain-text password ASAP $_POST['newPasswordPlain'] = ''; - if ($system_conf->force_email_validation && empty($email)) { + if (FreshRSS_Context::systemConf()->force_email_validation && empty($email)) { Minz_Request::bad( _t('user.email.feedback.required'), ['c' => 'user', 'a' => 'profile'] @@ -132,10 +130,10 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { ] ); - Minz_Session::_param('passwordHash', FreshRSS_Context::$user_conf->passwordHash); + Minz_Session::_param('passwordHash', FreshRSS_Context::userConf()->passwordHash); if ($ok) { - if ($system_conf->force_email_validation && $email !== $old_email) { + if (FreshRSS_Context::systemConf()->force_email_validation && $email !== $old_email) { Minz_Request::good(_t('feedback.profile.updated'), ['c' => 'user', 'a' => 'validateEmail']); } elseif ($passwordPlain == '') { Minz_Request::good(_t('feedback.profile.updated'), ['c' => 'user', 'a' => 'profile']); @@ -202,7 +200,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { } } - $this->view->show_email_field = FreshRSS_Context::$system_conf->force_email_validation; + $this->view->show_email_field = FreshRSS_Context::systemConf()->force_email_validation; $this->view->current_user = Minz_Request::paramString('u'); foreach (listUsers() as $user) { @@ -286,8 +284,6 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { } if (Minz_Request::isPost()) { - $system_conf = FreshRSS_Context::$system_conf; - $new_user_name = Minz_Request::paramString('new_user_name'); $email = Minz_Request::paramString('new_user_email'); $passwordPlain = Minz_Request::paramString('new_user_passwordPlain', true); @@ -320,7 +316,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { $tos_enabled = file_exists(TOS_FILENAME); $accept_tos = Minz_Request::paramBoolean('accept_tos'); - if ($system_conf->force_email_validation && empty($email)) { + if (FreshRSS_Context::systemConf()->force_email_validation && empty($email)) { Minz_Request::bad( _t('user.email.feedback.required'), $badRedirectUrl @@ -342,7 +338,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { } $ok = self::createUser($new_user_name, $email, $passwordPlain, [ - 'language' => Minz_Request::paramString('new_user_language') ?: FreshRSS_Context::$user_conf->language, + 'language' => Minz_Request::paramString('new_user_language') ?: FreshRSS_Context::userConf()->language, 'timezone' => Minz_Request::paramString('new_user_timezone'), 'is_admin' => Minz_Request::paramBoolean('new_user_is_admin'), 'enabled' => true, @@ -357,12 +353,16 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { // get started immediately. if ($ok && !FreshRSS_Auth::hasAccess('admin')) { $user_conf = get_user_configuration($new_user_name); - Minz_Session::_params([ - Minz_User::CURRENT_USER => $new_user_name, - 'passwordHash' => $user_conf->passwordHash, - 'csrf' => false, - ]); - FreshRSS_Auth::giveAccess(); + if ($user_conf !== null) { + Minz_Session::_params([ + Minz_User::CURRENT_USER => $new_user_name, + 'passwordHash' => $user_conf->passwordHash, + 'csrf' => false, + ]); + FreshRSS_Auth::giveAccess(); + } else { + $ok = false; + } } if ($ok) { @@ -379,7 +379,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { public static function deleteUser(string $username): bool { $ok = self::checkUsername($username); if ($ok) { - $default_user = FreshRSS_Context::$system_conf->default_user; + $default_user = FreshRSS_Context::systemConf()->default_user; $ok &= (strcasecmp($username, $default_user) !== 0); //It is forbidden to delete the default user } $user_data = join_path(DATA_PATH, 'users', $username); @@ -415,7 +415,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { * It returns 403 if user isn’t logged in and `username` param isn’t passed. */ public function validateEmailAction(): void { - if (!FreshRSS_Context::$system_conf->force_email_validation) { + if (!FreshRSS_Context::systemConf()->force_email_validation) { Minz_Error::error(404); } @@ -428,7 +428,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { if ($username !== '') { $user_config = get_user_configuration($username); } elseif (FreshRSS_Auth::hasAccess()) { - $user_config = FreshRSS_Context::$user_conf; + $user_config = FreshRSS_Context::userConf(); } else { Minz_Error::error(403); return; @@ -489,9 +489,8 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { } $username = Minz_User::name(); - $user_config = FreshRSS_Context::$user_conf; - if ($user_config->email_validation_token === '') { + if (FreshRSS_Context::userConf()->email_validation_token === '') { Minz_Request::forward([ 'c' => 'index', 'a' => 'index', @@ -499,7 +498,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { } $mailer = new FreshRSS_User_Mailer(); - $ok = $mailer->send_email_need_validation($username, $user_config); + $ok = $username != null && $mailer->send_email_need_validation($username, FreshRSS_Context::userConf()); $redirect_url = ['c' => 'user', 'a' => 'validateEmail']; if ($ok) { @@ -541,7 +540,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { $challenge = Minz_Request::paramString('challenge'); $ok &= FreshRSS_FormAuth::checkCredentials( - $username, FreshRSS_Context::$user_conf->passwordHash, + $username, FreshRSS_Context::userConf()->passwordHash, $nonce, $challenge ); } @@ -596,6 +595,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { if (null === $userConfig = get_user_configuration($username)) { Minz_Error::error(500); + return; } $userConfig->_param($field, $value); @@ -639,6 +639,9 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { $databaseDAO = FreshRSS_Factory::createDatabaseDAO($username); $userConfiguration = get_user_configuration($username); + if ($userConfiguration === null) { + throw new Exception('Error loading user configuration!'); + } return [ 'feed_count' => $feedDAO->count(), @@ -649,7 +652,7 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { 'enabled' => $userConfiguration->enabled, 'is_admin' => $userConfiguration->is_admin, 'last_user_activity' => date('c', FreshRSS_UserDAO::mtime($username)) ?: '', - 'is_default' => FreshRSS_Context::$system_conf->default_user === $username, + 'is_default' => FreshRSS_Context::systemConf()->default_user === $username, ]; } } |
