diff --git a/src/wp-includes/ms-default-filters.php b/src/wp-includes/ms-default-filters.php index d0054b502e..042751e491 100644 --- a/src/wp-includes/ms-default-filters.php +++ b/src/wp-includes/ms-default-filters.php @@ -31,6 +31,7 @@ add_action( 'network_site_new_created_user', 'wp_send_new_user_notifications' ); add_action( 'network_site_users_created_user', 'wp_send_new_user_notifications' ); add_action( 'network_user_new_created_user', 'wp_send_new_user_notifications' ); add_filter( 'sanitize_user', 'strtolower' ); +add_action( 'deleted_user', 'wp_delete_signup_on_user_delete', 10, 3 ); // Roles. add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 ); diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index c2af99ef55..9707818787 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -1276,6 +1276,21 @@ function wpmu_activate_signup( $key ) { ); } +/** + * Deletes am associated signup entry when a user is deleted from the database. + * + * @since 5.5.0 + * + * @param int $id ID of the user to delete. + * @param int|null $reassign ID of the user to reassign posts and links to. + * @param WP_User $user User object. + */ +function wp_delete_signup_on_user_delete( $id, $reassign, $user ) { + global $wpdb; + + $wpdb->delete( $wpdb->signups, array( 'user_login' => $user->user_login ) ); +} + /** * Create a user. * diff --git a/tests/phpunit/tests/multisite/wpmuValidateUserSignup.php b/tests/phpunit/tests/multisite/wpmuValidateUserSignup.php index 2187890cf8..7e0ad2750f 100644 --- a/tests/phpunit/tests/multisite/wpmuValidateUserSignup.php +++ b/tests/phpunit/tests/multisite/wpmuValidateUserSignup.php @@ -84,9 +84,9 @@ if ( is_multisite() ) : public function test_should_fail_for_existing_signup_with_same_username() { // Don't send notifications. - add_filter( 'wpmu_signup_user_notification', '__return_true' ); + add_filter( 'wpmu_signup_user_notification', '__return_false' ); wpmu_signup_user( 'foo123', 'foo@example.com' ); - remove_filter( 'wpmu_signup_user_notification', '__return_true' ); + remove_filter( 'wpmu_signup_user_notification', '__return_false' ); $v = wpmu_validate_user_signup( 'foo123', 'foo2@example.com' ); $this->assertContains( 'user_name', $v['errors']->get_error_codes() ); @@ -94,9 +94,9 @@ if ( is_multisite() ) : public function test_should_not_fail_for_existing_signup_with_same_username_if_signup_is_old() { // Don't send notifications. - add_filter( 'wpmu_signup_user_notification', '__return_true' ); + add_filter( 'wpmu_signup_user_notification', '__return_false' ); wpmu_signup_user( 'foo123', 'foo@example.com' ); - remove_filter( 'wpmu_signup_user_notification', '__return_true' ); + remove_filter( 'wpmu_signup_user_notification', '__return_false' ); global $wpdb; $date = gmdate( 'Y-m-d H:i:s', time() - ( 2 * DAY_IN_SECONDS ) - 60 ); @@ -108,9 +108,9 @@ if ( is_multisite() ) : public function test_should_fail_for_existing_signup_with_same_email() { // Don't send notifications. - add_filter( 'wpmu_signup_user_notification', '__return_true' ); + add_filter( 'wpmu_signup_user_notification', '__return_false' ); wpmu_signup_user( 'foo123', 'foo@example.com' ); - remove_filter( 'wpmu_signup_user_notification', '__return_true' ); + remove_filter( 'wpmu_signup_user_notification', '__return_false' ); $v = wpmu_validate_user_signup( 'foo2', 'foo@example.com' ); $this->assertContains( 'user_email', $v['errors']->get_error_codes() ); @@ -118,9 +118,9 @@ if ( is_multisite() ) : public function test_should_not_fail_for_existing_signup_with_same_email_if_signup_is_old() { // Don't send notifications. - add_filter( 'wpmu_signup_user_notification', '__return_true' ); + add_filter( 'wpmu_signup_user_notification', '__return_false' ); wpmu_signup_user( 'foo123', 'foo@example.com' ); - remove_filter( 'wpmu_signup_user_notification', '__return_true' ); + remove_filter( 'wpmu_signup_user_notification', '__return_false' ); global $wpdb; $date = gmdate( 'Y-m-d H:i:s', time() - ( 2 * DAY_IN_SECONDS ) - 60 ); @@ -130,6 +130,31 @@ if ( is_multisite() ) : $this->assertNotContains( 'user_email', $v['errors']->get_error_codes() ); } + /** + * @ticket 43232 + */ + public function test_should_not_fail_for_data_used_by_a_deleted_user() { + global $wpdb; + + // Don't send notifications. + add_filter( 'wpmu_signup_user_notification', '__return_false' ); + add_filter( 'wpmu_welcome_user_notification', '__return_false' ); + + // Signup, activate and delete new user. + wpmu_signup_user( 'foo123', 'foo@example.com' ); + $key = $wpdb->get_var( "SELECT activation_key FROM $wpdb->signups WHERE user_login = 'foo123'" ); + $user = wpmu_activate_signup( $key ); + wpmu_delete_user( $user['user_id'] ); + + $valid = wpmu_validate_user_signup( 'foo123', 'foo2@example.com' ); + + remove_filter( 'wpmu_signup_user_notification', '__return_false' ); + remove_filter( 'wpmu_signup_user_notification', '__return_false' ); + + $this->assertNotContains( 'user_name', $valid['errors']->get_error_codes() ); + $this->assertNotContains( 'user_email', $valid['errors']->get_error_codes() ); + } + public function test_invalid_email_address_with_no_banned_domains_results_in_error() { $valid = wpmu_validate_user_signup( 'validusername', 'invalid-email' );