| @@ -16,9 +16,9 @@ | ||
| 16 | 16 | /** |
| 17 | 17 | * Contains functions for interfacing with WordPress users and syncing between |
| 18 | 18 | * them and users in the Authorizer lists. |
| 19 | 19 | */ |
| 20 | -class Sync_Userdata extends Static_Instance { | |
| 20 | +class Sync_Userdata extends Singleton { | |
| 21 | 21 | |
| 22 | 22 | /** |
| 23 | 23 | * Adds all WordPress users in the current site to the approved list, |
| 24 | 24 | * unless they are already in the blocked list. Also removes them |
| @@ -30,9 +30,9 @@ | ||
| 30 | 30 | */ |
| 31 | 31 | public function add_wp_users_to_approved_list() { |
| 32 | 32 | $options = Options::get_instance(); |
| 33 | 33 | // Add current WordPress users to the approved list. |
| 34 | - $auth_multisite_settings_access_users_approved = is_multisite() ? get_blog_option( get_network()->blog_id, 'auth_multisite_settings_access_users_approved', array() ) : array(); | |
| 34 | + $auth_multisite_settings_access_users_approved = is_multisite() ? get_blog_option( get_main_site_id( get_main_network_id() ), 'auth_multisite_settings_access_users_approved', array() ) : array(); | |
| 35 | 35 | $auth_settings_access_users_pending = $options->get( 'access_users_pending', Helper::SINGLE_CONTEXT ); |
| 36 | 36 | $auth_settings_access_users_approved = $options->get( 'access_users_approved', Helper::SINGLE_CONTEXT ); |
| 37 | 37 | $auth_settings_access_users_blocked = $options->get( 'access_users_blocked', Helper::SINGLE_CONTEXT ); |
| 38 | 38 | $updated = false; |
| @@ -56,9 +56,9 @@ | ||
| 56 | 56 | if ( ! Helper::in_multi_array( $user->user_email, $auth_settings_access_users_approved ) ) { |
| 57 | 57 | $approved_user = array( |
| 58 | 58 | 'email' => Helper::lowercase( $user->user_email ), |
| 59 | 59 | 'role' => count( $user->roles ) > 0 ? $user->roles[0] : '', |
| 60 | - 'date_added' => date( 'M Y', strtotime( $user->user_registered ) ), | |
| 60 | + 'date_added' => wp_date( 'M Y', strtotime( $user->user_registered ) ), | |
| 61 | 61 | 'local_user' => true, |
| 62 | 62 | ); |
| 63 | 63 | array_push( $auth_settings_access_users_approved, $approved_user ); |
| 64 | 64 | $updated = true; |
| @@ -198,37 +198,25 @@ | ||
| 198 | 198 | } |
| 199 | 199 | |
| 200 | 200 | |
| 201 | 201 | /** |
| 202 | - * Keep authorizer approved users' roles in sync with WordPress roles | |
| 203 | - * if someone changes the role via the WordPress Edit User page | |
| 204 | - * (wp-admin/user-edit.php or wp-admin/profile.php). | |
| 202 | + * Update user role in approved list if it's changed via bulk action on the | |
| 203 | + * WordPress list users page. | |
| 205 | 204 | * |
| 206 | - * Action: user_profile_update_errors | |
| 205 | + * @hook set_user_role | |
| 207 | 206 | * |
| 208 | - * @param WP_Error $errors Errors object to add any custom errors to (passed by reference). | |
| 209 | - * @param bool $update True if updating existing user, false if saving a new one. | |
| 210 | - * @param stdClass $user Updated WP_User object for user being edited (passed by reference). | |
| 207 | + * @param integer $user_id The user ID. | |
| 208 | + * @param string $role The new role. | |
| 209 | + * @param array $old_roles An array of the user's previous roles. | |
| 211 | 210 | */ |
| 212 | - public function edit_user_profile_update_role( &$errors, $update, &$user ) { | |
| 213 | - // Do nothing if we're not updating role. | |
| 214 | - if ( ! property_exists( $user, 'role' ) ) { | |
| 211 | + public function set_user_role_sync_role( $user_id = 0, $role = '', $old_roles = array() ) { | |
| 212 | + // Ensure valid user ID and user has permission to edit this user. | |
| 213 | + if ( empty( $user_id ) || ! current_user_can( 'edit_user', $user_id ) ) { | |
| 215 | 214 | return; |
| 216 | 215 | } |
| 217 | 216 | |
| 218 | - // Safety check; will likely not fire if we reach this function. | |
| 219 | - if ( ! current_user_can( 'edit_user', $user->ID ) ) { | |
| 220 | - return; | |
| 221 | - } | |
| 222 | - | |
| 223 | - // Don't perform Authorizer updates if we have a WordPress error. | |
| 224 | - $errors_on_user_update = $errors->get_error_codes(); | |
| 225 | - if ( ! empty( $errors_on_user_update ) ) { | |
| 226 | - return; | |
| 227 | - } | |
| 228 | - | |
| 229 | 217 | // Get original user object (fail if not a real WordPress user). |
| 230 | - $userdata = get_userdata( $user->ID ); | |
| 218 | + $userdata = get_userdata( $user_id ); | |
| 231 | 219 | if ( ! $userdata ) { |
| 232 | 220 | return; |
| 233 | 221 | } |
| 234 | 222 | |
| @@ -233,16 +221,25 @@ | ||
| 233 | 221 | } |
| 234 | 222 | |
| 235 | 223 | // If user is in approved list, update his/her associated role. |
| 236 | 224 | if ( Authorization::get_instance()->is_email_in_list( $userdata->user_email, 'approved' ) ) { |
| 225 | + $changed = false; | |
| 237 | 226 | $options = Options::get_instance(); |
| 238 | 227 | $auth_settings_access_users_approved = $options->sanitize_user_list( $options->get( 'access_users_approved', Helper::SINGLE_CONTEXT ) ); |
| 239 | 228 | foreach ( $auth_settings_access_users_approved as $key => $check_user ) { |
| 240 | 229 | if ( 0 === strcasecmp( $check_user['email'], $userdata->user_email ) ) { |
| 241 | - $auth_settings_access_users_approved[ $key ]['role'] = $user->role; | |
| 230 | + if ( empty( $role ) ) { | |
| 231 | + unset( $auth_settings_access_users_approved[ $key ] ); | |
| 232 | + $changed = true; | |
| 233 | + } elseif ( $auth_settings_access_users_approved[ $key ]['role'] !== $role ) { | |
| 234 | + $auth_settings_access_users_approved[ $key ]['role'] = $role; | |
| 235 | + $changed = true; | |
| 236 | + } | |
| 242 | 237 | } |
| 243 | 238 | } |
| 244 | - update_option( 'auth_settings_access_users_approved', $auth_settings_access_users_approved ); | |
| 239 | + if ( $changed ) { | |
| 240 | + update_option( 'auth_settings_access_users_approved', $auth_settings_access_users_approved ); | |
| 241 | + } | |
| 245 | 242 | } |
| 246 | 243 | } |
| 247 | 244 | |
| 248 | 245 | |
| @@ -284,9 +281,9 @@ | ||
| 284 | 281 | if ( 0 === strcasecmp( $check_user['email'], $userdata['user_email'] ) ) { |
| 285 | 282 | unset( $auth_multisite_settings_access_users_approved[ $key ] ); |
| 286 | 283 | } |
| 287 | 284 | } |
| 288 | - update_blog_option( get_network()->blog_id, 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 285 | + update_blog_option( get_main_site_id( get_main_network_id() ), 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 289 | 286 | } |
| 290 | 287 | |
| 291 | 288 | // Go through all approved lists on individual sites and sync this user there. |
| 292 | 289 | // phpcs:ignore WordPress.WP.DeprecatedFunctions.wp_get_sitesFound |
| @@ -315,24 +312,22 @@ | ||
| 315 | 312 | if ( $updated ) { |
| 316 | 313 | update_blog_option( $blog_id, 'auth_settings_access_users_approved', $auth_settings_access_users_approved ); |
| 317 | 314 | } |
| 318 | 315 | } |
| 319 | - } else { | |
| 316 | + } elseif ( Authorization::get_instance()->is_email_in_list( $user['user_email'], 'approved' ) ) { | |
| 320 | 317 | // In a single site environment, just find the old user in the approved list and update the email. |
| 321 | - if ( Authorization::get_instance()->is_email_in_list( $user['user_email'], 'approved' ) ) { | |
| 322 | - $auth_settings_access_users_approved = $options->sanitize_user_list( $options->get( 'access_users_approved', Helper::SINGLE_CONTEXT ) ); | |
| 323 | - foreach ( $auth_settings_access_users_approved as $key => $check_user ) { | |
| 324 | - // Update old user email in approved list to the new email. | |
| 325 | - if ( 0 === strcasecmp( $check_user['email'], $user['user_email'] ) ) { | |
| 326 | - $auth_settings_access_users_approved[ $key ]['email'] = Helper::lowercase( $userdata['user_email'] ); | |
| 327 | - } | |
| 328 | - // If new user email is already in approved list, remove that entry. | |
| 329 | - if ( 0 === strcasecmp( $check_user['email'], $userdata['user_email'] ) ) { | |
| 330 | - unset( $auth_settings_access_users_approved[ $key ] ); | |
| 331 | - } | |
| 318 | + $auth_settings_access_users_approved = $options->sanitize_user_list( $options->get( 'access_users_approved', Helper::SINGLE_CONTEXT ) ); | |
| 319 | + foreach ( $auth_settings_access_users_approved as $key => $check_user ) { | |
| 320 | + // Update old user email in approved list to the new email. | |
| 321 | + if ( 0 === strcasecmp( $check_user['email'], $user['user_email'] ) ) { | |
| 322 | + $auth_settings_access_users_approved[ $key ]['email'] = Helper::lowercase( $userdata['user_email'] ); | |
| 332 | 323 | } |
| 333 | - update_option( 'auth_settings_access_users_approved', $auth_settings_access_users_approved ); | |
| 324 | + // If new user email is already in approved list, remove that entry. | |
| 325 | + if ( 0 === strcasecmp( $check_user['email'], $userdata['user_email'] ) ) { | |
| 326 | + unset( $auth_settings_access_users_approved[ $key ] ); | |
| 327 | + } | |
| 334 | 328 | } |
| 329 | + update_option( 'auth_settings_access_users_approved', $auth_settings_access_users_approved ); | |
| 335 | 330 | } |
| 336 | 331 | |
| 337 | 332 | // We're hooking into this filter merely for its location in the codebase, |
| 338 | 333 | // so make sure to return the filter value unmodified. |
| @@ -395,9 +390,9 @@ | ||
| 395 | 390 | unset( $auth_multisite_settings_access_users_approved[ $key ] ); |
| 396 | 391 | } |
| 397 | 392 | } |
| 398 | 393 | if ( $list_changed ) { |
| 399 | - update_blog_option( get_network()->blog_id, 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 394 | + update_blog_option( get_main_site_id( get_main_network_id() ), 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 400 | 395 | } |
| 401 | 396 | |
| 402 | 397 | // Go through all pending/approved lists on individual sites and remove this user from them. |
| 403 | 398 | // phpcs:ignore WordPress.WP.DeprecatedFunctions.wp_get_sitesFound |
| @@ -405,9 +400,8 @@ | ||
| 405 | 400 | foreach ( $sites as $site ) { |
| 406 | 401 | $blog_id = function_exists( 'get_sites' ) ? $site->blog_id : $site['blog_id']; |
| 407 | 402 | $this->remove_network_user_from_site_when_removed( $user_id, $blog_id ); |
| 408 | 403 | } |
| 409 | - | |
| 410 | 404 | } |
| 411 | 405 | |
| 412 | 406 | |
| 413 | 407 | /** |
| @@ -464,9 +458,9 @@ | ||
| 464 | 458 | if ( ! Helper::in_multi_array( $user_email, $auth_settings_access_users_approved ) && ! Helper::in_multi_array( $user_email, $auth_settings_access_users_blocked ) ) { |
| 465 | 459 | $approved_user = array( |
| 466 | 460 | 'email' => Helper::lowercase( $user_email ), |
| 467 | 461 | 'role' => $user_role, |
| 468 | - 'date_added' => date( 'M Y', strtotime( $user->user_registered ) ), | |
| 462 | + 'date_added' => wp_date( 'M Y', strtotime( $user->user_registered ) ), | |
| 469 | 463 | 'local_user' => true, |
| 470 | 464 | ); |
| 471 | 465 | array_push( $auth_settings_access_users_approved, $approved_user ); |
| 472 | 466 | update_option( 'auth_settings_access_users_approved', $auth_settings_access_users_approved ); |
| @@ -558,9 +552,9 @@ | ||
| 558 | 552 | * @param array $default_role Default role, if no role specified. |
| 559 | 553 | */ |
| 560 | 554 | protected function add_user_to_authorizer_when_created( $user_email, $date_registered, $user_roles = array(), $default_role = array() ) { |
| 561 | 555 | $options = Options::get_instance(); |
| 562 | - $auth_multisite_settings_access_users_approved = is_multisite() ? get_blog_option( get_network()->blog_id, 'auth_multisite_settings_access_users_approved', array() ) : array(); | |
| 556 | + $auth_multisite_settings_access_users_approved = is_multisite() ? get_blog_option( get_main_site_id( get_main_network_id() ), 'auth_multisite_settings_access_users_approved', array() ) : array(); | |
| 563 | 557 | $auth_settings_access_users_pending = $options->get( 'access_users_pending', Helper::SINGLE_CONTEXT ); |
| 564 | 558 | $auth_settings_access_users_approved = $options->get( 'access_users_approved', Helper::SINGLE_CONTEXT ); |
| 565 | 559 | $auth_settings_access_users_blocked = $options->get( 'access_users_blocked', Helper::SINGLE_CONTEXT ); |
| 566 | 560 | |
| @@ -573,12 +567,14 @@ | ||
| 573 | 567 | // name to save (and default to no role if the display name isn't found). |
| 574 | 568 | global $wp_roles; |
| 575 | 569 | $default_role_display_name = $default_role['name']; |
| 576 | 570 | $default_role = ''; |
| 577 | - foreach ( $wp_roles->role_names as $role_name => $display_name ) { | |
| 578 | - if ( $default_role_display_name === $display_name ) { | |
| 579 | - $default_role = $role_name; | |
| 580 | - break; | |
| 571 | + if ( ! empty( $wp_roles ) && is_array( $wp_roles->role_names ) ) { | |
| 572 | + foreach ( $wp_roles->role_names as $role_name => $display_name ) { | |
| 573 | + if ( $default_role_display_name === $display_name ) { | |
| 574 | + $default_role = $role_name; | |
| 575 | + break; | |
| 576 | + } | |
| 581 | 577 | } |
| 582 | 578 | } |
| 583 | 579 | } |
| 584 | 580 | |
| @@ -603,9 +599,9 @@ | ||
| 603 | 599 | if ( ! Helper::in_multi_array( $user_email, $auth_settings_access_users_approved ) ) { |
| 604 | 600 | $approved_user = array( |
| 605 | 601 | 'email' => Helper::lowercase( $user_email ), |
| 606 | 602 | 'role' => is_array( $user_roles ) && count( $user_roles ) > 0 ? $user_roles[0] : $default_role, |
| 607 | - 'date_added' => date( 'M Y', strtotime( $date_registered ) ), | |
| 603 | + 'date_added' => wp_date( 'M Y', strtotime( $date_registered ) ), | |
| 608 | 604 | 'local_user' => true, |
| 609 | 605 | ); |
| 610 | 606 | array_push( $auth_settings_access_users_approved, $approved_user ); |
| 611 | 607 | $updated = true; |
| @@ -640,13 +636,13 @@ | ||
| 640 | 636 | if ( ! Helper::in_multi_array( $user_email, $auth_multisite_settings_access_users_approved ) ) { |
| 641 | 637 | $multisite_approved_user = array( |
| 642 | 638 | 'email' => Helper::lowercase( $user_email ), |
| 643 | 639 | 'role' => count( $user->roles ) > 0 ? $user->roles[0] : 'administrator', |
| 644 | - 'date_added' => date( 'M Y', strtotime( $user->user_registered ) ), | |
| 640 | + 'date_added' => wp_date( 'M Y', strtotime( $user->user_registered ) ), | |
| 645 | 641 | 'local_user' => true, |
| 646 | 642 | ); |
| 647 | 643 | array_push( $auth_multisite_settings_access_users_approved, $multisite_approved_user ); |
| 648 | - update_blog_option( get_network()->blog_id, 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 644 | + update_blog_option( get_main_site_id( get_main_network_id() ), 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 649 | 645 | } |
| 650 | 646 | |
| 651 | 647 | // Go through all pending/approved lists on individual sites and remove this user from them. |
| 652 | 648 | // phpcs:ignore WordPress.WP.DeprecatedFunctions.wp_get_sitesFound |
| @@ -654,9 +650,8 @@ | ||
| 654 | 650 | foreach ( $sites as $site ) { |
| 655 | 651 | $blog_id = function_exists( 'get_sites' ) ? $site->blog_id : $site['blog_id']; |
| 656 | 652 | $this->remove_network_user_from_site_when_removed( $user_id, $blog_id ); |
| 657 | 653 | } |
| 658 | - | |
| 659 | 654 | } |
| 660 | 655 | |
| 661 | 656 | |
| 662 | 657 | /** |
| @@ -685,9 +680,9 @@ | ||
| 685 | 680 | unset( $auth_multisite_settings_access_users_approved[ $key ] ); |
| 686 | 681 | } |
| 687 | 682 | } |
| 688 | 683 | if ( $list_changed ) { |
| 689 | - update_blog_option( get_network()->blog_id, 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 684 | + update_blog_option( get_main_site_id( get_main_network_id() ), 'auth_multisite_settings_access_users_approved', $auth_multisite_settings_access_users_approved ); | |
| 690 | 685 | } |
| 691 | 686 | |
| 692 | 687 | // Go through this user's current sites and add them to the approved list |
| 693 | 688 | // (since they are no longer on the network approved list). |
| @@ -696,6 +691,5 @@ | ||
| 696 | 691 | $blog_id = $site->userblog_id; |
| 697 | 692 | $this->add_network_user_to_site( $user_id, $blog_id ); |
| 698 | 693 | } |
| 699 | 694 | } |
| 700 | - | |
| 701 | 695 | } |