From 71d907227c4d158a1f62ba3f3e11e505a1a19a82 Mon Sep 17 00:00:00 2001 From: Ng Kiat Siong Date: Tue, 4 Jun 2024 17:46:20 +0800 Subject: [PATCH] Improved orphaned resources detection in backend, fixed #4007 (#4022) --- app/code/core/Mage/Admin/Model/Resource/Acl.php | 11 +++++------ app/code/core/Mage/Admin/Model/Roles.php | 2 +- .../Block/Permissions/OrphanedResource/Grid.php | 3 +-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/app/code/core/Mage/Admin/Model/Resource/Acl.php b/app/code/core/Mage/Admin/Model/Resource/Acl.php index 9980e36bd11..f7ad5dd0a16 100644 --- a/app/code/core/Mage/Admin/Model/Resource/Acl.php +++ b/app/code/core/Mage/Admin/Model/Resource/Acl.php @@ -23,8 +23,6 @@ class Mage_Admin_Model_Resource_Acl extends Mage_Core_Model_Resource_Db_Abstract { public const ACL_ALL_RULES = 'all'; - protected $_orphanedResources = []; - /** * Initialize resource * @@ -114,6 +112,7 @@ public function loadRoles(Mage_Admin_Model_Acl $acl, array $rolesArr) */ public function loadRules(Mage_Admin_Model_Acl $acl, array $rulesArr) { + $orphanedResources = []; foreach ($rulesArr as $rule) { $role = $rule['role_type'] . $rule['role_id']; $resource = $rule['resource_id']; @@ -134,8 +133,8 @@ public function loadRules(Mage_Admin_Model_Acl $acl, array $rulesArr) $acl->deny($role, $resource, $privileges, $assert); } } catch (Zend_Acl_Exception $e) { - if (!in_array($resource, $this->_orphanedResources) && strpos($e->getMessage(), "Resource '$resource' not found") !== false) { - $this->_orphanedResources[] = $resource; + if (!in_array($resource, $orphanedResources) && strpos($e->getMessage(), "Resource '$resource' not found") !== false) { + $orphanedResources[] = $resource; } } catch (Exception $e) { if (Mage::getIsDeveloperMode()) { @@ -144,11 +143,11 @@ public function loadRules(Mage_Admin_Model_Acl $acl, array $rulesArr) } } - if ($this->_orphanedResources !== []) { + if ($orphanedResources !== [] && $acl->isAllowed(Mage::getSingleton('admin/session')->getUser()->getAclRole(), 'admin/system/acl/orphaned_resources')) { Mage::getSingleton('adminhtml/session')->addNotice( Mage::helper('adminhtml')->__( 'The following role resources are no longer available in the system: %s. You can delete them by clicking here.', - implode(', ', $this->_orphanedResources), + implode(', ', $orphanedResources), Mage::helper("adminhtml")->getUrl('adminhtml/permissions_orphanedResource') ) ); diff --git a/app/code/core/Mage/Admin/Model/Roles.php b/app/code/core/Mage/Admin/Model/Roles.php index a12498b9e94..142f9dd2a71 100644 --- a/app/code/core/Mage/Admin/Model/Roles.php +++ b/app/code/core/Mage/Admin/Model/Roles.php @@ -137,7 +137,7 @@ protected function _buildResourcesArray( $level = -1; } else { $resourceName = $parentName; - if (!in_array($resource->getName(), ['title', 'sort_order', 'children', 'disabled'])) { + if (!empty($resource->children()) && $resource->getName() !== 'children') { $resourceName = (is_null($parentName) ? '' : $parentName . '/') . $resource->getName(); //assigning module for its' children nodes diff --git a/app/code/core/Mage/Adminhtml/Block/Permissions/OrphanedResource/Grid.php b/app/code/core/Mage/Adminhtml/Block/Permissions/OrphanedResource/Grid.php index 042bb052ccf..cb4bd5be707 100644 --- a/app/code/core/Mage/Adminhtml/Block/Permissions/OrphanedResource/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Permissions/OrphanedResource/Grid.php @@ -36,9 +36,8 @@ public function __construct() */ protected function _prepareCollection() { - /** @var Mage_Admin_Model_Resource_Rules_Collection */ $collection = Mage::getResourceModel('admin/rules_collection') - ->addFieldToFilter('resource_id', ['nin' => Mage::getModel('admin/roles')->getResourcesList2D()]) + ->addFieldToFilter('resource_id', ['nin' => Mage::getSingleton('admin/session')->getAcl()->getResources()]) ->addFieldToSelect('resource_id'); $collection->getSelect()->group('resource_id');