Show nicer error message if allocating the MFA setup fails
authorTim Düsterhus <duesterhus@woltlab.com>
Mon, 9 Aug 2021 09:27:51 +0000 (11:27 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Mon, 9 Aug 2021 09:27:51 +0000 (11:27 +0200)
`Setup::allocateSetUpId` can deadlock if the form is submitted twice at the
same time. This error should not be normally seen by the user. If they do they
will be directed to "Try again" and then see that MFA is active, because one of
the requests succeeded. They will also receive the info mail letting them know
where to regenerate their backup codes if necessary.

wcfsetup/install/files/lib/form/MultifactorManageForm.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index bad8099ed66f241e8d6f042992bd133decbe5466..f56c1a63379afac39e353520b4d2ea0dbe95e941 100644 (file)
@@ -6,8 +6,10 @@ use wcf\data\object\type\ObjectType;
 use wcf\data\object\type\ObjectTypeCache;
 use wcf\data\user\UserEditor;
 use wcf\system\background\BackgroundQueueHandler;
+use wcf\system\database\exception\DatabaseException;
 use wcf\system\email\SimpleEmail;
 use wcf\system\exception\IllegalLinkException;
+use wcf\system\exception\NamedUserException;
 use wcf\system\exception\PermissionDeniedException;
 use wcf\system\form\builder\FormDocument;
 use wcf\system\form\builder\IFormDocument;
@@ -134,7 +136,13 @@ class MultifactorManageForm extends AbstractFormBuilderForm
         if ($this->setup) {
             $setup = $this->setup->lock();
         } else {
-            $setup = Setup::allocateSetUpId($this->method, WCF::getUser());
+            try {
+                $setup = Setup::allocateSetUpId($this->method, WCF::getUser());
+            } catch (DatabaseException $e) {
+                WCF::getDB()->rollBackTransaction();
+
+                throw new NamedUserException('wcf.user.security.multifactor.error.setupAllocationFailed');
+            }
         }
 
         if (!$setup) {
index ddf21ebf9b988df59a2774426b8a11d5f42d5d54..199f418d48c74ddf260e510ecb9972b1396e5d8a 100644 (file)
@@ -4997,6 +4997,7 @@ Die E-Mail-Adresse des neuen Benutzers lautet: {@$user->email}.
                <item name="wcf.user.security.multifactor.email.subject"><![CDATA[{$code} ist {if LANGUAGE_USE_INFORMAL_VARIANT}dein{else}ihr{/if} Einmalcode for {@PAGE_TITLE|language}]]></item>
                <item name="wcf.user.security.multifactor.email.success"><![CDATA[Die zusätzliche Authentifizierung via E-Mail wurde erfolgreich aktiviert.]]></item>
                <item name="wcf.user.security.multifactor.error.invalidCode"><![CDATA[Der eingebene Code ist ungültig.]]></item>
+               <item name="wcf.user.security.multifactor.error.setupAllocationFailed"><![CDATA[Die Aktivierung des Verfahrens ist fehlgeschlagen. Bitte {if LANGUAGE_USE_INFORMAL_VARIANT}versuche{else}versuchen Sie{/if} es erneut.]]></item>
                <item name="wcf.user.security.multifactor.initialBackup"><![CDATA[<p>Die Mehrfaktor-Authentifizierung ist ab sofort für {if LANGUAGE_USE_INFORMAL_VARIANT}dein{else}Ihr{/if} Benutzerkonto aktiv. {if LANGUAGE_USE_INFORMAL_VARIANT}Du wirst{else}Sie werden{/if} von nun an bei jeder Anmeldung den zusätzlichen Faktor benötigen.</p>
 <p><br></p>
 <p>Zusätzlich wurden Notfallcodes generiert, mit denen der Zugriff wiederhergestellt werden kann, falls der zusätzliche Faktor unbrauchbar wird.</p>
index 363bc47f4e46814f862dce057059a5eeba99aa16..6eadf5e7e144b32688762aa2ff954ef6199a6906 100644 (file)
@@ -4994,6 +4994,7 @@ You can manage multi-factor authentication within the Account Security page [URL
                <item name="wcf.user.security.multifactor.email.subject"><![CDATA[{$code} is your one time code for {@PAGE_TITLE|language}]]></item>
                <item name="wcf.user.security.multifactor.email.success"><![CDATA[The additional authentication via email has successfully been enabled.]]></item>
                <item name="wcf.user.security.multifactor.error.invalidCode"><![CDATA[The entered code is invalid.]]></item>
+               <item name="wcf.user.security.multifactor.error.setupAllocationFailed"><![CDATA[Enabling this method failed. Please try again.]]></item>
                <item name="wcf.user.security.multifactor.initialBackup"><![CDATA[<p>The multi-factor authentication is enabled for your account starting now. Going forward you will need to have your second factor handy for every login.</p>
 <p><br></p>
 <p>In addition we generated emergency codes for you. They will allow you to gain access to your account in case your second factor becomes unavailable.</p>