Multisite: Delete the signup entry when a user is deleted from the database.

When a user has registered with incorrect data and got the account deleted immediately, it currently wasn't possible to register with the same login or email address again due to the existing signup entry. They had to wait for two days until the entry gets automatically deleted. Now the associated signup entry gets deleted as part of the account deletion.

Fixes #43232.

git-svn-id: https://develop.svn.wordpress.org/trunk@48315 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Dominik Schilling 2020-07-05 11:19:35 +00:00
parent f5dcde26e5
commit 2a22dcf8a6
3 changed files with 49 additions and 8 deletions

View File

@ -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 );

View File

@ -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.
*

View File

@ -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' );