mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-03 14:10:57 +08:00
user_can() cancel use set cache
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -245,7 +245,6 @@ class Update extends Install
|
||||
/**
|
||||
* @since 1.7.23
|
||||
*/
|
||||
build_class_permission_cache();
|
||||
|
||||
}
|
||||
|
||||
|
||||
9
public/js/nexus.js
vendored
9
public/js/nexus.js
vendored
@@ -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)
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user