From 1a29f446498969df4ca0a9fef17bb71d35cd1f8a Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Thu, 23 Jul 2015 11:54:46 +0800 Subject: [PATCH] MDL-46232 user: Handle bulk delete of users without email addresses --- lib/moodlelib.php | 5 ++++- lib/tests/moodlelib_test.php | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 69cd39567cb..3cb1fdd7d71 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -3984,8 +3984,11 @@ function delete_user(stdClass $user) { // Force logout - may fail if file based sessions used, sorry. \core\session\manager::kill_user_sessions($user->id); + // Generate username from email address, or a fake email. + $delemail = !empty($user->email) ? $user->email : $user->username . '.' . $user->id . '@unknownemail.invalid'; + $delname = clean_param($delemail . "." . time(), PARAM_USERNAME); + // Workaround for bulk deletes of users with the same email address. - $delname = clean_param($user->email . "." . time(), PARAM_USERNAME); while ($DB->record_exists('user', array('username' => $delname))) { // No need to use mnethostid here. $delname++; } diff --git a/lib/tests/moodlelib_test.php b/lib/tests/moodlelib_test.php index 3d33588a9f0..8ee6dd2d803 100644 --- a/lib/tests/moodlelib_test.php +++ b/lib/tests/moodlelib_test.php @@ -1882,6 +1882,10 @@ class core_moodlelib_testcase extends advanced_testcase { $user = $this->getDataGenerator()->create_user(array('idnumber'=>'abc')); $user2 = $this->getDataGenerator()->create_user(array('idnumber'=>'xyz')); + $usersharedemail1 = $this->getDataGenerator()->create_user(array('email' => 'sharedemail@example.invalid')); + $usersharedemail2 = $this->getDataGenerator()->create_user(array('email' => 'sharedemail@example.invalid')); + $useremptyemail1 = $this->getDataGenerator()->create_user(array('email' => '')); + $useremptyemail2 = $this->getDataGenerator()->create_user(array('email' => '')); // Delete user and capture event. $sink = $this->redirectEvents(); @@ -1947,6 +1951,30 @@ class core_moodlelib_testcase extends advanced_testcase { $result = delete_user($admin); $this->assertFalse($result); + // Simultaneously deleting users with identical email addresses. + $result1 = delete_user($usersharedemail1); + $result2 = delete_user($usersharedemail2); + + $usersharedemail1after = $DB->get_record('user', array('id' => $usersharedemail1->id)); + $usersharedemail2after = $DB->get_record('user', array('id' => $usersharedemail2->id)); + $this->assertTrue($result1); + $this->assertTrue($result2); + $this->assertStringStartsWith($usersharedemail1->email . '.', $usersharedemail1after->username); + $this->assertStringStartsWith($usersharedemail2->email . '.', $usersharedemail2after->username); + + // Simultaneously deleting users without email addresses. + $result1 = delete_user($useremptyemail1); + $result2 = delete_user($useremptyemail2); + + $useremptyemail1after = $DB->get_record('user', array('id' => $useremptyemail1->id)); + $useremptyemail2after = $DB->get_record('user', array('id' => $useremptyemail2->id)); + $this->assertTrue($result1); + $this->assertTrue($result2); + $this->assertStringStartsWith($useremptyemail1->username . '.' . $useremptyemail1->id . '@unknownemail.invalid.', + $useremptyemail1after->username); + $this->assertStringStartsWith($useremptyemail2->username . '.' . $useremptyemail2->id . '@unknownemail.invalid.', + $useremptyemail2after->username); + $this->resetDebugging(); }