mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-24 12:07:23 +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'];
|
public static array $permissionMustHaveClass = ['defaultclass', 'staffmem'];
|
||||||
|
|
||||||
const CLASS_PERMISSION_SET_KEY_PREFIX = 'nexus_class_permissions_';
|
const DIRECT_PERMISSION_CACHE_KEY_PREFIX = 'nexus_direct_permissions_';
|
||||||
const DIRECT_PERMISSION_SET_KEY_PREFIX = 'nexus_direct_permissions_';
|
const ROLE_PERMISSION_CACHE_KEY_PREFIX = 'nexus_role_permissions_';
|
||||||
const ROLE_PERMISSION_SET_KEY_PREFIX = 'nexus_role_permissions_';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get setting autoload = yes with cache
|
* get setting autoload = yes with cache
|
||||||
|
|||||||
@@ -365,49 +365,39 @@ class ToolRepository extends BaseRepository
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function listUserClassPermissions($uid): array
|
public static function listUserClassPermissions($class): array
|
||||||
{
|
{
|
||||||
$userInfo = get_user_row($uid);
|
|
||||||
$settings = Setting::get('authority');
|
$settings = Setting::get('authority');
|
||||||
$result = [];
|
$result = [];
|
||||||
foreach ($settings as $permission => $minClass) {
|
foreach ($settings as $permission => $minClass) {
|
||||||
if ($minClass >= User::CLASS_PEASANT && $minClass <= $userInfo['class']) {
|
if ($minClass >= User::CLASS_PEASANT && $minClass <= $class) {
|
||||||
$result[] = $permission;
|
$result[] = $permission;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function listUserAllPermissions($uid, $class = null): array
|
public static function listUserAllPermissions($uid): array
|
||||||
{
|
{
|
||||||
static $uidPermissionsCached = [];
|
static $uidPermissionsCached = [];
|
||||||
if (isset($uidPermissionsCached[$uid])) {
|
if (isset($uidPermissionsCached[$uid])) {
|
||||||
return $uidPermissionsCached[$uid];
|
return $uidPermissionsCached[$uid];
|
||||||
}
|
}
|
||||||
$log = "uid: $uid";
|
$log = "uid: $uid";
|
||||||
if ($class === null) {
|
$userInfo = get_user_row($uid);
|
||||||
$userInfo = get_user_row($uid);
|
$class = $userInfo['class'];
|
||||||
$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;
|
|
||||||
|
|
||||||
//Role permission, use push mechanism, already prepared, see plugin role saving
|
//Class permission
|
||||||
$setKeys = apply_filter("role_permission_set_keys", $setKeys, $uid);
|
$classPermissions = self::listUserClassPermissions($class);
|
||||||
|
|
||||||
//Direct permission, use pull mechanism
|
//Role permission
|
||||||
$key = Setting::DIRECT_PERMISSION_SET_KEY_PREFIX . $uid;
|
$rolePermissions = apply_filter("user_role_permissions", [], $uid);
|
||||||
$setKeys[] = $key;
|
|
||||||
if (!$redis->exists($key)) {
|
//Direct permission
|
||||||
$log .= ", init direct permissions";
|
$directPermissions = apply_filter("user_direct_permissions", [], $uid);
|
||||||
$userPermissionsArr = apply_filter("user_direct_permissions", [], $uid);
|
|
||||||
$redis->sAddArray($key, $userPermissionsArr);
|
$allPermissions = array_merge($classPermissions, $rolePermissions, $directPermissions);
|
||||||
}
|
do_log("$log, allPermissions: " . json_encode($allPermissions));
|
||||||
$allPermissions = $redis->sUnion($setKeys);
|
|
||||||
do_log("$log, allSetKeys: " . json_encode($setKeys) . ", allPermissions: " . json_encode($allPermissions));
|
|
||||||
$result = array_combine($allPermissions, $allPermissions);
|
$result = array_combine($allPermissions, $allPermissions);
|
||||||
$uidPermissionsCached[$uid] = $result;
|
$uidPermissionsCached[$uid] = $result;
|
||||||
return $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}_content");
|
||||||
\Nexus\Database\NexusDB::cache_del("user_{$uid}_roles");
|
\Nexus\Database\NexusDB::cache_del("user_{$uid}_roles");
|
||||||
\Nexus\Database\NexusDB::cache_del("announce_user_passkey_$uid");//announce.php
|
\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) {
|
if ($passkey) {
|
||||||
\Nexus\Database\NexusDB::cache_del('user_passkey_'.$passkey.'_content');//announce.php
|
\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);
|
\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
|
function user_can($permission, $fail = false, $uid = 0, $class = null): bool
|
||||||
{
|
{
|
||||||
$log = "permission: $permission, fail: $fail, user: $uid";
|
$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;
|
$userCanCached[$permission][$uid] = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
$userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid, $class);
|
$userAllPermissions = \App\Repositories\ToolRepository::listUserAllPermissions($uid);
|
||||||
$result = isset($userAllPermissions[$permission]);
|
$result = isset($userAllPermissions[$permission]);
|
||||||
if ($sequence == 0) {
|
if ($sequence == 0) {
|
||||||
$sequence++;
|
$sequence++;
|
||||||
|
|||||||
@@ -245,7 +245,6 @@ class Update extends Install
|
|||||||
/**
|
/**
|
||||||
* @since 1.7.23
|
* @since 1.7.23
|
||||||
*/
|
*/
|
||||||
build_class_permission_cache();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+5
-4
@@ -22,18 +22,19 @@ jQuery(document).ready(function () {
|
|||||||
return {left, top}
|
return {left, top}
|
||||||
}
|
}
|
||||||
var previewEle = jQuery('#nexus-preview')
|
var previewEle = jQuery('#nexus-preview')
|
||||||
var imgEle
|
var imgEle, selector = '.preview'
|
||||||
jQuery(".preview").hover(function (e) {
|
jQuery("body").on("mouseover", selector, function (e) {
|
||||||
imgEle = jQuery(this);
|
imgEle = jQuery(this);
|
||||||
let position = getPosition(e, imgEle)
|
let position = getPosition(e, imgEle)
|
||||||
let src = imgEle.attr("src")
|
let src = imgEle.attr("src")
|
||||||
if (src) {
|
if (src) {
|
||||||
previewEle.attr("src", src).css(position).fadeIn("fast");
|
previewEle.attr("src", src).css(position).fadeIn("fast");
|
||||||
}
|
}
|
||||||
}, function (e) {
|
}).on("mouseout", selector, function (e) {
|
||||||
previewEle.fadeOut("fast");
|
previewEle.fadeOut("fast");
|
||||||
}).on("mousemove", function (e) {
|
}).on("mousemove", selector, function (e) {
|
||||||
let position = getPosition(e, imgEle)
|
let position = getPosition(e, imgEle)
|
||||||
previewEle.css(position)
|
previewEle.css(position)
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -237,7 +237,6 @@ elseif ($action == 'savesettings_authority') // save user authority
|
|||||||
saveSetting('authority', $AUTHORITY);
|
saveSetting('authority', $AUTHORITY);
|
||||||
$actiontime = date("F j, Y, g:i a");
|
$actiontime = date("F j, Y, g:i a");
|
||||||
write_log("Tracker USER AUTHORITY settings updated by {$CURUSER['username']}. $actiontime",'mod');
|
write_log("Tracker USER AUTHORITY settings updated by {$CURUSER['username']}. $actiontime",'mod');
|
||||||
build_class_permission_cache();
|
|
||||||
go_back();
|
go_back();
|
||||||
}
|
}
|
||||||
elseif ($action == 'savesettings_tweak') // save tweak
|
elseif ($action == 'savesettings_tweak') // save tweak
|
||||||
|
|||||||
Reference in New Issue
Block a user