mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 06:18:28 +01:00
MDL-31484 backup - repeated restores with anonymised users now works correctly
This commit is contained in:
parent
f42c34a38a
commit
f5744d1cfa
@ -1147,14 +1147,16 @@ abstract class restore_dbops {
|
||||
*
|
||||
* If restoring users from same site backup:
|
||||
* 1A - Normal check: If match by id and username and mnethost => ok, return target user
|
||||
* 1B - Handle users deleted in DB and "alive" in backup file:
|
||||
* 1B - If restoring an 'anonymous' user (created via the 'Anonymize user information' option) try to find a
|
||||
* match by username only => ok, return target user MDL-31484
|
||||
* 1C - Handle users deleted in DB and "alive" in backup file:
|
||||
* If match by id and mnethost and user is deleted in DB and
|
||||
* (match by username LIKE 'backup_email.%' or by non empty email = md5(username)) => ok, return target user
|
||||
* 1C - Handle users deleted in backup file and "alive" in DB:
|
||||
* 1D - Handle users deleted in backup file and "alive" in DB:
|
||||
* If match by id and mnethost and user is deleted in backup file
|
||||
* and match by email = email_without_time(backup_email) => ok, return target user
|
||||
* 1D - Conflict: If match by username and mnethost and doesn't match by id => conflict, return false
|
||||
* 1E - None of the above, return true => User needs to be created
|
||||
* 1E - Conflict: If match by username and mnethost and doesn't match by id => conflict, return false
|
||||
* 1F - None of the above, return true => User needs to be created
|
||||
*
|
||||
* if restoring from another site backup (cannot match by id here, replace it by email/firstaccess combination):
|
||||
* 2A - Normal check: If match by username and mnethost and (email or non-zero firstaccess) => ok, return target user
|
||||
@ -1186,7 +1188,16 @@ abstract class restore_dbops {
|
||||
return $rec; // Matching user found, return it
|
||||
}
|
||||
|
||||
// 1B - Handle users deleted in DB and "alive" in backup file
|
||||
// 1B - If restoring an 'anonymous' user (created via the 'Anonymize user information' option) try to find a
|
||||
// match by username only => ok, return target user MDL-31484
|
||||
// This avoids username / id mis-match problems when restoring subsequent anonymized backups.
|
||||
if (backup_anonymizer_helper::is_anonymous_user($user)) {
|
||||
if ($rec = $DB->get_record('user', array('username' => $user->username))) {
|
||||
return $rec; // Matching anonymous user found - return it
|
||||
}
|
||||
}
|
||||
|
||||
// 1C - Handle users deleted in DB and "alive" in backup file
|
||||
// Note: for DB deleted users email is stored in username field, hence we
|
||||
// are looking there for emails. See delete_user()
|
||||
// Note: for DB deleted users md5(username) is stored *sometimes* in the email field,
|
||||
@ -1209,7 +1220,7 @@ abstract class restore_dbops {
|
||||
return $rec; // Matching user, deleted in DB found, return it
|
||||
}
|
||||
|
||||
// 1C - Handle users deleted in backup file and "alive" in DB
|
||||
// 1D - Handle users deleted in backup file and "alive" in DB
|
||||
// If match by id and mnethost and user is deleted in backup file
|
||||
// and match by email = email_without_time(backup_email) => ok, return target user
|
||||
if ($user->deleted) {
|
||||
@ -1227,7 +1238,7 @@ abstract class restore_dbops {
|
||||
}
|
||||
}
|
||||
|
||||
// 1D - If match by username and mnethost and doesn't match by id => conflict, return false
|
||||
// 1E - If match by username and mnethost and doesn't match by id => conflict, return false
|
||||
if ($rec = $DB->get_record('user', array('username'=>$user->username, 'mnethostid'=>$user->mnethostid))) {
|
||||
if ($user->id != $rec->id) {
|
||||
return false; // Conflict, username already exists and belongs to another id
|
||||
|
@ -46,6 +46,24 @@
|
||||
*/
|
||||
class backup_anonymizer_helper {
|
||||
|
||||
/**
|
||||
* Determine if the given user is an 'anonymous' user, based on their username, firstname, lastname
|
||||
* and email address.
|
||||
* @param stdClass $user the user record to test
|
||||
* @return bool true if this is an 'anonymous' user
|
||||
*/
|
||||
public static function is_anonymous_user($user) {
|
||||
if (preg_match('/^anon\d*$/', $user->username)) {
|
||||
$match = preg_match('/^anonfirstname\d*$/', $user->firstname);
|
||||
$match = $match && preg_match('/^anonlastname\d*$/', $user->lastname);
|
||||
$match = $match && preg_match('/^anon\d*@doesntexist\.com$/', $user->email);
|
||||
if ($match) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function process_user_auth($value) {
|
||||
return 'manual'; // Set them to manual always
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ require_once($CFG->dirroot . '/backup/util/interfaces/executable.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/interfaces/processable.class.php');
|
||||
require_once($CFG->dirroot . '/backup/backup.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/structure/restore_path_element.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/helper/backup_anonymizer_helper.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/helper/backup_file_manager.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/helper/restore_prechecks_helper.class.php');
|
||||
require_once($CFG->dirroot . '/backup/util/helper/restore_moodlexml_parser_processor.class.php');
|
||||
|
Loading…
x
Reference in New Issue
Block a user