aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Calviño Sánchez <danxuliu@gmail.com>2024-10-28 10:14:29 +0100
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2024-11-05 10:50:29 +0000
commitc7b5c3e02f1d2f9d7dc49ee094cc4420673f4e9b (patch)
treebcb8e106ba3fd132710bc3ab77e856fd664973e0
parent29e17ab2f8717ae7478d654442cb6ae247742dfd (diff)
downloadnextcloud-server-c7b5c3e02f1d2f9d7dc49ee094cc4420673f4e9b.tar.gz
nextcloud-server-c7b5c3e02f1d2f9d7dc49ee094cc4420673f4e9b.zip
fix: Clear pending two factor tokens also from configuration
Otherwise as the tokens were removed from the database but not from the configuration the next time that the tokens were cleared the previous tokens were still got from the configuration, and trying to remove them again from the database ended in a DoesNotExistException being thrown. Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
-rw-r--r--lib/private/Authentication/TwoFactorAuth/Manager.php2
-rw-r--r--tests/lib/Authentication/TwoFactorAuth/ManagerTest.php26
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/private/Authentication/TwoFactorAuth/Manager.php b/lib/private/Authentication/TwoFactorAuth/Manager.php
index 2585646c998..f4b3b88c50b 100644
--- a/lib/private/Authentication/TwoFactorAuth/Manager.php
+++ b/lib/private/Authentication/TwoFactorAuth/Manager.php
@@ -366,6 +366,8 @@ class Manager {
$tokensNeeding2FA = $this->config->getUserKeys($userId, 'login_token_2fa');
foreach ($tokensNeeding2FA as $tokenId) {
+ $this->config->deleteUserValue($userId, 'login_token_2fa', $tokenId);
+
$this->tokenProvider->invalidateTokenById($userId, (int)$tokenId);
}
}
diff --git a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php
index a89b07f7716..4f4dbaccaff 100644
--- a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php
+++ b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php
@@ -701,4 +701,30 @@ class ManagerTest extends TestCase {
$this->assertFalse($this->manager->needsSecondFactor($user));
}
+
+ public function testClearTwoFactorPending() {
+ $this->config->method('getUserKeys')
+ ->with('theUserId', 'login_token_2fa')
+ ->willReturn([
+ '42', '43', '44'
+ ]);
+
+ $this->config->expects($this->exactly(3))
+ ->method('deleteUserValue')
+ ->withConsecutive(
+ ['theUserId', 'login_token_2fa', '42'],
+ ['theUserId', 'login_token_2fa', '43'],
+ ['theUserId', 'login_token_2fa', '44'],
+ );
+
+ $this->tokenProvider->expects($this->exactly(3))
+ ->method('invalidateTokenById')
+ ->withConsecutive(
+ ['theUserId', 42],
+ ['theUserId', 43],
+ ['theUserId', 44],
+ );
+
+ $this->manager->clearTwoFactorPending('theUserId');
+ }
}