Skip to content

Commit 9287402

Browse files
Merge pull request #62984 from nextcloud/backport/62982/stable33
[stable33] fix: Handle 2fa enforcement earlier
2 parents 2ae70cf + 51847dc commit 9287402

2 files changed

Lines changed: 24 additions & 7 deletions

File tree

lib/private/User/Session.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -403,10 +403,8 @@ public function logClientIn($user,
403403
return false;
404404
}
405405

406-
if (!$isTokenPassword && $this->isTokenAuthEnforced()) {
407-
throw new PasswordLoginForbiddenException();
408-
}
409-
if (!$isTokenPassword && $this->isTwoFactorEnforced($user)) {
406+
if (!$isTokenPassword && ($this->isTokenAuthEnforced() || $this->isTwoFactorEnforced($user))) {
407+
$this->handleLoginFailed($throttler, $currentDelay, $remoteAddress, $user, $password);
410408
throw new PasswordLoginForbiddenException();
411409
}
412410

@@ -576,7 +574,8 @@ public function tryBasicAuthLogin(IRequest $request,
576574
// If credentials were provided, they need to be valid, otherwise we do boom
577575
throw new LoginException();
578576
} catch (PasswordLoginForbiddenException $ex) {
579-
// Nothing to do
577+
// If credentials were provided, they need to be valid, otherwise we do boom
578+
throw new LoginException(previous: $ex);
580579
}
581580
}
582581
return false;

tests/lib/User/SessionTest.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ public function testLogClientInNoTokenPasswordWith2fa(): void {
439439
->method('getRemoteAddress')
440440
->willReturn('192.168.0.1');
441441
$this->throttler
442-
->expects($this->once())
442+
->expects($this->exactly(2))
443443
->method('sleepDelayOrThrowOnMax')
444444
->with('192.168.0.1');
445445
$this->throttler
@@ -448,6 +448,15 @@ public function testLogClientInNoTokenPasswordWith2fa(): void {
448448
->with('192.168.0.1')
449449
->willReturn(0);
450450

451+
$this->throttler
452+
->expects($this->once())
453+
->method('registerAttempt')
454+
->with('login', '192.168.0.1', ['user' => 'john']);
455+
$this->dispatcher
456+
->expects($this->once())
457+
->method('dispatchTyped')
458+
->with(new LoginFailed('john', 'doe'));
459+
451460
$userSession->logClientIn('john', 'doe', $request, $this->throttler);
452461
}
453462

@@ -550,7 +559,7 @@ public function testLogClientInNoTokenPasswordNo2fa(): void {
550559
->method('getRemoteAddress')
551560
->willReturn('192.168.0.1');
552561
$this->throttler
553-
->expects($this->once())
562+
->expects($this->exactly(2))
554563
->method('sleepDelayOrThrowOnMax')
555564
->with('192.168.0.1');
556565
$this->throttler
@@ -559,6 +568,15 @@ public function testLogClientInNoTokenPasswordNo2fa(): void {
559568
->with('192.168.0.1')
560569
->willReturn(0);
561570

571+
$this->throttler
572+
->expects($this->once())
573+
->method('registerAttempt')
574+
->with('login', '192.168.0.1', ['user' => 'john']);
575+
$this->dispatcher
576+
->expects($this->once())
577+
->method('dispatchTyped')
578+
->with(new LoginFailed('john', 'doe'));
579+
562580
$userSession->logClientIn('john', 'doe', $request, $this->throttler);
563581
}
564582

0 commit comments

Comments
 (0)