Report any duplicate usernames before applying the upgrade
authorAlexander Ebert <ebert@woltlab.com>
Tue, 1 Sep 2020 14:44:53 +0000 (16:44 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Tue, 1 Sep 2020 14:44:53 +0000 (16:44 +0200)
Fixes #3544

com.woltlab.wcf/files_pre.tar
com.woltlab.wcf/package.xml
wcfsetup/install/files/acp/update_com.woltlab.wcf_5.3_preUpdate.php [new file with mode: 0644]

index 7d79221d99332885d3a9472db18efb9bf5ca0ea7..5835c63a372f0647dcf1f1bb607fa0224634461a 100644 (file)
Binary files a/com.woltlab.wcf/files_pre.tar and b/com.woltlab.wcf/files_pre.tar differ
index f3ea210b9766b6c70e0d86914ff21c28815f2d0e..c0b97fd4ade0dd6e9664ae3c8c2563294bb8e785 100644 (file)
@@ -55,6 +55,9 @@
                     Guzzle can not be found during the development of the regular file PIP. -->
                <instruction type="file" run="standalone">files_pre.tar</instruction>
                
+               <!-- Verify that there are no duplicate usernames and warn about them if any are found. -->
+               <instruction type="script" run="standalone">acp/update_com.woltlab.wcf_5.3_preUpdate.php</instruction>
+               
                <!-- Deploy the database changes as early as possible to avoid any conflicts by calls to
                     tables that do not exist in 5.2, in particular `wcfN_devtools_missing_language_item`.-->
                <instruction type="script" run="standalone">acp/update_com.woltlab.wcf_5.3.php</instruction>
diff --git a/wcfsetup/install/files/acp/update_com.woltlab.wcf_5.3_preUpdate.php b/wcfsetup/install/files/acp/update_com.woltlab.wcf_5.3_preUpdate.php
new file mode 100644 (file)
index 0000000..bbcb970
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+namespace wcf\acp;
+use wcf\system\WCF;
+
+/**
+ * Checks for any duplicate usernames and aborts the upgrade if any are found.
+ * 
+ * @author      Alexander Ebert
+ * @copyright   2001-2020 WoltLab GmbH
+ * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package     WoltLabSuite\Core
+ */
+
+$sql = "SELECT          username, COUNT(username)
+       FROM            wcf" . WCF_N . "_user
+       GROUP BY        username
+       HAVING          COUNT(username) > ?";
+$statement = WCF::getDB()->prepareStatement($sql);
+$statement->execute([1]);
+$usernames = $statement->fetchList('username');
+
+if (!empty($usernames)) {
+       if (WCF::getLanguage()->getFixedLanguageCode() === 'de') {
+               $message = "Ein oder mehr Benutzernamen sind mehrfach gegeben, diese Konten müssen zusammengeführt oder gelöscht werden: %s";
+       }
+       else {
+               $message = "One or more usernames exist multiple times, these accounts must be merged or deleted: %s";
+       }
+       
+       throw new \RuntimeException(sprintf($message, implode(', ', $usernames)));
+}