PluginProbe ʕ •ᴥ•ʔ
Advanced Access Manager – Access Governance for WordPress / 5.8.2
Advanced Access Manager – Access Governance for WordPress v5.8.2
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 7 years ago Capability.php 7 years ago LoginRedirect.php 7 years ago LogoutRedirect.php 7 years ago Menu.php 7 years ago Metabox.php 7 years ago Policy.php 7 years ago Post.php 7 years ago Redirect.php 7 years ago Route.php 7 years ago Toolbar.php 7 years ago Uri.php 7 years ago Visibility.php 7 years ago
Menu.php
302 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_Manager::getInstance()->find(
39 "/^BackendMenu:/i", $subject
40 );
41
42 foreach($stms as $key => $stm) {
43 $chunks = explode(':', $key);
44 $option[$chunks[1]] = ($stm['Effect'] === 'deny' ? 1 : 0);
45 }
46 }
47
48 // Finally try to load from parent
49 if (empty($option)) {
50 $option = $this->getSubject()->inheritFromParent('menu');
51 }
52
53 $this->setOption($option);
54 }
55
56 /**
57 * Filter Menu List
58 *
59 * Keep in mind that this function only filter the menu items but do not
60 * restrict access to them. You have to explore roles and capabilities to
61 * control the full access to menus.
62 *
63 * @global array $menu
64 * @global array $submenu
65 *
66 * @return void
67 *
68 * @access public
69 */
70 public function filter() {
71 global $menu, $submenu;
72
73 foreach ($menu as $id => $item) {
74 if (!empty($submenu[$item[2]])) {
75 // Cover the scenario when there are some dynamic submenus
76 $subs = $this->filterSubmenu($item, ($this->has('menu-' . $item[2])));
77 } else {
78 $subs = array();
79 }
80
81 // cover scenario like with Visual Composer where landing page
82 // is defined dynamically
83 if ($this->has('menu-' . $item[2])) {
84 unset($menu[$id]);
85 } elseif ($this->has($item[2])) {
86 if (count($subs)) {
87 $menu[$id][2] = $subs[0][2];
88 $submenu[$menu[$id][2]] = $subs;
89 } else {
90 unset($menu[$id]);
91 }
92 }
93 }
94
95 // remove duplicated separators
96 $count = 0;
97 foreach ($menu as $id => $item) {
98 if (preg_match('/^separator/', $item[2])) {
99 if ($count === 0) {
100 $count++;
101 } else {
102 unset($menu[$id]);
103 }
104 } else {
105 $count = 0;
106 }
107 }
108 }
109
110 /**
111 *
112 * @param array $menu
113 * @return array
114 */
115 protected function normalizeItem($menu) {
116 if (strpos($menu, 'customize.php') === 0) {
117 $menu = 'customize.php';
118 }
119
120 return $menu;
121 }
122
123 /**
124 * Update single option item
125 *
126 * @param string $item
127 * @param mixed $value
128 *
129 * @return boolean Always true
130 *
131 * @access public
132 */
133 public function updateOptionItem($item, $value) {
134 $option = $this->getOption();
135
136 $option[$item] = $value;
137 $option[crc32($item)] = $value;
138
139 $this->setOption($option);
140
141 return true;
142 }
143
144 /**
145 * Filter submenu
146 *
147 * @param array &$parent
148 * @param bool $deny_all
149 *
150 * @return void
151 *
152 * @access protected
153 *
154 * @global array $menu
155 * @global array $submenu
156 */
157 protected function filterSubmenu(&$parent, $deny_all = false) {
158 global $submenu;
159
160 $filtered = array();
161
162 foreach ($submenu[$parent[2]] as $id => $item) {
163 if ($deny_all || $this->has($this->normalizeItem($item[2]))) {
164 unset($submenu[$parent[2]][$id]);
165 } else {
166 $filtered[] = $submenu[$parent[2]][$id];
167 }
168 }
169
170 if (count($filtered)) { //make sure that the parent points to the first sub
171 $values = array_values($filtered);
172 $parent[2] = $values[0][2];
173 }
174
175 return $filtered;
176 }
177
178 /**
179 * Get parent menu
180 *
181 * @param string $search
182 *
183 * @return string|bool
184 *
185 * @access protected
186 * @global array $submenu
187 */
188 protected function getParentMenu($search) {
189 global $submenu;
190
191 $result = null;
192
193 if (is_array($submenu)) {
194 foreach($submenu as $parent => $subs) {
195 foreach($subs as $sub) {
196 if ($sub[2] === $search) {
197 $result = $parent;
198 break;
199 }
200 }
201
202 if ($result !== null) {
203 break;
204 }
205 }
206 }
207
208 return $result;
209 }
210
211 /**
212 * Check is menu defined
213 *
214 * Check if menu defined in options based on the id
215 *
216 * @param string $menu
217 *
218 * @return boolean
219 *
220 * @access public
221 */
222 public function has($menu, $both = false) {
223 //decode URL in case of any special characters like &amp;
224 $decoded = htmlspecialchars_decode($menu);
225
226 $options = $this->getOption();
227 $parent = $this->getParentMenu($decoded);
228
229 // Step #1. Check if menu is directly restricted
230 $direct = !empty($options[$decoded]) || !empty($options[crc32($decoded)]);
231
232 // Step #2. Check if whole branch is restricted
233 $branch = ($both && (!empty($options['menu-' . $decoded]) || !empty($options[crc32('menu-' . $decoded)])));
234
235 // Step #3. Check if dynamic submenu is restricted because of whole branch
236 $indirect = ($parent && (!empty($options['menu-' . $parent]) || !empty($options[crc32('menu-' . $parent)])));
237
238 return $direct || $branch || $indirect;
239 }
240
241 /**
242 * Allow access to a specific menu
243 *
244 * @param string $menu
245 *
246 * @return boolean
247 *
248 * @access public
249 */
250 public function allow($menu) {
251 return $this->save($menu, 0);
252 }
253
254 /**
255 * Deny access to a specific menu
256 *
257 * @param string $menu
258 *
259 * @return boolean
260 *
261 * @access public
262 */
263 public function deny($menu) {
264 return $this->save($menu, 1);
265 }
266
267 /**
268 * Save menu option
269 *
270 * @return bool
271 *
272 * @access public
273 */
274 public function save($item = null, $value = null) {
275 if (!is_null($item)) { // keep it compatible with main Manager.save
276 $this->updateOptionItem($item, $value);
277 }
278
279 return $this->getSubject()->updateOption($this->getOption(), 'menu');
280 }
281
282 /**
283 * Reset default settings
284 *
285 * @return bool
286 *
287 * @access public
288 */
289 public function reset() {
290 return $this->getSubject()->deleteOption('menu');
291 }
292
293 /**
294 *
295 * @param type $external
296 * @return type
297 */
298 public function mergeOption($external) {
299 return AAM::api()->mergeSettings($external, $this->getOption(), 'menu');
300 }
301
302 }