Skip to content

Commit 57b2638

Browse files
authored
Merge pull request #61297 from nextcloud/backport/61292/stable33
[stable33] fix(twofactor_backupcodes): Add a clean helper to set code as used
2 parents 4dad72b + b5fd806 commit 57b2638

3 files changed

Lines changed: 17 additions & 12 deletions

File tree

apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,17 @@ public function deleteCodesByUserId(string $uid): void {
5454
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($uid)));
5555
$qb->executeStatement();
5656
}
57+
58+
/**
59+
* Marks the backup code as used, if not already marked as used in DB.
60+
* @return int number of affected rows
61+
*/
62+
public function markUsedIfUnused(BackupCode $code): int {
63+
$qb = $this->db->getQueryBuilder();
64+
$qb->update($this->getTableName())
65+
->set('used', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT))
66+
->where($qb->expr()->eq('id', $qb->createNamedParameter($code->getId(), IQueryBuilder::PARAM_INT)))
67+
->andWhere($qb->expr()->eq('used', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
68+
return $qb->executeStatement();
69+
}
5770
}

apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,12 @@ public function getBackupCodesState(IUser $user): array {
8585
];
8686
}
8787

88-
/**
89-
* @param IUser $user
90-
* @param string $code
91-
* @return bool
92-
*/
9388
public function validateCode(IUser $user, string $code): bool {
9489
$dbCodes = $this->mapper->getBackupCodes($user);
9590

9691
foreach ($dbCodes as $dbCode) {
9792
if ((int)$dbCode->getUsed() === 0 && $this->hasher->verify($code, $dbCode->getCode())) {
98-
$dbCode->setUsed(1);
99-
$this->mapper->update($dbCode);
100-
return true;
93+
return ($this->mapper->markUsedIfUnused($dbCode) === 1);
10194
}
10295
}
10396
return false;

apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,11 @@ public function testValidateCode(): void {
157157
->with('CHALLENGE', 'HASHEDVALUE', $this->anything())
158158
->willReturn(true);
159159
$this->mapper->expects($this->once())
160-
->method('update')
161-
->with($code);
160+
->method('markUsedIfUnused')
161+
->with($code)
162+
->willReturn(1);
162163

163164
$this->assertTrue($this->storage->validateCode($user, 'CHALLENGE'));
164-
165-
$this->assertEquals(1, $code->getUsed());
166165
}
167166

168167
public function testValidateUsedCode(): void {

0 commit comments

Comments
 (0)