PluginProbe ʕ •ᴥ•ʔ
Advanced Access Manager – Access Governance for WordPress / trunk
Advanced Access Manager – Access Governance for WordPress vtrunk
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 / Restful / AccessDeniedRedirect.php
advanced-access-manager / application / Restful Last commit date
AccessDeniedRedirect.php 1 year ago AdminToolbar.php 1 year ago ApiRoute.php 1 year ago BackendMenu.php 1 year ago BackwardCompatibility.php 1 year ago Capability.php 1 year ago Configs.php 5 months ago Content.php 1 year ago Identity.php 1 year ago Jwt.php 5 months ago LoginRedirect.php 1 year ago LogoutRedirect.php 1 year ago Metabox.php 1 year ago Mu.php 1 year ago NotFoundRedirect.php 1 year ago Policies.php 1 year ago Roles.php 1 year ago SecureLogin.php 1 year ago SecurityAudit.php 1 year ago ServiceTrait.php 1 year ago Settings.php 1 year ago Urls.php 1 year ago Users.php 1 year ago Widgets.php 1 year ago
AccessDeniedRedirect.php
442 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 * RESTful API for the Access Denied Redirect service
12 *
13 * @package AAM
14 * @version 7.0.0
15 */
16 class AAM_Restful_AccessDeniedRedirect
17 {
18
19 use AAM_Restful_ServiceTrait;
20
21 /**
22 * Necessary permissions to access endpoint
23 *
24 * @version 7.0.0
25 */
26 const PERMISSIONS = [
27 'aam_manager',
28 'aam_manage_access_denied_redirect'
29 ];
30
31 /**
32 * Constructor
33 *
34 * @return void
35 * @access protected
36 *
37 * @version 7.0.0
38 */
39 protected function __construct()
40 {
41 // Register API endpoint
42 add_action('rest_api_init', function() {
43 // Get current access denied redirect rule
44 $this->_register_route('/redirect/access-denied', [
45 'methods' => WP_REST_Server::READABLE,
46 'callback' => [ $this, 'get_redirect' ],
47 'args' => [
48 'area' => [
49 'description' => 'Access area (frontend, backend or api)',
50 'type' => 'string',
51 'required' => false
52 ]
53 ]
54 ], self::PERMISSIONS);
55
56 // Create a redirect rule
57 $this->_register_route('/redirect/access-denied', [
58 'methods' => WP_REST_Server::CREATABLE,
59 'callback' => [ $this, 'set_redirect' ],
60 'args' => [
61 'area' => [
62 'description' => 'Access area (frontend, backend or api)',
63 'type' => 'string',
64 'required' => true
65 ],
66 'type' => [
67 'description' => 'Redirect type',
68 'type' => 'string',
69 'required' => true
70 ],
71 'http_status_code' => [
72 'description' => 'HTTP Status Code',
73 'type' => 'number',
74 'validate_callback' => function ($value, $request) {
75 return $this->_validate_http_status_code(
76 $value, $request
77 );
78 }
79 ],
80 'redirect_page_id' => [
81 'description' => 'Existing page ID to redirect to',
82 'type' => 'number',
83 'validate_callback' => function ($value, $request) {
84 return $this->_validate_redirect_page_id(
85 $value, $request
86 );
87 }
88 ],
89 'redirect_page_slug' => [
90 'description' => 'Existing page slug to redirect to',
91 'type' => 'string',
92 'validate_callback' => function ($value, $request) {
93 return $this->_validate_redirect_page_slug(
94 $value, $request
95 );
96 }
97 ],
98 'redirect_url' => [
99 'description' => 'Valid URL to redirect to',
100 'type' => 'string',
101 'validate_callback' => function ($value, $request) {
102 return $this->_validate_redirect_url($value, $request);
103 }
104 ],
105 'callback' => [
106 'description' => 'Custom callback function',
107 'type' => 'string',
108 'validate_callback' => function ($value, $request) {
109 return $this->_validate_callback($value, $request);
110 }
111 ],
112 'message' => [
113 'description' => 'Custom access denied message',
114 'type' => 'string',
115 'validate_callback' => function ($value, $request) {
116 return $this->_validate_message($value, $request);
117 }
118 ]
119 ]
120 ], self::PERMISSIONS);
121
122 // Delete/reset access denied redirect rule for a specific area
123 // or all at once
124 $this->_register_route('/redirect/access-denied', [
125 'methods' => WP_REST_Server::DELETABLE,
126 'callback' => [ $this, 'reset_redirect' ],
127 'args' => [
128 'area' => [
129 'description' => 'Access area (frontend, backend or api)',
130 'type' => 'string',
131 'required' => false
132 ]
133 ]
134 ], self::PERMISSIONS);
135 });
136 }
137
138 /**
139 * Get current redirect rule
140 *
141 * @param WP_REST_Request $request
142 *
143 * @return WP_REST_Response
144 * @access public
145 *
146 * @version 7.0.0
147 */
148 public function get_redirect(WP_REST_Request $request)
149 {
150 try {
151 $service = $this->_get_service($request);
152 $result = $service->get_redirect($request->get_param('area'));
153 } catch (Exception $e) {
154 $result = $this->_prepare_error_response($e);
155 }
156
157 return rest_ensure_response($result);
158 }
159
160 /**
161 * Set the access denied redirect
162 *
163 * @param WP_REST_Request $request
164 *
165 * @return WP_REST_Response
166 * @access public
167 *
168 * @version 7.0.0
169 */
170 public function set_redirect(WP_REST_Request $request)
171 {
172 try {
173 $service = $this->_get_service($request);
174 $area = $request->get_param('area');
175 $data = $request->get_params();
176
177 // Preparing the proper array of properties to store
178 unset($data['area']);
179
180 // Finally set the redirect
181 $service->set_redirect($area, $data);
182
183 $result = $service->get_redirect($area);
184 } catch (Exception $e) {
185 $result = $this->_prepare_error_response($e);
186 }
187
188 return rest_ensure_response($result);
189 }
190
191 /**
192 * Reset the redirect rule
193 *
194 * @param WP_REST_Request $request
195 *
196 * @return WP_REST_Response
197 * @access public
198 *
199 * @version 7.0.0
200 */
201 public function reset_redirect(WP_REST_Request $request)
202 {
203 try {
204 $service = $this->_get_service($request);
205 $result = [
206 'success' => $service->reset($request->get_param('area'))
207 ];
208 } catch (Exception $e) {
209 $result = $this->_prepare_error_response($e);
210 }
211
212 return rest_ensure_response($result);
213 }
214
215 /**
216 * Validate the 'url' param
217 *
218 * @param string $value
219 *
220 * @return boolean|WP_Error
221 * @access private
222 *
223 * @version 7.0.0
224 */
225 private function _validate_url($value)
226 {
227 $response = true;
228 $url = AAM::api()->misc->sanitize_url($value);
229
230 if (empty($url)) {
231 $response = new WP_Error(
232 'rest_invalid_param',
233 'The provided url is not a valid URL',
234 [ 'status' => 400 ]
235 );
236 }
237
238 return $response;
239 }
240
241 /**
242 * Validate redirect page ID
243 *
244 * @param int $value
245 * @param WP_REST_Request $request
246 *
247 * @return boolean|WP_Error
248 * @access private
249 *
250 * @version 7.0.0
251 */
252 private function _validate_redirect_page_id($value, $request)
253 {
254 $response = true;
255 $rule_type = $request->get_param('type');
256 $page_id = intval($value);
257
258 if ($rule_type === 'page_redirect') {
259 if ($page_id === 0 || get_post($page_id) === null) {
260 $response = new WP_Error(
261 'rest_invalid_param',
262 'The redirect_page_id refers to non-existing page',
263 array('status' => 400)
264 );
265 }
266 }
267
268 return $response;
269 }
270
271 /**
272 * Validate redirect page slug
273 *
274 * @param string $value
275 * @param WP_REST_Request $request
276 *
277 * @return boolean|WP_Error
278 * @access private
279 *
280 * @version 7.0.6
281 */
282 private function _validate_redirect_page_slug($value, $request)
283 {
284 $response = true;
285 $rule_type = $request->get_param('type');
286
287 if ($rule_type === 'page_redirect') {
288 $result = AAM::api()->misc->get_post_by_slug($value);
289
290 if (empty($result)) {
291 $response = new WP_Error(
292 'rest_invalid_param',
293 'The redirect_page_slug refers to non-existing page',
294 array('status' => 400)
295 );
296 }
297 }
298
299 return $response;
300 }
301
302 /**
303 * Validate redirect URL
304 *
305 * @param string $value
306 * @param WP_REST_Request $request
307 *
308 * @return boolean|WP_Error
309 * @access private
310 *
311 * @version 7.0.0
312 */
313 private function _validate_redirect_url($value, $request)
314 {
315 $response = true;
316 $rule_type = $request->get_param('type');
317 $url = AAM::api()->misc->sanitize_url($value);
318
319 if ($rule_type === 'url_redirect' && empty($url)) {
320 $response = new WP_Error(
321 'rest_invalid_param',
322 'The redirect_url is not valid URL',
323 array('status' => 400)
324 );
325 }
326
327 return $response;
328 }
329
330 /**
331 * Validate the callback value
332 *
333 * @param string $value
334 * @param WP_REST_Request $request
335 *
336 * @return boolean|WP_Error
337 * @access private
338 *
339 * @version 7.0.0
340 */
341 private function _validate_callback($value, $request)
342 {
343 $response = true;
344 $rule_type = $request->get_param('type');
345
346 if ($rule_type === 'trigger_callback'
347 && is_callable($value, true) === false
348 ) {
349 $response = new WP_Error(
350 'rest_invalid_param',
351 'The callback is not valid PHP callback',
352 [ 'status' => 400 ]
353 );
354 }
355
356 return $response;
357 }
358
359 /**
360 * Validate the custom message value
361 *
362 * @param string $value
363 * @param WP_REST_Request $request
364 *
365 * @return boolean|WP_Error
366 * @access private
367 *
368 * @version 7.0.0
369 */
370 private function _validate_message($value, $request)
371 {
372 $response = true;
373 $rule_type = $request->get_param('type');
374
375 if ($rule_type === 'custom_message' && empty($value)) {
376 $response = new WP_Error(
377 'rest_invalid_param',
378 'The custom message cannot be empty',
379 [ 'status' => 400 ]
380 );
381 }
382
383 return $response;
384 }
385
386 /**
387 * Validate HTTP status code
388 *
389 * @param int $value
390 * @param WP_REST_Request $request
391 *
392 * @return boolean|WP_Error
393 * @access private
394 *
395 * @version 7.0.0
396 */
397 private function _validate_http_status_code($value, $request)
398 {
399 $type = $request->get_param('type');
400 $code = intval($value);
401 $valid = false;
402
403 if (in_array($type, ['default', 'custom_message'], true)) {
404 $valid = ($code >= 400 && $code <= 499) || ($code >= 500 && $code <= 599);
405 } elseif (in_array($type, ['page_redirect', 'url_redirect'], true)) {
406 $valid = $code >= 300 && $code <= 399;
407 } elseif ($type === 'trigger_callback') {
408 $valid = $code >= 300 && $code <= 599;
409 }
410
411 if ($valid === false) {
412 $response = new WP_Error(
413 'rest_invalid_param',
414 'The http_status_code is invalid for given redirect type',
415 [ 'status' => 400 ]
416 );
417 } else {
418 $response = true;
419 }
420
421 return $response;
422 }
423
424 /**
425 * Get Access Denied Redirect framework service
426 *
427 * @param WP_REST_Request $request
428 *
429 * @return AAM_Framework_Service_AccessDeniedRedirect
430 * @access private
431 *
432 * @version 7.0.0
433 */
434 private function _get_service($request)
435 {
436 return AAM::api()->access_denied_redirect(
437 $this->_determine_access_level($request),
438 [ 'error_handling' => 'exception' ]
439 );
440 }
441
442 }