From 9e8d69739f21e5ac85977d57a2a6c961e318c26e Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 10 Nov 2021 20:44:51 +0300 Subject: [PATCH] add two helper account access levels: - read only - can't subscribe to more feeds, feed updates are skipped - disabled - can't login define used access levels as UserHelper constants and refactor code to use them instead of hardcoded numbers --- backend.php | 11 +++++++---- classes/feeds.php | 7 +++++++ classes/handler/administrative.php | 2 +- classes/pref/feeds.php | 12 ++++++++++++ classes/pref/prefs.php | 16 ++++++++-------- classes/rpc.php | 7 ++++--- classes/rssutils.php | 19 +++++++++++++++++-- classes/userhelper.php | 19 +++++++++++++++++-- include/sessions.php | 9 ++++++++- js/App.js | 12 ++++++++++-- js/CommonDialogs.js | 15 ++++++++++++--- js/PrefUsers.js | 2 +- prefs.php | 2 +- 13 files changed, 105 insertions(+), 28 deletions(-) diff --git a/backend.php b/backend.php index bd24416f6..cb7daadad 100644 --- a/backend.php +++ b/backend.php @@ -86,10 +86,13 @@ 1440 => __("Daily"), 10080 => __("Weekly")); - $access_level_names = array( - 0 => __("User"), - 5 => __("Power User"), - 10 => __("Administrator")); + $access_level_names = [ + UserHelper::ACCESS_LEVEL_DISABLED => __("Disabled"), + UserHelper::ACCESS_LEVEL_READONLY => __("Read Only"), + UserHelper::ACCESS_LEVEL_USER => __("User"), + UserHelper::ACCESS_LEVEL_POWERUSER => __("Power User"), + UserHelper::ACCESS_LEVEL_ADMIN => __("Administrator") + ]; // shortcut syntax for plugin methods (?op=plugin--pmethod&...params) /* if (strpos($op, PluginHost::PUBLIC_METHOD_DELIMITER) !== false) { diff --git a/classes/feeds.php b/classes/feeds.php index 987123a21..cd2633ffb 100755 --- a/classes/feeds.php +++ b/classes/feeds.php @@ -1027,10 +1027,17 @@ class Feeds extends Handler_Protected { * 5 - Couldn't download the URL content. * 6 - Content is an invalid XML. * 7 - Error while creating feed database entry. + * 8 - Permission denied (ACCESS_LEVEL_READONLY). */ static function _subscribe($url, $cat_id = 0, $auth_login = '', $auth_pass = '') : array { + $user = ORM::for_table("ttrss_users")->find_one($_SESSION['uid']); + + if ($user && $user->access_level == UserHelper::ACCESS_LEVEL_READONLY) { + return ["code" => 8]; + } + $pdo = Db::pdo(); $url = UrlHelper::validate($url); diff --git a/classes/handler/administrative.php b/classes/handler/administrative.php index 52dfed8b7..f2f5b36ba 100644 --- a/classes/handler/administrative.php +++ b/classes/handler/administrative.php @@ -2,7 +2,7 @@ class Handler_Administrative extends Handler_Protected { function before($method) { if (parent::before($method)) { - if (($_SESSION["access_level"] ?? 0) >= 10) { + if (($_SESSION["access_level"] ?? 0) >= UserHelper::ACCESS_LEVEL_ADMIN) { return true; } } diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php index 95bbcd190..ac0874259 100755 --- a/classes/pref/feeds.php +++ b/classes/pref/feeds.php @@ -538,6 +538,8 @@ class Pref_Feeds extends Handler_Protected { $local_purge_intervals = [ T_nsprintf('%d day', '%d days', $purge_interval, $purge_interval) ]; } + $user = ORM::for_table("ttrss_users")->find_one($_SESSION["uid"]); + print json_encode([ "feed" => $row, "cats" => [ @@ -550,6 +552,9 @@ class Pref_Feeds extends Handler_Protected { "update" => $local_update_intervals, "purge" => $local_purge_intervals, ], + "user" => [ + "access_level" => $user->access_level + ], "lang" => [ "enabled" => Config::get(Config::DB_TYPE) == "pgsql", "default" => get_pref(Prefs::DEFAULT_SEARCH_LANGUAGE), @@ -1207,6 +1212,13 @@ class Pref_Feeds extends Handler_Protected { $login = clean($_REQUEST['login']); $pass = clean($_REQUEST['pass']); + $user = ORM::for_table('ttrss_users')->find_one($_SESSION["uid"]); + + // TODO: we should return some kind of error code to frontend here + if ($user->access_level == UserHelper::ACCESS_LEVEL_READONLY) { + return false; + } + $csth = $this->pdo->prepare("SELECT id FROM ttrss_feeds WHERE feed_url = ? AND owner_uid = ?"); diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php index c47a99469..c45d6d6ea 100644 --- a/classes/pref/prefs.php +++ b/classes/pref/prefs.php @@ -813,7 +813,7 @@ class Pref_Prefs extends Handler_Protected { usort($rv, function($a, $b) { return strcmp($a["name"], $b["name"]); }); - print json_encode(['plugins' => $rv, 'is_admin' => $_SESSION['access_level'] >= 10]); + print json_encode(['plugins' => $rv, 'is_admin' => $_SESSION['access_level'] >= UserHelper::ACCESS_LEVEL_ADMIN]); } function index_plugins() { @@ -890,7 +890,7 @@ class Pref_Prefs extends Handler_Protected { __("Reload"), "onclick" => "Helpers.Plugins.reload()"]) ?> - = 10) { ?> + = UserHelper::ACCESS_LEVEL_ADMIN) { ?>