Skip to content

Commit e8874c6

Browse files
authored
Merge pull request #6280 from WoltLab/6.1-fix-race-condition-in-email-mfa
Fix race condition in `EmailMultifactorMethod`
2 parents 6badf38 + 1f9ca35 commit e8874c6

File tree

1 file changed

+8
-24
lines changed

1 file changed

+8
-24
lines changed

wcfsetup/install/files/lib/system/user/multifactor/EmailMultifactorMethod.class.php

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -238,40 +238,24 @@ public function createAuthenticationForm(IFormDocument $form, Setup $setup): voi
238238
*/
239239
public function processAuthenticationForm(IFormDocument $form, Setup $setup): void
240240
{
241-
$userCode = $form->getData()['data']['code'];
242-
243-
$sql = "SELECT code
244-
FROM wcf1_user_multifactor_email
245-
WHERE setupID = ?
246-
AND createTime > ?
247-
FOR UPDATE";
248-
$statement = WCF::getDB()->prepare($sql);
249-
$statement->execute([
241+
$this->invalidateUsedCode(
250242
$setup->getId(),
251-
(\TIME_NOW - self::LIFETIME),
252-
]);
253-
$codes = $statement->fetchAll(\PDO::FETCH_ASSOC);
254-
255-
$usedCode = $this->findValidCode($userCode, $codes);
256-
257-
if ($usedCode === null) {
258-
throw new \RuntimeException('Unable to find a valid code.');
259-
}
243+
$form->getData()['data']['code']
244+
);
245+
}
260246

247+
private function invalidateUsedCode(int $id, string $code): void
248+
{
261249
$sql = "DELETE FROM wcf1_user_multifactor_email
262250
WHERE setupID = ?
263251
AND createTime > ?
264252
AND code = ?";
265253
$statement = WCF::getDB()->prepare($sql);
266254
$statement->execute([
267-
$setup->getId(),
255+
$id,
268256
(\TIME_NOW - self::LIFETIME),
269-
$usedCode['code'],
257+
$code,
270258
]);
271-
272-
if ($statement->getAffectedRows() !== 1) {
273-
throw new \RuntimeException('Unable to invalidate the code.');
274-
}
275259
}
276260

277261
/**

0 commit comments

Comments
 (0)