Skip to content

Commit 80a8db1

Browse files
authored
Merge pull request #61292 from nextcloud/fix/fix-backupcode-used-update
fix(twofactor_backupcodes): Add a clean helper to set code as used
2 parents 5ba1fad + 5a1c084 commit 80a8db1

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
@@ -55,4 +55,17 @@ public function deleteCodesByUserId(string $uid): void {
5555
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($uid)));
5656
$qb->executeStatement();
5757
}
58+
59+
/**
60+
* Marks the backup code as used, if not already marked as used in DB.
61+
* @return int number of affected rows
62+
*/
63+
public function markUsedIfUnused(BackupCode $code): int {
64+
$qb = $this->db->getQueryBuilder();
65+
$qb->update($this->getTableName())
66+
->set('used', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT))
67+
->where($qb->expr()->eq('id', $qb->createNamedParameter($code->getId(), IQueryBuilder::PARAM_INT)))
68+
->andWhere($qb->expr()->eq('used', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
69+
return $qb->executeStatement();
70+
}
5871
}

apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php

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

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

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

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

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

164165
$this->assertTrue($this->storage->validateCode($user, 'CHALLENGE'));
165-
166-
$this->assertEquals(1, $code->getUsed());
167166
}
168167

169168
public function testValidateUsedCode(): void {

0 commit comments

Comments
 (0)