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 / Identity.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
Identity.php
688 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 Users & Roles (aka Identity) Governance service
12 *
13 * @package AAM
14 * @version 7.0.0
15 */
16 class AAM_Restful_Identity
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_identities'
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 // Define some common properties
44 $effect = [
45 'type' => 'string',
46 'default' => 'deny',
47 'enum' => [ 'allow', 'deny' ]
48 ];
49
50 $permission = [
51 'type' => 'string',
52 'required' => true
53 ];
54
55 $permissions = [
56 'description' => 'Collection of permissions',
57 'type' => 'array',
58 'required' => true,
59 'items' => [
60 'type' => 'object',
61 'properties' => [
62 'permission' => $permission,
63 'effect' => $effect
64 ]
65 ]
66 ];
67
68 $role_slug = [
69 'description' => 'Role slug',
70 'type' => 'string',
71 'required' => true
72 ];
73
74 $user_id = [
75 'description' => 'User id',
76 'type' => [ 'number', 'string' ],
77 'required' => true
78 ];
79
80 // Get the list of roles with permissions
81 $this->_register_route('/identity/roles', [
82 'methods' => WP_REST_Server::READABLE,
83 'callback' => [ $this, 'get_roles' ]
84 ], self::PERMISSIONS);
85
86 // Get a specific role with permissions
87 $this->_register_route('/identity/role/(?P<slug>.+)', [
88 'methods' => WP_REST_Server::READABLE,
89 'callback' => [ $this, 'get_role' ],
90 'args' => [
91 'slug' => $role_slug
92 ]
93 ], self::PERMISSIONS);
94
95 // Set role identity permissions
96 $this->_register_route('/identity/role/(?P<slug>[^/]+)', [
97 'methods' => WP_REST_Server::EDITABLE,
98 'callback' => array($this, 'set_role_permissions'),
99 'args' => [
100 'slug' => $role_slug,
101 'permissions' => $permissions
102 ]
103 ], self::PERMISSIONS);
104
105 // Set a single permission for a role identity
106 $this->_register_route('/identity/role/(?P<slug>.+)/(?P<permission>[\w\-]+)', [
107 'methods' => WP_REST_Server::EDITABLE,
108 'callback' => [ $this, 'set_role_permission' ],
109 'args' => [
110 'slug' => $role_slug,
111 'permission' => $permission,
112 'effect' => $effect
113 ]
114 ], self::PERMISSIONS);
115
116 // Reset permissions for all roles
117 $this->_register_route('/identity/roles', [
118 'methods' => WP_REST_Server::DELETABLE,
119 'callback' => [ $this, 'reset_roles_permissions' ]
120 ], self::PERMISSIONS);
121
122 // Reset specific role permissions
123 $this->_register_route('/identity/role/(?P<slug>.+)', [
124 'methods' => WP_REST_Server::DELETABLE,
125 'callback' => [ $this, 'reset_role_permissions' ],
126 'args' => [
127 'slug' => $role_slug
128 ]
129 ], self::PERMISSIONS);
130
131 // Get the list of user identities
132 $this->_register_route('/identity/users', [
133 'methods' => WP_REST_Server::READABLE,
134 'callback' => [ $this, 'get_users' ],
135 'args' => [
136 'search' => [
137 'description' => 'Search string',
138 'type' => 'string'
139 ],
140 'offset' => [
141 'description' => 'Pagination offset',
142 'type' => 'number',
143 'default' => 0
144 ],
145 'per_page' => [
146 'description' => 'Pagination limit per page',
147 'type' => 'number',
148 'default' => 10
149 ],
150 'role' => [
151 'description' => 'Return users only for given role',
152 'type' => 'string'
153 ]
154 ]
155 ], self::PERMISSIONS);
156
157 // Get a specific user with permissions
158 $this->_register_route('/identity/user/(?P<id>[\d]+)', [
159 'methods' => WP_REST_Server::READABLE,
160 'callback' => [ $this, 'get_user' ],
161 'args' => [
162 'id' => $user_id
163 ]
164 ], self::PERMISSIONS);
165
166 // Set user identity permissions
167 $this->_register_route('/identity/user/(?P<id>[\d]+)', [
168 'methods' => WP_REST_Server::EDITABLE,
169 'callback' => array($this, 'set_user_permissions'),
170 'args' => [
171 'id' => $user_id,
172 'permissions' => $permissions
173 ]
174 ], self::PERMISSIONS);
175
176 // Set a single permission for a user identity
177 $this->_register_route('/identity/user/(?P<id>[\d]+)/(?P<permission>[\w\-]+)', [
178 'methods' => WP_REST_Server::EDITABLE,
179 'callback' => [ $this, 'set_user_permission' ],
180 'args' => [
181 'id' => $user_id,
182 'permission' => $permission,
183 'effect' => $effect
184 ]
185 ], self::PERMISSIONS);
186
187 // Reset permissions for all users
188 $this->_register_route('/identity/users', [
189 'methods' => WP_REST_Server::DELETABLE,
190 'callback' => [ $this, 'reset_users_permissions' ]
191 ], self::PERMISSIONS);
192
193 // Reset specific user permissions
194 $this->_register_route('/identity/user/(?P<id>[\d]+)', [
195 'methods' => WP_REST_Server::DELETABLE,
196 'callback' => [ $this, 'reset_user_permissions' ],
197 'args' => [
198 'id' => $user_id
199 ]
200 ], self::PERMISSIONS);
201 });
202 }
203
204 /**
205 * Get list of roles with permissions
206 *
207 * @param WP_REST_Request $request
208 *
209 * @return WP_REST_Response
210 * @access public
211 *
212 * @version 7.0.0
213 */
214 public function get_roles(WP_REST_Request $request)
215 {
216 try {
217 $result = [];
218
219 foreach(AAM::api()->roles->get_editable_roles() as $role) {
220 array_push($result, $this->_prepare_role_output(
221 $role, $this->_determine_access_level($request)
222 ));
223 }
224 } catch (Exception $e) {
225 $result = $this->_prepare_error_response($e);
226 }
227
228 return rest_ensure_response($result);
229 }
230
231 /**
232 * Get a specific role with permissions
233 *
234 * @param WP_REST_Request $request
235 *
236 * @return WP_REST_Response
237 * @access public
238 *
239 * @version 7.0.0
240 */
241 public function get_role(WP_REST_Request $request)
242 {
243 try {
244 $result = $this->_prepare_role_output(
245 AAM::api()->roles->get_role($request->get_param('slug')),
246 $this->_determine_access_level($request)
247 );
248 } catch (Exception $e) {
249 $result = $this->_prepare_error_response($e);
250 }
251
252 return rest_ensure_response($result);
253 }
254
255 /**
256 * Set a single role permissions
257 *
258 * @param WP_REST_Request $request
259 *
260 * @return WP_REST_Response
261 * @access public
262 *
263 * @version 7.0.0
264 */
265 public function set_role_permissions(WP_REST_Request $request)
266 {
267 try {
268 $role = AAM::api()->roles->get_role($request->get_param('slug'));
269 $access_level = $this->_determine_access_level($request);
270
271 $this->_set_identity_permissions(
272 $role,
273 $request->get_param('permissions'),
274 $access_level
275 );
276
277 $result = $this->_prepare_role_output($role, $access_level);
278 } catch (Exception $e) {
279 $result = $this->_prepare_error_response($e);
280 }
281
282 return rest_ensure_response($result);
283 }
284
285 /**
286 * Set role single permission
287 *
288 * @param WP_REST_Request $request
289 *
290 * @return WP_REST_Response
291 * @access public
292 *
293 * @version 7.0.0
294 */
295 public function set_role_permission(WP_REST_Request $request)
296 {
297 try {
298 $role = AAM::api()->roles->get_role($request->get_param('slug'));
299 $access_level = $this->_determine_access_level($request);
300
301 $result = $this->_set_identity_permission(
302 $role,
303 $request->get_param('permission'),
304 $request->get_param('effect'),
305 $access_level
306 );
307
308 return $this->_prepare_role_output($role, $access_level);
309 } catch (Exception $e) {
310 $result = $this->_prepare_error_response($e);
311 }
312
313 return rest_ensure_response($result);
314 }
315
316 /**
317 * Reset permissions for all roles
318 *
319 * @param WP_REST_Request $request
320 *
321 * @return WP_REST_Response
322 * @access public
323 *
324 * @version 7.0.0
325 */
326 public function reset_roles_permissions(WP_REST_Request $request)
327 {
328 try {
329 $result = [
330 'success' => AAM::api()->roles(
331 $this->_determine_access_level($request)
332 )->reset()
333 ];
334 } catch (Exception $e) {
335 $result = $this->_prepare_error_response($e);
336 }
337
338 return rest_ensure_response($result);
339 }
340
341 /**
342 * Reset permissions for a single role
343 *
344 * @param WP_REST_Request $request
345 *
346 * @return WP_REST_Response
347 * @access public
348 *
349 * @version 7.0.0
350 */
351 public function reset_role_permissions(WP_REST_Request $request)
352 {
353 try {
354 $result = [
355 'success' => AAM::api()->roles(
356 $this->_determine_access_level($request)
357 )->reset($request->get_param('slug'))
358 ];
359 } catch (Exception $e) {
360 $result = $this->_prepare_error_response($e);
361 }
362
363 return rest_ensure_response($result);
364 }
365
366 /**
367 * Get paginated list of users with permissions
368 *
369 * @param WP_REST_Request $request
370 *
371 * @return WP_REST_Response
372 * @access public
373 *
374 * @version 7.0.0
375 */
376 public function get_users(WP_REST_Request $request)
377 {
378 try {
379 // Prepare the list of filters
380 $filters = [
381 'number' => $request->get_param('per_page'),
382 'search' => $request->get_param('search'),
383 'offset' => $request->get_param('offset')
384 ];
385
386 $role_filter = $request->get_param('role');
387
388 if (!empty($role_filter)) {
389 $filters['role__in'] = $role_filter;
390 }
391
392 // Modify the search, if not empty
393 if (!empty($filters['search'])) {
394 $filters['search'] .= '*';
395 }
396
397 // Iterate over the list of all users and enrich it with additional
398 // attributes
399 $result = [
400 'list' => [],
401 'summary' => [
402 'total_count' => AAM::api()->users->get_user_count(),
403 'filtered_count' => AAM::api()->users->get_user_count($filters)
404 ]
405 ];
406
407 $access_level = $this->_determine_access_level($request);
408
409 foreach(AAM::api()->users->get_users($filters) as $user) {
410 array_push($result['list'], $this->_prepare_user_output(
411 $user, $access_level
412 ));
413 }
414 } catch (Exception $e) {
415 $result = $this->_prepare_error_response($e);
416 }
417
418 return rest_ensure_response($result);
419 }
420
421 /**
422 * Get a specific user with permissions
423 *
424 * @param WP_REST_Request $request
425 *
426 * @return WP_REST_Response
427 * @access public
428 *
429 * @version 7.0.0
430 */
431 public function get_user(WP_REST_Request $request)
432 {
433 try {
434 $result = $this->_prepare_user_output(
435 AAM::api()->users->get_user($request->get_param('id')),
436 $this->_determine_access_level($request)
437 );
438 } catch (Exception $e) {
439 $result = $this->_prepare_error_response($e);
440 }
441
442 return rest_ensure_response($result);
443 }
444
445 /**
446 * Set a single user permissions
447 *
448 * @param WP_REST_Request $request
449 *
450 * @return WP_REST_Response
451 * @access public
452 *
453 * @version 7.0.0
454 */
455 public function set_user_permissions(WP_REST_Request $request)
456 {
457 try {
458 $user = AAM::api()->users->get_user($request->get_param('id'));
459 $access_level = $this->_determine_access_level($request);
460
461 $this->_set_identity_permissions(
462 $user,
463 $request->get_param('permissions'),
464 $access_level
465 );
466
467 $result = $this->_prepare_user_output($user, $access_level);
468 } catch (Exception $e) {
469 $result = $this->_prepare_error_response($e);
470 }
471
472 return rest_ensure_response($result);
473 }
474
475 /**
476 * Set user single permission
477 *
478 * @param WP_REST_Request $request
479 *
480 * @return WP_REST_Response
481 * @access public
482 *
483 * @version 7.0.0
484 */
485 public function set_user_permission(WP_REST_Request $request)
486 {
487 try {
488 $user = AAM::api()->users->get_user($request->get_param('id'));
489 $access_level = $this->_determine_access_level($request);
490
491 $this->_set_identity_permission(
492 $user,
493 $request->get_param('permission'),
494 $request->get_param('effect'),
495 $access_level
496 );
497
498 $result = $this->_prepare_user_output($user, $access_level);
499 } catch (Exception $e) {
500 $result = $this->_prepare_error_response($e);
501 }
502
503 return rest_ensure_response($result);
504 }
505
506 /**
507 * Reset permissions for all users
508 *
509 * @param WP_REST_Request $request
510 *
511 * @return WP_REST_Response
512 * @access public
513 *
514 * @version 7.0.0
515 */
516 public function reset_users_permissions(WP_REST_Request $request)
517 {
518 try {
519 $result = [
520 'success' => AAM::api()->users(
521 $this->_determine_access_level($request)
522 )->reset()
523 ];
524 } catch (Exception $e) {
525 $result = $this->_prepare_error_response($e);
526 }
527
528 return rest_ensure_response($result);
529 }
530
531 /**
532 * Reset permissions for a single user
533 *
534 * @param WP_REST_Request $request
535 *
536 * @return WP_REST_Response
537 * @access public
538 *
539 * @version 7.0.0
540 */
541 public function reset_user_permissions(WP_REST_Request $request)
542 {
543 try {
544 $result = [
545 'success' => AAM::api()->users(
546 $this->_determine_access_level($request)
547 )->reset($request->get_param('id'))
548 ];
549 } catch (Exception $e) {
550 $result = $this->_prepare_error_response($e);
551 }
552
553 return rest_ensure_response($result);
554 }
555
556 /**
557 * Prepare the role output
558 *
559 * @param AAM_Framework_Proxy_Role $role
560 * @param AAM_Framework_AccessLevel_Interface $access_level
561 *
562 * @return array
563 * @access private
564 *
565 * @version 7.0.0
566 */
567 private function _prepare_role_output($role, $access_level)
568 {
569 $resource = $access_level->get_resource(
570 AAM_Framework_Type_Resource::ROLE
571 );
572
573 return [
574 'id' => $role->slug,
575 'name' => $role->display_name,
576 'permissions' => $resource->get_permissions($role->get_core_instance()),
577 'is_customized' => $resource->is_customized($role->get_core_instance())
578 ];
579 }
580
581 /**
582 * Prepare the user output
583 *
584 * @param AAM_Framework_Proxy_User $user
585 * @param AAM_Framework_AccessLevel_Interface $access_level
586 *
587 * @return array
588 * @access private
589 *
590 * @version 7.0.0
591 */
592 private function _prepare_user_output($user, $access_level)
593 {
594 $resource = $access_level->get_resource(
595 AAM_Framework_Type_Resource::USER
596 );
597
598 // Prepare user's display name
599 if ($user->first_name && $user->last_name) {
600 $display_name = sprintf('%s %s', $user->first_name, $user->last_name);
601 } elseif ( $user->first_name ) {
602 $display_name = $user->first_name;
603 } elseif ( $user->last_name ) {
604 $display_name = $user->last_name;
605 } else {
606 $display_name = $user->user_email;
607 }
608
609 return [
610 'id' => $user->ID,
611 'display_name' => $display_name,
612 'permissions' => $resource->get_permissions($user->get_core_instance()),
613 'is_customized' => $resource->is_customized($user->get_core_instance())
614 ];
615 }
616
617 /**
618 * Set identity permissions
619 *
620 * @param AAM_Framework_Proxy_Interface $identity
621 * @param array $permissions
622 * @param AAM_Framework_AccessLevel_Interface $access_level
623 *
624 * @return array
625 * @access private
626 *
627 * @version 7.0.0
628 */
629 private function _set_identity_permissions(
630 $identity, $permissions, $access_level
631 ) {
632 // Prepare proper resource
633 if (is_a($identity, AAM_Framework_Proxy_Role::class)) {
634 $resource = $access_level->get_resource(
635 AAM_Framework_Type_Resource::ROLE
636 );
637 } else {
638 $resource = $access_level->get_resource(
639 AAM_Framework_Type_Resource::USER
640 );
641 }
642
643 $normalized = [];
644
645 // Normalize the array of permissions
646 foreach($permissions as $permission) {
647 $normalized[$permission['permission']] = [
648 'effect' => $permission['effect']
649 ];
650 }
651
652 return $resource->set_permissions(
653 $normalized,
654 $identity->get_core_instance()
655 );
656 }
657
658 /**
659 * Set a single permission for a given identity
660 *
661 * @param AAM_Framework_Proxy_Interface $identity
662 * @param string $permission
663 * @param string $effect
664 * @param AAM_Framework_AccessLevel_Interface $access_level
665 *
666 * @return array
667 * @access private
668 *
669 * @version 7.0.0
670 */
671 private function _set_identity_permission(
672 $identity, $permission, $effect, $access_level
673 ) {
674 // Prepare proper resource
675 if (is_a($identity, AAM_Framework_Proxy_Role::class)) {
676 $resource = $access_level->get_resource(
677 AAM_Framework_Type_Resource::ROLE
678 );
679 } else {
680 $resource = $access_level->get_resource(
681 AAM_Framework_Type_Resource::USER
682 );
683 }
684
685 return $resource->set_permission($identity, $permission, $effect);
686 }
687
688 }