From b79d20150d33c59f741f1f6a24920bf54b4006d5 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Tue, 21 Jun 2022 15:14:11 +0000 Subject: [PATCH] fix query that manages inherited roles from a faculty role assignment, fixes #1180 Closes #1180 Merge request studip/studip!699 --- lib/plugins/db/RolePersistence.class.php | 40 ++++++++++++------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/plugins/db/RolePersistence.class.php b/lib/plugins/db/RolePersistence.class.php index 88abce32b5d..60b0b6507f7 100644 --- a/lib/plugins/db/RolePersistence.class.php +++ b/lib/plugins/db/RolePersistence.class.php @@ -13,7 +13,9 @@ */ class RolePersistence { - const ROLES_CACHE_KEY = 'plugins/rolepersistence/roles'; + const ROLES_CACHE_KEY = 'roles'; + const USER_ROLES_CACHE_KEY = 'roles/user'; + const PLUGIN_ROLES_CACHE_KEY = 'roles/plugin'; /** * Returns all available roles. @@ -181,9 +183,7 @@ class RolePersistence public static function getAssignedRoleInstitutes($user_id, $role_id) { $roles = self::loadUserRoles($user_id); - return isset($roles[$role_id]) - ? $roles[$role_id]['institutes'] - : []; + return $roles[$role_id] ?? []; } /** @@ -209,11 +209,11 @@ class RolePersistence $user_roles = self::loadUserRoles($userid, true); return isset($user_roles[$role_id]) - ? ( - in_array($institut_id, $user_roles[$role_id]['institutes']) - || in_array($faculty_id, $user_roles[$role_id]['institutes']) - ) - : false; + && ( + !$institut_id + || in_array($institut_id, $user_roles[$role_id]) + || in_array($faculty_id, $user_roles[$role_id]) + ); } private static function loadUserRoles($user_id, $implicit = false) @@ -229,13 +229,6 @@ class RolePersistence UNION - SELECT `roleid`, `fakultaets_id` AS `institut_id`, 1 AS explicit - FROM `roles_user` - JOIN `Institute` USING (`institut_id`) - WHERE `userid` = :user_id - - UNION - SELECT `roleid`, '' AS institut_id, 0 AS explicit FROM `roles_studipperms` WHERE `permname` = :perm @@ -250,21 +243,28 @@ class RolePersistence foreach ($statement as $row) { if (!isset($roles[$row['roleid']])) { $roles[$row['roleid']] = [ + 'id' => $row['roleid'], 'institutes' => [], 'explicit' => (bool) $row['explicit'], ]; } - $roles[$row['roleid']]['institutes'][] = $row['institut_id']; + if ($row['institut_id']) { + $roles[$row['roleid']]['institutes'][] = $row['institut_id']; + } } $cache[$user_id] = $roles; } - return array_filter( + + // Filter implicit roles away if necessary + $roles = array_filter( $cache[$user_id], function ($role) use ($implicit) { return $implicit || $role['explicit']; } ); + + return array_column($roles, 'institutes', 'id'); } /** @@ -484,7 +484,7 @@ class RolePersistence private static function getUserRolesCache() { if (self::$user_roles_cache === null) { - self::$user_roles_cache = new StudipCachedArray('UserRoles'); + self::$user_roles_cache = new StudipCachedArray(self::USER_ROLES_CACHE_KEY); } return self::$user_roles_cache; } @@ -492,7 +492,7 @@ class RolePersistence private static function getPluginRolesCache() { if (self::$plugin_roles_cache === null) { - self::$plugin_roles_cache = new StudipCachedArray('PluginRoles'); + self::$plugin_roles_cache = new StudipCachedArray(self::PLUGIN_ROLES_CACHE_KEY); } return self::$plugin_roles_cache; } -- GitLab