PluginProbe ʕ •ᴥ•ʔ
Advanced Access Manager – Access Governance for WordPress / 5.11
Advanced Access Manager – Access Governance for WordPress v5.11
6.8.4 6.8.5 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13 6.9.14 6.9.15 6.9.16 6.9.17 6.9.18 6.9.19 6.9.2 6.9.20 6.9.21 6.9.22 6.9.23 6.9.24 6.9.25 6.9.26 6.9.27 6.9.28 6.9.29 6.9.3 6.9.30 6.9.31 6.9.32 6.9.33 6.9.34 6.9.35 6.9.36 6.9.37 6.9.38 6.9.39 6.9.4 6.9.41 6.9.42 6.9.43 6.9.44 6.9.45 6.9.46 6.9.47 6.9.48 6.9.49 6.9.5 6.9.51 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.0-alpha.6 7.0.0-alpha.7 7.0.0-beta.1 7.0.0-rc1 7.0.0-rc2 7.0.0-rc3 7.0.1 7.0.10 7.0.11 7.0.2 7.0.3 7.0.4 7.0.5 7.0.6 7.0.7 7.0.8 7.0.9 7.1.0 7.1.1 trunk 3.0 4.0 4.0.1 4.1 4.2 4.3 4.4 4.4.1 4.5 4.6 4.6.1 4.6.2 4.7 4.7.1 4.7.2 4.7.5 4.7.6 4.8 4.8.1 4.9 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.9.5.1 4.9.5.2 5.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1 5.1.1 5.10 5.11 5.2 5.2.1 5.2.5 5.2.6 5.2.7 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.4 5.4.1 5.4.2 5.4.3 5.4.3.1 5.4.3.2 5.5 5.5.1 5.5.2 5.6 5.6.1 5.6.1.1 5.7 5.7.1 5.7.2 5.7.3 5.8 5.8.1 5.8.2 5.8.3 5.9 5.9.1 5.9.1.1 5.9.2 5.9.2.1 5.9.3 5.9.4 5.9.5 5.9.6 5.9.6.1 5.9.6.2 5.9.6.3 5.9.7 5.9.7.1 5.9.7.2 5.9.7.3 5.9.8 5.9.8.1 5.9.9 5.9.9.1 6.0.0 6.0.1 6.0.2 6.0.3 6.0.4 6.0.5 6.1.0 6.1.1 6.2.0 6.2.1 6.2.2 6.3.0 6.3.1 6.3.2 6.3.3 6.4.0 6.4.1 6.4.2 6.4.3 6.5.0 6.5.1 6.5.2 6.5.3 6.5.4 6.6.0 6.6.1 6.6.2 6.6.3 6.6.4 6.7.0 6.7.1 6.7.2 6.7.3 6.7.4 6.7.5 6.7.6 6.7.7 6.7.8 6.7.9 6.8.0 6.8.1 6.8.2 6.8.3
advanced-access-manager / application / Core / Object / Menu.php
advanced-access-manager / application / Core / Object Last commit date
Cache.php 6 years ago Capability.php 6 years ago LoginRedirect.php 6 years ago LogoutRedirect.php 6 years ago Menu.php 6 years ago Metabox.php 6 years ago Policy.php 6 years ago Post.php 6 years ago Redirect.php 6 years ago Route.php 6 years ago Toolbar.php 6 years ago Uri.php 6 years ago Visibility.php 6 years ago
Menu.php
300 lines
1 <?php
2
3 /**
4 * ======================================================================
5 * LICENSE: This file is subject to the terms and conditions defined in *
6 * file 'license.txt', which is part of this source code package. *
7 * ======================================================================
8 */
9
10 /**
11 * Menu object
12 *
13 * @package AAM
14 * @author Vasyl Martyniuk <vasyl@vasyltech.com>
15 */
16 class AAM_Core_Object_Menu extends AAM_Core_Object {
17
18 /**
19 * Constructor
20 *
21 * @param AAM_Core_Subject $subject
22 *
23 * @return void
24 *
25 * @access public
26 */
27 public function __construct(AAM_Core_Subject $subject) {
28 parent::__construct($subject);
29
30 $option = $this->getSubject()->readOption('menu');
31
32 if (!empty($option)) {
33 $this->setOverwritten(true);
34 }
35
36 // Load settings from Access & Security Policy
37 if (empty($option)) {
38 $stms = AAM_Core_Policy_Factory::get($subject)->find("/^BackendMenu:/i");
39
40 foreach($stms as $key => $stm) {
41 $chunks = explode(':', $key);
42 $option[$chunks[1]] = ($stm['Effect'] === 'deny' ? 1 : 0);
43 }
44 }
45
46 // Finally try to load from parent
47 if (empty($option)) {
48 $option = $this->getSubject()->inheritFromParent('menu');
49 }
50
51 $this->setOption($option);
52 }
53
54 /**
55 * Filter Menu List
56 *
57 * Keep in mind that this function only filter the menu items but do not
58 * restrict access to them. You have to explore roles and capabilities to
59 * control the full access to menus.
60 *
61 * @global array $menu
62 * @global array $submenu
63 *
64 * @return void
65 *
66 * @access public
67 */
68 public function filter() {
69 global $menu, $submenu;
70
71 foreach ($menu as $id => $item) {
72 if (!empty($submenu[$item[2]])) {
73 // Cover the scenario when there are some dynamic submenus
74 $subs = $this->filterSubmenu($item, ($this->has('menu-' . $item[2])));
75 } else {
76 $subs = array();
77 }
78
79 // cover scenario like with Visual Composer where landing page
80 // is defined dynamically
81 if ($this->has('menu-' . $item[2])) {
82 unset($menu[$id]);
83 } elseif ($this->has($item[2])) {
84 if (count($subs)) {
85 $menu[$id][2] = $subs[0][2];
86 $submenu[$menu[$id][2]] = $subs;
87 } else {
88 unset($menu[$id]);
89 }
90 }
91 }
92
93 // remove duplicated separators
94 $count = 0;
95 foreach ($menu as $id => $item) {
96 if (preg_match('/^separator/', $item[2])) {
97 if ($count === 0) {
98 $count++;
99 } else {
100 unset($menu[$id]);
101 }
102 } else {
103 $count = 0;
104 }
105 }
106 }
107
108 /**
109 *
110 * @param array $menu
111 * @return array
112 */
113 protected function normalizeItem($menu) {
114 if (strpos($menu, 'customize.php') === 0) {
115 $menu = 'customize.php';
116 }
117
118 return $menu;
119 }
120
121 /**
122 * Update single option item
123 *
124 * @param string $item
125 * @param mixed $value
126 *
127 * @return boolean Always true
128 *
129 * @access public
130 */
131 public function updateOptionItem($item, $value) {
132 $option = $this->getOption();
133
134 $option[$item] = $value;
135 $option[crc32($item)] = $value;
136
137 $this->setOption($option);
138
139 return true;
140 }
141
142 /**
143 * Filter submenu
144 *
145 * @param array &$parent
146 * @param bool $deny_all
147 *
148 * @return void
149 *
150 * @access protected
151 *
152 * @global array $menu
153 * @global array $submenu
154 */
155 protected function filterSubmenu(&$parent, $deny_all = false) {
156 global $submenu;
157
158 $filtered = array();
159
160 foreach ($submenu[$parent[2]] as $id => $item) {
161 if ($deny_all || $this->has($this->normalizeItem($item[2]))) {
162 unset($submenu[$parent[2]][$id]);
163 } else {
164 $filtered[] = $submenu[$parent[2]][$id];
165 }
166 }
167
168 if (count($filtered)) { //make sure that the parent points to the first sub
169 $values = array_values($filtered);
170 $parent[2] = $values[0][2];
171 }
172
173 return $filtered;
174 }
175
176 /**
177 * Get parent menu
178 *
179 * @param string $search
180 *
181 * @return string|bool
182 *
183 * @access protected
184 * @global array $submenu
185 */
186 protected function getParentMenu($search) {
187 global $submenu;
188
189 $result = null;
190
191 if (is_array($submenu)) {
192 foreach($submenu as $parent => $subs) {
193 foreach($subs as $sub) {
194 if ($sub[2] === $search) {
195 $result = $parent;
196 break;
197 }
198 }
199
200 if ($result !== null) {
201 break;
202 }
203 }
204 }
205
206 return $result;
207 }
208
209 /**
210 * Check is menu defined
211 *
212 * Check if menu defined in options based on the id
213 *
214 * @param string $menu
215 *
216 * @return boolean
217 *
218 * @access public
219 */
220 public function has($menu, $both = false) {
221 //decode URL in case of any special characters like &amp;
222 $decoded = htmlspecialchars_decode($menu);
223
224 $options = $this->getOption();
225 $parent = $this->getParentMenu($decoded);
226
227 // Step #1. Check if menu is directly restricted
228 $direct = !empty($options[$decoded]) || !empty($options[crc32($decoded)]);
229
230 // Step #2. Check if whole branch is restricted
231 $branch = ($both && (!empty($options['menu-' . $decoded]) || !empty($options[crc32('menu-' . $decoded)])));
232
233 // Step #3. Check if dynamic submenu is restricted because of whole branch
234 $indirect = ($parent && (!empty($options['menu-' . $parent]) || !empty($options[crc32('menu-' . $parent)])));
235
236 return $direct || $branch || $indirect;
237 }
238
239 /**
240 * Allow access to a specific menu
241 *
242 * @param string $menu
243 *
244 * @return boolean
245 *
246 * @access public
247 */
248 public function allow($menu) {
249 return $this->save($menu, 0);
250 }
251
252 /**
253 * Deny access to a specific menu
254 *
255 * @param string $menu
256 *
257 * @return boolean
258 *
259 * @access public
260 */
261 public function deny($menu) {
262 return $this->save($menu, 1);
263 }
264
265 /**
266 * Save menu option
267 *
268 * @return bool
269 *
270 * @access public
271 */
272 public function save($item = null, $value = null) {
273 if (!is_null($item)) { // keep it compatible with main Manager.save
274 $this->updateOptionItem($item, $value);
275 }
276
277 return $this->getSubject()->updateOption($this->getOption(), 'menu');
278 }
279
280 /**
281 * Reset default settings
282 *
283 * @return bool
284 *
285 * @access public
286 */
287 public function reset() {
288 return $this->getSubject()->deleteOption('menu');
289 }
290
291 /**
292 *
293 * @param type $external
294 * @return type
295 */
296 public function mergeOption($external) {
297 return AAM::api()->mergeSettings($external, $this->getOption(), 'menu');
298 }
299
300 }