diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2018-08-31 11:46:00 +0200 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2018-08-31 11:46:27 +0200 |
commit | fb98db7da7c30890ea0298ded185829bb543d86c (patch) | |
tree | 2a6f41ff6eb44846999f37235ffe24b72ea34f42 /lib | |
parent | 2a2261587921c80123b5077d16fcbde2a45c1a95 (diff) | |
download | nextcloud-server-fb98db7da7c30890ea0298ded185829bb543d86c.tar.gz nextcloud-server-fb98db7da7c30890ea0298ded185829bb543d86c.zip |
Fix handlng of concurrent inserts of the 2FA provider registry DAO
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/Authentication/TwoFactorAuth/Db/ProviderUserAssignmentDao.php | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/lib/private/Authentication/TwoFactorAuth/Db/ProviderUserAssignmentDao.php b/lib/private/Authentication/TwoFactorAuth/Db/ProviderUserAssignmentDao.php index e04512b8575..ce03eb09661 100644 --- a/lib/private/Authentication/TwoFactorAuth/Db/ProviderUserAssignmentDao.php +++ b/lib/private/Authentication/TwoFactorAuth/Db/ProviderUserAssignmentDao.php @@ -26,6 +26,7 @@ declare(strict_types=1); namespace OC\Authentication\TwoFactorAuth\Db; +use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; @@ -72,25 +73,7 @@ class ProviderUserAssignmentDao { public function persist(string $providerId, string $uid, int $enabled) { $qb = $this->conn->getQueryBuilder(); - $this->conn->beginTransaction(); - // To prevent duplicate primary key, we have to first check if an INSERT - // or UPDATE is required - $query = $qb->select('*') - ->from(self::TABLE_NAME) - ->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId))) - ->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid))); - $result = $query->execute(); - $rowCount = count($result->fetchAll()); - $result->closeCursor(); - - if ($rowCount > 0) { - // There is an entry -> update it - $updateQuery = $qb->update(self::TABLE_NAME) - ->set('enabled', $qb->createNamedParameter($enabled)) - ->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId))) - ->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid))); - $updateQuery->execute(); - } else { + try { // Insert a new entry $insertQuery = $qb->insert(self::TABLE_NAME)->values([ 'provider_id' => $qb->createNamedParameter($providerId), @@ -99,8 +82,14 @@ class ProviderUserAssignmentDao { ]); $insertQuery->execute(); + } catch (UniqueConstraintViolationException $ex) { + // There is already an entry -> update it + $updateQuery = $qb->update(self::TABLE_NAME) + ->set('enabled', $qb->createNamedParameter($enabled)) + ->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId))) + ->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid))); + $updateQuery->execute(); } - $this->conn->commit(); } |