aboutsummaryrefslogtreecommitdiff
path: root/app/Controllers
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2023-12-18 17:59:16 +0100
committerGravatar GitHub <noreply@github.com> 2023-12-18 17:59:16 +0100
commita80a5f48a16e7d232168a7aaa68e9a1804235ce1 (patch)
treea515b88592629dea7e83b96e26e2452d3f98a98e /app/Controllers
parent6bb45a87268157aab961a6a4a728d9a9bbe043b0 (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.php10
-rw-r--r--app/Controllers/authController.php63
-rw-r--r--app/Controllers/categoryController.php34
-rw-r--r--app/Controllers/configureController.php171
-rw-r--r--app/Controllers/entryController.php2
-rw-r--r--app/Controllers/extensionController.php10
-rw-r--r--app/Controllers/feedController.php43
-rw-r--r--app/Controllers/importExportController.php8
-rw-r--r--app/Controllers/indexController.php16
-rw-r--r--app/Controllers/javascriptController.php11
-rw-r--r--app/Controllers/subscriptionController.php28
-rw-r--r--app/Controllers/tagController.php6
-rw-r--r--app/Controllers/updateController.php6
-rw-r--r--app/Controllers/userController.php61
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,
];
}
}