1
1
<?php
2
2
/**
3
- * Copyright © Magento, Inc. All rights reserved.
4
- * See COPYING.txt for license details .
3
+ * Copyright 2012 Adobe
4
+ * All Rights Reserved .
5
5
*/
6
6
declare (strict_types=1 );
7
7
@@ -87,7 +87,7 @@ public function __construct(
87
87
public function populateAcl (Acl $ acl )
88
88
{
89
89
$ result = $ this ->applyPermissionsAccordingToRules ($ acl );
90
- $ this ->applyDenyPermissionsForMissingRules ($ acl , ... $ result );
90
+ $ this ->denyPermissionsForMissingRules ($ acl , $ result );
91
91
}
92
92
93
93
/**
@@ -98,56 +98,84 @@ public function populateAcl(Acl $acl)
98
98
*/
99
99
private function applyPermissionsAccordingToRules (Acl $ acl ): array
100
100
{
101
- $ foundResources = $ foundDeniedRoles = [];
101
+ $ appliedRolePermissionsPerResource = [];
102
102
foreach ($ this ->getRulesArray () as $ rule ) {
103
103
$ role = $ rule ['role_id ' ];
104
104
$ resource = $ rule ['resource_id ' ];
105
105
$ privileges = !empty ($ rule ['privileges ' ]) ? explode (', ' , $ rule ['privileges ' ]) : null ;
106
106
107
107
if ($ acl ->hasResource ($ resource )) {
108
- $ foundResources [$ resource ] = $ resource ;
108
+
109
+ $ appliedRolePermissionsPerResource [$ resource ]['allow ' ] =
110
+ $ appliedRolePermissionsPerResource [$ resource ]['allow ' ] ?? [];
111
+ $ appliedRolePermissionsPerResource [$ resource ]['deny ' ] =
112
+ $ appliedRolePermissionsPerResource [$ resource ]['deny ' ] ?? [];
113
+
109
114
if ($ rule ['permission ' ] == 'allow ' ) {
110
115
if ($ resource === $ this ->_rootResource ->getId ()) {
111
116
$ acl ->allow ($ role , null , $ privileges );
112
117
}
113
118
$ acl ->allow ($ role , $ resource , $ privileges );
119
+ $ appliedRolePermissionsPerResource [$ resource ]['allow ' ][] = $ role ;
114
120
} elseif ($ rule ['permission ' ] == 'deny ' ) {
115
- $ foundDeniedRoles [$ role ] = $ role ;
116
121
$ acl ->deny ($ role , $ resource , $ privileges );
122
+ $ appliedRolePermissionsPerResource [$ resource ]['deny ' ][] = $ role ;
117
123
}
118
124
}
119
125
}
120
- return [$ foundResources , $ foundDeniedRoles ];
126
+
127
+ return $ appliedRolePermissionsPerResource ;
121
128
}
122
129
123
130
/**
124
- * Apply deny permissions for missing rules
131
+ * Deny permissions for missing rules
125
132
*
126
133
* For all rules that were not regenerated in authorization_rule table,
127
134
* when adding a new module and without re-saving all roles,
128
135
* consider not present rules with deny permissions
129
136
*
130
137
* @param Acl $acl
131
- * @param array $resources
132
- * @param array $deniedRoles
138
+ * @param array $appliedRolePermissionsPerResource
133
139
* @return void
134
140
*/
135
- private function applyDenyPermissionsForMissingRules (
136
- Acl $ acl ,
137
- array $ resources ,
138
- array $ deniedRoles
141
+ private function denyPermissionsForMissingRules (
142
+ Acl $ acl ,
143
+ array $ appliedRolePermissionsPerResource ,
139
144
) {
140
- if (count ($ resources ) && count ($ deniedRoles )
141
- //ignore denying missing permission if all are allowed
142
- && !(count ($ resources ) === 1 && isset ($ resources [static ::ALLOW_EVERYTHING ]))
143
- ) {
144
- foreach ($ acl ->getResources () as $ resource ) {
145
- if (!isset ($ resources [$ resource ])) {
146
- foreach ($ deniedRoles as $ role ) {
147
- $ acl ->deny ($ role , $ resource , null );
148
- }
145
+ $ consolidatedDeniedRoleIds = array_unique (
146
+ array_merge (
147
+ ...array_column ($ appliedRolePermissionsPerResource , 'deny ' )
148
+ )
149
+ );
150
+
151
+ $ hasAppliedPermissions = count ($ appliedRolePermissionsPerResource ) > 0 ;
152
+ $ hasDeniedRoles = count ($ consolidatedDeniedRoleIds ) > 0 ;
153
+ $ allAllowed = count ($ appliedRolePermissionsPerResource ) === 1
154
+ && isset ($ appliedRolePermissionsPerResource [static ::ALLOW_EVERYTHING ]);
155
+
156
+ if ($ hasAppliedPermissions && $ hasDeniedRoles && !$ allAllowed ) {
157
+ // Add the resources that are not present in the rules at all,
158
+ // assuming that they must be denied for all roles by default
159
+ $ resourcesUndefinedInAuthorizationRules =
160
+ array_diff ($ acl ->getResources (), array_keys ($ appliedRolePermissionsPerResource ));
161
+ $ assumeDeniedRoleListPerResource =
162
+ array_fill_keys ($ resourcesUndefinedInAuthorizationRules , $ consolidatedDeniedRoleIds );
163
+
164
+ // Add the resources that are permitted for one role and not present in others at all,
165
+ // assuming that they must be denied for all other roles by default
166
+ foreach ($ appliedRolePermissionsPerResource as $ resource => $ permissions ) {
167
+ $ allowedRoles = $ permissions ['allow ' ];
168
+ $ deniedRoles = $ permissions ['deny ' ];
169
+ $ assumedDeniedRoles = array_diff ($ consolidatedDeniedRoleIds , $ allowedRoles , $ deniedRoles );
170
+ if ($ assumedDeniedRoles ) {
171
+ $ assumeDeniedRoleListPerResource [$ resource ] = $ assumedDeniedRoles ;
149
172
}
150
173
}
174
+
175
+ // Deny permissions for missing rules
176
+ foreach ($ assumeDeniedRoleListPerResource as $ resource => $ denyRoles ) {
177
+ $ acl ->deny ($ denyRoles , $ resource , null );
178
+ }
151
179
}
152
180
}
153
181
0 commit comments