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 / Policy / Condition.php
advanced-access-manager / Application / Core / Policy Last commit date
Condition.php 7 years ago Manager.php 7 years ago Token.php 7 years ago Validator.php 7 years ago
Condition.php
413 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 * AAM core policy condition evaluator
12 *
13 * @package AAM
14 * @author Vasyl Martyniuk <vasyl@vasyltech.com>
15 * @since AAM v5.8.2
16 */
17 final class AAM_Core_Policy_Condition {
18
19 /**
20 * Single instance of itself
21 *
22 * @var AAM_Core_Policy_Condition
23 *
24 * @access protected
25 * @static
26 */
27 protected static $instance = null;
28
29 /**
30 * Map between condition type and method that evaluates the
31 * group of conditions
32 *
33 * @var array
34 *
35 * @access protected
36 */
37 protected $map = array(
38 'between' => 'evaluateBetweenConditions',
39 'equals' => 'evaluateEqualsConditions',
40 'notequals' => 'evaluateNotEqualsConditions',
41 'greater' => 'evaluateGreaterConditions',
42 'less' => 'evaluateLessConditions',
43 'greaterorequals' => 'evaluateGreaterOrEqualsConditions',
44 'lessorequals' => 'evaluateLessOrEqualsConditions',
45 'in' => 'evaluateInConditions',
46 'notin' => 'evaluateNotInConditions',
47 'like' => 'evaluateLikeConditions',
48 'notlike' => 'evaluateNotLikeConditions',
49 'regex' => 'evaluateRegexConditions'
50 );
51
52 /**
53 * Constructor
54 *
55 * @return void
56 *
57 * @access protected
58 */
59 protected function __construct() {}
60
61 /**
62 * Evaluate the group of conditions based on type
63 *
64 * @param array $conditions
65 *
66 * @return boolean
67 *
68 * @access public
69 */
70 public function evaluate($conditions) {
71 $result = true;
72
73 foreach($conditions as $type => $conditions) {
74 $type = strtolower($type);
75
76 if (isset($this->map[$type])) {
77 $callback = array($this, $this->map[$type]);
78 $result = $result && call_user_func($callback, $conditions);
79 } else {
80 $result = false;
81 }
82 }
83
84 return $result;
85 }
86
87 /**
88 * Evaluate group of BETWEEN conditions
89 *
90 * @param array $conditions
91 *
92 * @return boolean
93 *
94 * @access protected
95 */
96 protected function evaluateBetweenConditions($conditions) {
97 $result = false;
98
99 foreach($this->prepareConditions($conditions) as $left => $right) {
100 foreach((array)$right as $subset) {
101 $min = (is_array($subset) ? array_shift($subset) : $subset);
102 $max = (is_array($subset) ? end($subset) : $subset);
103
104 $result = $result || ($left >= $min && $left <= $max);
105 }
106 }
107
108 return $result;
109 }
110
111 /**
112 * Evaluate group of EQUALS conditions
113 *
114 * The values have to be identical
115 *
116 * @param array $conditions
117 *
118 * @return boolean
119 *
120 * @access protected
121 */
122 protected function evaluateEqualsConditions($conditions) {
123 $result = false;
124
125 foreach($this->prepareConditions($conditions) as $left => $right) {
126 $result = $result || ($left === $right);
127 }
128
129 return $result;
130 }
131
132 /**
133 * Evaluate group of NOT EQUALs conditions
134 *
135 * @param array $conditions
136 *
137 * @return boolean
138 *
139 * @access protected
140 */
141 protected function evaluateNotEqualsConditions($conditions) {
142 return !$this->evaluateEqualsConditions($conditions);
143 }
144
145 /**
146 * Evaluate group of GREATER THEN conditions
147 *
148 * @param array $conditions
149 *
150 * @return boolean
151 *
152 * @access protected
153 */
154 protected function evaluateGreaterConditions($conditions) {
155 $result = false;
156
157 foreach($this->prepareConditions($conditions) as $left => $right) {
158 $result = $result || ($left > $right);
159 }
160
161 return $result;
162 }
163
164 /**
165 * Evaluate group of LESS THEN conditions
166 *
167 * @param array $conditions
168 *
169 * @return boolean
170 *
171 * @access protected
172 */
173 protected function evaluateLessConditions($conditions) {
174 $result = false;
175
176 foreach($this->prepareConditions($conditions) as $left => $right) {
177 $result = $result || ($left < $right);
178 }
179
180 return $result;
181 }
182
183 /**
184 * Evaluate group of GREATER OR EQUALS THEN conditions
185 *
186 * @param array $conditions
187 *
188 * @return boolean
189 *
190 * @access protected
191 */
192 protected function evaluateGreaterOrEqualsConditions($conditions) {
193 $result = false;
194
195 foreach($this->prepareConditions($conditions) as $left => $right) {
196 $result = $result || ($left >= $right);
197 }
198
199 return $result;
200 }
201
202 /**
203 * Evaluate group of LESS OR EQUALS THEN conditions
204 *
205 * @param array $conditions
206 *
207 * @return boolean
208 *
209 * @access protected
210 */
211 protected function evaluateLessOrEqualsConditions($conditions) {
212 $result = false;
213
214 foreach($this->prepareConditions($conditions) as $left => $right) {
215 $result = $result || ($left <= $right);
216 }
217
218 return $result;
219 }
220
221 /**
222 * Evaluate group of IN conditions
223 *
224 * @param array $conditions
225 *
226 * @return boolean
227 *
228 * @access protected
229 */
230 protected function evaluateInConditions($conditions) {
231 $result = false;
232
233 foreach($this->prepareConditions($conditions) as $left => $right) {
234 $result = $result || in_array($left, (array) $right, true);
235 }
236
237 return $result;
238 }
239
240 /**
241 * Evaluate group of NOT IN conditions
242 *
243 * @param array $conditions
244 *
245 * @return boolean
246 *
247 * @access protected
248 */
249 protected function evaluateNotInConditions($conditions) {
250 return !$this->evaluateInConditions($conditions);
251 }
252
253 /**
254 * Evaluate group of LIKE conditions
255 *
256 * @param array $conditions
257 *
258 * @return boolean
259 *
260 * @access protected
261 */
262 protected function evaluateLikeConditions($conditions) {
263 $result = false;
264
265 foreach($this->prepareConditions($conditions) as $left => $right) {
266 foreach((array)$right as $el) {
267 $sub = str_replace('\*', '.*', preg_quote($el));
268 $result = $result || preg_match('@^' . $sub . '$@', $left);
269 }
270 }
271
272 return $result;
273 }
274
275 /**
276 * Evaluate group of NOT LIKE conditions
277 *
278 * @param array $conditions
279 *
280 * @return boolean
281 *
282 * @access protected
283 */
284 protected function evaluateNotLikeConditions($conditions) {
285 return !$this->evaluateLikeConditions($conditions);
286 }
287
288 /**
289 * Evaluate group of REGEX conditions
290 *
291 * @param array $conditions
292 *
293 * @return boolean
294 *
295 * @access protected
296 */
297 protected function evaluateRegexConditions($conditions) {
298 $result = false;
299
300 foreach($this->prepareConditions($conditions) as $left => $right) {
301 $result = $result || preg_match($right, $left);
302 }
303
304 return $result;
305 }
306
307 /**
308 * Prepare conditions by replacing all defined tokens
309 *
310 * @param array $conditions
311 *
312 * @return array
313 *
314 * @access protected
315 */
316 protected function prepareConditions($conditions) {
317 $result = array();
318
319 if (is_array($conditions)) {
320 foreach($conditions as $left => $right) {
321 $left = $this->parseExpression($left);
322 $right = $this->parseExpression($right);
323
324 if ($left !== false) { // Do not include any failed conditions
325 $result[$left] = $right;
326 }
327 }
328 }
329
330 return $result;
331 }
332
333 /**
334 * Parse condition and try to replace all defined tokens
335 *
336 * @param mixed $exp Part of the condition (either left or right)
337 *
338 * @return mixed Prepared part of the condition or false on failure
339 *
340 * @access protected
341 */
342 protected function parseExpression($exp) {
343 if (is_scalar($exp)) {
344 if (preg_match_all('/(\$\{[^}]+\})/', $exp, $match)) {
345 $exp = AAM_Core_Policy_Token::evaluate($exp, $match[1]);
346 }
347 // If there is type scaling, perform it too
348 if (preg_match('/^\(\*(string|ip|int|boolean|bool)\)(.*)/i', $exp, $scale)) {
349 $exp = str_replace(
350 "(*{$scale[1]}", '', $this->scaleValue($scale[2], $scale[1])
351 );
352 }
353 } elseif (is_array($exp) || is_object($exp)) {
354 foreach($exp as &$value) {
355 $value = $this->parseExpression($value);
356 }
357 } else {
358 $exp = false;
359 }
360
361 return $exp;
362 }
363
364 /**
365 * Scale value to specific type
366 *
367 * @param mixed $value
368 * @param string $type
369 *
370 * @return mixed
371 *
372 * @access protected
373 */
374 protected function scaleValue($value, $type) {
375 switch(strtolower($type)) {
376 case 'string':
377 $value = (string)$value;
378 break;
379
380 case 'ip':
381 $value = inet_pton($value);
382 break;
383
384 case 'int':
385 $value = (int)$value;
386 break;
387
388 case 'boolean':
389 case 'bool':
390 $value = (bool)$value;
391 break;
392 }
393
394 return $value;
395 }
396
397 /**
398 * Get single instance of itself
399 *
400 * @return AAM_Core_Policy_Condition
401 *
402 * @access public
403 * @static
404 */
405 public static function getInstance() {
406 if (is_null(self::$instance)) {
407 self::$instance = new self;
408 }
409
410 return self::$instance;
411 }
412
413 }