From aa113020ae50790ae105be5b6970e584a8b3a945 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim=20D=C3=BCsterhus?= Date: Mon, 24 Nov 2014 00:53:46 +0100 Subject: [PATCH] Remove user merge modes that could possibly create duplicate emails --- .../files/acp/templates/dataImport.tpl | 6 +- .../lib/acp/form/DataImportForm.class.php | 11 +++- .../cli/command/ImportCLICommand.class.php | 21 ++++--- .../system/importer/UserImporter.class.php | 58 +++++++++++-------- wcfsetup/install/lang/de.xml | 6 +- wcfsetup/install/lang/en.xml | 4 +- 6 files changed, 62 insertions(+), 44 deletions(-) diff --git a/wcfsetup/install/files/acp/templates/dataImport.tpl b/wcfsetup/install/files/acp/templates/dataImport.tpl index 9e0706133e..ebcdd9f64c 100644 --- a/wcfsetup/install/files/acp/templates/dataImport.tpl +++ b/wcfsetup/install/files/acp/templates/dataImport.tpl @@ -157,10 +157,8 @@
- - - - + +
diff --git a/wcfsetup/install/files/lib/acp/form/DataImportForm.class.php b/wcfsetup/install/files/lib/acp/form/DataImportForm.class.php index 186da9c7cc..cf00a914b3 100644 --- a/wcfsetup/install/files/lib/acp/form/DataImportForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/DataImportForm.class.php @@ -5,6 +5,7 @@ use wcf\form\AbstractForm; use wcf\system\database\DatabaseException; use wcf\system\exception\IllegalLinkException; use wcf\system\exception\UserInputException; +use wcf\system\importer\UserImporter; use wcf\system\WCF; use wcf\util\ArrayUtil; use wcf\util\StringUtil; @@ -124,7 +125,7 @@ class DataImportForm extends AbstractForm { * user merge mode * @var integer */ - public $userMergeMode = 2; + public $userMergeMode = UserImporter::MERGE_MODE_EMAIL; /** * @see \wcf\page\IPage::readParameters() @@ -227,8 +228,12 @@ class DataImportForm extends AbstractForm { } // validate user merge mode - if ($this->userMergeMode < 1 || $this->userMergeMode > 4) { - $this->userMergeMode = 2; + switch ($this->userMergeMode) { + case UserImporter::MERGE_MODE_EMAIL: + case UserImporter::MERGE_MODE_USERNAME_OR_EMAIL: + break; + default: + $this->userMergeMode = UserImporter::MERGE_MODE_EMAIL; } } diff --git a/wcfsetup/install/files/lib/system/cli/command/ImportCLICommand.class.php b/wcfsetup/install/files/lib/system/cli/command/ImportCLICommand.class.php index 0f420d93ac..51f97354e7 100644 --- a/wcfsetup/install/files/lib/system/cli/command/ImportCLICommand.class.php +++ b/wcfsetup/install/files/lib/system/cli/command/ImportCLICommand.class.php @@ -3,6 +3,7 @@ namespace wcf\system\cli\command; use wcf\data\object\type\ObjectTypeCache; use wcf\system\database\DatabaseException; use wcf\system\importer\ImportHandler; +use wcf\system\importer\UserImporter; use wcf\system\CLIWCF; use wcf\system\WCF; use wcf\util\StringUtil; @@ -458,20 +459,26 @@ class ImportCLICommand implements ICLICommand { */ protected function readUserMergeMode() { CLIWCF::getReader()->println(WCF::getLanguage()->get('wcf.acp.dataImport.configure.settings.userMergeMode')); - CLIWCF::getReader()->println('1) '.WCF::getLanguage()->get('wcf.acp.dataImport.configure.settings.userMergeMode.1')); - CLIWCF::getReader()->println('2) '.WCF::getLanguage()->get('wcf.acp.dataImport.configure.settings.userMergeMode.2').' (*)'); - CLIWCF::getReader()->println('3) '.WCF::getLanguage()->get('wcf.acp.dataImport.configure.settings.userMergeMode.3')); - CLIWCF::getReader()->println('4) '.WCF::getLanguage()->get('wcf.acp.dataImport.configure.settings.userMergeMode.4')); + CLIWCF::getReader()->println('1) '.WCF::getLanguage()->get('wcf.acp.dataImport.configure.settings.userMergeMode.4').' (*)'); + CLIWCF::getReader()->println('2) '.WCF::getLanguage()->get('wcf.acp.dataImport.configure.settings.userMergeMode.5')); CLIWCF::getReader()->println(WCF::getLanguage()->getDynamicVariable('wcf.acp.dataImport.cli.selection', array( 'minSelection' => 1, - 'maxSelection' => 4 + 'maxSelection' => 2 ))); while (true) { $this->userMergeMode = CLIWCF::getReader()->readLine('> '); if ($this->userMergeMode === null) exit; - if ($this->userMergeMode != intval($this->userMergeMode) || $this->userMergeMode < 1 || $this->userMergeMode > 4) { - $this->userMergeMode = 2; + switch (intval($this->userMergeMode)) { + case 1: + $this->userMergeMode = UserImporter::MERGE_MODE_EMAIL; + break; + case 2: + $this->userMergeMode = UserImporter::MERGE_MODE_USERNAME_OR_EMAIL; + break; + default: + $this->userMergeMode = UserImporter::MERGE_MODE_EMAIL; + break; } break; diff --git a/wcfsetup/install/files/lib/system/importer/UserImporter.class.php b/wcfsetup/install/files/lib/system/importer/UserImporter.class.php index 5beab5d764..072bbce01d 100644 --- a/wcfsetup/install/files/lib/system/importer/UserImporter.class.php +++ b/wcfsetup/install/files/lib/system/importer/UserImporter.class.php @@ -35,6 +35,9 @@ class UserImporter extends AbstractImporter { */ protected $userOptions = array(); + const MERGE_MODE_EMAIL = 4; + const MERGE_MODE_USERNAME_OR_EMAIL = 5; + /** * Creates a new UserImporter object. */ @@ -58,30 +61,39 @@ class UserImporter extends AbstractImporter { * @see \wcf\system\importer\IImporter::import() */ public function import($oldID, array $data, array $additionalData = array()) { - // resolve duplicates - if (ImportHandler::getInstance()->getUserMergeMode() == 4) { - $existingUser = User::getUserByEmail($data['email']); - if ($existingUser->userID) { - // merge user - ImportHandler::getInstance()->saveNewID('com.woltlab.wcf.user', $oldID, $existingUser->userID); - - return 0; - } - } - else { - $existingUser = User::getUserByUsername($data['username']); - if ($existingUser->userID) { - if (ImportHandler::getInstance()->getUserMergeMode() == 1 || (ImportHandler::getInstance()->getUserMergeMode() == 3 && mb_strtolower($existingUser->email) != mb_strtolower($data['email']))) { - // rename user - $data['username'] = self::resolveDuplicate($data['username']); - } - else { - // merge user - ImportHandler::getInstance()->saveNewID('com.woltlab.wcf.user', $oldID, $existingUser->userID); - - return 0; + // whether to perform a merge + $performMerge = false; + + // fetch user with same username + $conflictingUser = User::getUserByUsername($data['username']); + switch (ImportHandler::getInstance()->getUserMergeMode()) { + case self::MERGE_MODE_USERNAME_OR_EMAIL: + // merge target will be the conflicting user + $targetUser = $conflictingUser; + + // check whether user exists + if ($targetUser->userID) { + $performMerge = true; + break; } - } + case self::MERGE_MODE_EMAIL: + // fetch merge target + $targetUser = User::getUserByEmail($data['email']); + // if it exists: perform a merge + if ($targetUser->userID) $performMerge = true; + break; + } + + // merge should be performed + if ($performMerge) { + ImportHandler::getInstance()->saveNewID('com.woltlab.wcf.user', $oldID, $targetUser->userID); + return 0; + } + + // a conflict arose, but no merge was performed, resolve + if ($conflictingUser->userID) { + // rename user + $data['username'] = self::resolveDuplicate($data['username']); } // check existing user id diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml index 106d6fe6ca..2ebcc09b83 100644 --- a/wcfsetup/install/lang/de.xml +++ b/wcfsetup/install/lang/de.xml @@ -224,10 +224,8 @@ - - - - + + diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml index 23bf40dc33..ae879a83f7 100644 --- a/wcfsetup/install/lang/en.xml +++ b/wcfsetup/install/lang/en.xml @@ -223,10 +223,8 @@ Examples for medium ID detection: - - - + -- 2.20.1