Skip to content

Commit 7159ac1

Browse files
authored
Merge pull request #10943 from nextcloud/fix/2fa-provider-dao-concurrent-insert
Fix handlng of concurrent inserts of the 2FA provider registry DAO
2 parents 3693d95 + fb98db7 commit 7159ac1

File tree

1 file changed

+9
-20
lines changed

1 file changed

+9
-20
lines changed

lib/private/Authentication/TwoFactorAuth/Db/ProviderUserAssignmentDao.php

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
namespace OC\Authentication\TwoFactorAuth\Db;
2828

29+
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
2930
use OCP\DB\QueryBuilder\IQueryBuilder;
3031
use OCP\IDBConnection;
3132

@@ -72,25 +73,7 @@ public function getState(string $uid): array {
7273
public function persist(string $providerId, string $uid, int $enabled) {
7374
$qb = $this->conn->getQueryBuilder();
7475

75-
$this->conn->beginTransaction();
76-
// To prevent duplicate primary key, we have to first check if an INSERT
77-
// or UPDATE is required
78-
$query = $qb->select('*')
79-
->from(self::TABLE_NAME)
80-
->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId)))
81-
->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)));
82-
$result = $query->execute();
83-
$rowCount = count($result->fetchAll());
84-
$result->closeCursor();
85-
86-
if ($rowCount > 0) {
87-
// There is an entry -> update it
88-
$updateQuery = $qb->update(self::TABLE_NAME)
89-
->set('enabled', $qb->createNamedParameter($enabled))
90-
->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId)))
91-
->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)));
92-
$updateQuery->execute();
93-
} else {
76+
try {
9477
// Insert a new entry
9578
$insertQuery = $qb->insert(self::TABLE_NAME)->values([
9679
'provider_id' => $qb->createNamedParameter($providerId),
@@ -99,8 +82,14 @@ public function persist(string $providerId, string $uid, int $enabled) {
9982
]);
10083

10184
$insertQuery->execute();
85+
} catch (UniqueConstraintViolationException $ex) {
86+
// There is already an entry -> update it
87+
$updateQuery = $qb->update(self::TABLE_NAME)
88+
->set('enabled', $qb->createNamedParameter($enabled))
89+
->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId)))
90+
->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)));
91+
$updateQuery->execute();
10292
}
103-
$this->conn->commit();
10493

10594
}
10695

0 commit comments

Comments
 (0)