From f91a7597bd247e665f3ee3697e9ee96d6dd97a7d Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Wed, 24 Aug 2022 13:36:14 +0800 Subject: [PATCH] user_can() cancel use set cache --- app/Models/Setting.php | 5 ++-- app/Repositories/ToolRepository.php | 40 +++++++++++------------------ include/globalfunctions.php | 23 ++--------------- nexus/Install/Update.php | 1 - public/js/nexus.js | 9 ++++--- public/settings.php | 1 - 6 files changed, 24 insertions(+), 55 deletions(-) diff --git a/app/Models/Setting.php b/app/Models/Setting.php index da6f0cda..9fc7fc2e 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -15,9 +15,8 @@ class Setting extends NexusModel public static array $permissionMustHaveClass = ['defaultclass', 'staffmem']; - const CLASS_PERMISSION_SET_KEY_PREFIX = 'nexus_class_permissions_'; - const DIRECT_PERMISSION_SET_KEY_PREFIX = 'nexus_direct_permissions_'; - const ROLE_PERMISSION_SET_KEY_PREFIX = 'nexus_role_permissions_'; + const DIRECT_PERMISSION_CACHE_KEY_PREFIX = 'nexus_direct_permissions_'; + const ROLE_PERMISSION_CACHE_KEY_PREFIX = 'nexus_role_permissions_'; /** * get setting autoload = yes with cache diff --git a/app/Repositories/ToolRepository.php b/app/Repositories/ToolRepository.php index d01306ab..f73360d0 100644 --- a/app/Repositories/ToolRepository.php +++ b/app/Repositories/ToolRepository.php @@ -365,49 +365,39 @@ class ToolRepository extends BaseRepository return $result; } - public static function listUserClassPermissions($uid): array + public static function listUserClassPermissions($class): array { - $userInfo = get_user_row($uid); $settings = Setting::get('authority'); $result = []; foreach ($settings as $permission => $minClass) { - if ($minClass >= User::CLASS_PEASANT && $minClass <= $userInfo['class']) { + if ($minClass >= User::CLASS_PEASANT && $minClass <= $class) { $result[] = $permission; } } return $result; } - public static function listUserAllPermissions($uid, $class = null): array + public static function listUserAllPermissions($uid): array { static $uidPermissionsCached = []; if (isset($uidPermissionsCached[$uid])) { return $uidPermissionsCached[$uid]; } $log = "uid: $uid"; - if ($class === null) { - $userInfo = get_user_row($uid); - $class = $userInfo['class']; - } - $redis = NexusDB::redis(); - $setKeys = []; - //Class permission, use push mechanism, already prepared,see settings.php - $key = Setting::CLASS_PERMISSION_SET_KEY_PREFIX . $class; - $setKeys[] = $key; + $userInfo = get_user_row($uid); + $class = $userInfo['class']; - //Role permission, use push mechanism, already prepared, see plugin role saving - $setKeys = apply_filter("role_permission_set_keys", $setKeys, $uid); + //Class permission + $classPermissions = self::listUserClassPermissions($class); - //Direct permission, use pull mechanism - $key = Setting::DIRECT_PERMISSION_SET_KEY_PREFIX . $uid; - $setKeys[] = $key; - if (!$redis->exists($key)) { - $log .= ", init direct permissions"; - $userPermissionsArr = apply_filter("user_direct_permissions", [], $uid); - $redis->sAddArray($key, $userPermissionsArr); - } - $allPermissions = $redis->sUnion($setKeys); - do_log("$log, allSetKeys: " . json_encode($setKeys) . ", allPermissions: " . json_encode($allPermissions)); + //Role permission + $rolePermissions = apply_filter("user_role_permissions", [], $uid); + + //Direct permission + $directPermissions = apply_filter("user_direct_permissions", [], $uid); + + $allPermissions = array_merge($classPermissions, $rolePermissions, $directPermissions); + do_log("$log, allPermissions: " . json_encode($allPermissions)); $result = array_combine($allPermissions, $allPermissions); $uidPermissionsCached[$uid] = $result; return $result; diff --git a/include/globalfunctions.php b/include/globalfunctions.php index 523b2403..335940a5 100644 --- a/include/globalfunctions.php +++ b/include/globalfunctions.php @@ -958,7 +958,7 @@ function clear_user_cache($uid, $passkey = '') \Nexus\Database\NexusDB::cache_del("user_{$uid}_content"); \Nexus\Database\NexusDB::cache_del("user_{$uid}_roles"); \Nexus\Database\NexusDB::cache_del("announce_user_passkey_$uid");//announce.php - \Nexus\Database\NexusDB::cache_del(\App\Models\Setting::DIRECT_PERMISSION_SET_KEY_PREFIX . $uid); + \Nexus\Database\NexusDB::cache_del(\App\Models\Setting::DIRECT_PERMISSION_CACHE_KEY_PREFIX . $uid); if ($passkey) { \Nexus\Database\NexusDB::cache_del('user_passkey_'.$passkey.'_content');//announce.php } @@ -977,25 +977,6 @@ function clear_staff_message_cache() \App\Repositories\MessageRepository::updateStaffMessageCountCache(false); } -function build_class_permission_cache() -{ - $redis = \Nexus\Database\NexusDB::redis(); - $results = []; - $settings = get_setting_from_db("authority"); - foreach (\App\Models\User::$classes as $class => $info) { - foreach ($settings as $permission => $minClass) { - if ($class >= $minClass) { - $results[$class][] = $permission; - } - } - } - foreach ($results as $class => $permissions) { - $classKey = \App\Models\Setting::CLASS_PERMISSION_SET_KEY_PREFIX . $class; - $redis->del($classKey); - $redis->sAddArray($classKey, $permissions); - } -} - function user_can($permission, $fail = false, $uid = 0, $class = null): bool { $log = "permission: $permission, fail: $fail, user: $uid"; @@ -1022,7 +1003,7 @@ function user_can($permission, $fail = false, $uid = 0, $class = null): bool $userCanCached[$permission][$uid] = true; return true; } - $userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid, $class); + $userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid); $result = isset($userAllPermissions[$permission]); if ($sequence == 0) { $sequence++; diff --git a/nexus/Install/Update.php b/nexus/Install/Update.php index 7a8d06d7..54bd9569 100644 --- a/nexus/Install/Update.php +++ b/nexus/Install/Update.php @@ -245,7 +245,6 @@ class Update extends Install /** * @since 1.7.23 */ - build_class_permission_cache(); } diff --git a/public/js/nexus.js b/public/js/nexus.js index 444cbfb3..bd0ea98f 100644 --- a/public/js/nexus.js +++ b/public/js/nexus.js @@ -22,18 +22,19 @@ jQuery(document).ready(function () { return {left, top} } var previewEle = jQuery('#nexus-preview') - var imgEle - jQuery(".preview").hover(function (e) { + var imgEle, selector = '.preview' + jQuery("body").on("mouseover", selector, function (e) { imgEle = jQuery(this); let position = getPosition(e, imgEle) let src = imgEle.attr("src") if (src) { previewEle.attr("src", src).css(position).fadeIn("fast"); } - }, function (e) { + }).on("mouseout", selector, function (e) { previewEle.fadeOut("fast"); - }).on("mousemove", function (e) { + }).on("mousemove", selector, function (e) { let position = getPosition(e, imgEle) previewEle.css(position) }) + }) diff --git a/public/settings.php b/public/settings.php index 13d1e7b5..0c267e34 100644 --- a/public/settings.php +++ b/public/settings.php @@ -237,7 +237,6 @@ elseif ($action == 'savesettings_authority') // save user authority saveSetting('authority', $AUTHORITY); $actiontime = date("F j, Y, g:i a"); write_log("Tracker USER AUTHORITY settings updated by {$CURUSER['username']}. $actiontime",'mod'); - build_class_permission_cache(); go_back(); } elseif ($action == 'savesettings_tweak') // save tweak