summaryrefslogtreecommitdiffstats
path: root/core/Controller
diff options
context:
space:
mode:
authorCôme Chilliet <come.chilliet@nextcloud.com>2022-10-17 14:36:24 +0200
committerCôme Chilliet <come.chilliet@nextcloud.com>2022-11-03 17:50:59 +0100
commit26574db8ab27b5971c0c522ba47d7679d87345ec (patch)
tree6b330f945135f89570cc322c66e80c4937062476 /core/Controller
parent7f47000def372cc90705cdb45fe1acb78ebdc27f (diff)
downloadnextcloud-server-26574db8ab27b5971c0c522ba47d7679d87345ec.tar.gz
nextcloud-server-26574db8ab27b5971c0c522ba47d7679d87345ec.zip
Add rate limiting on lost password emails
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
Diffstat (limited to 'core/Controller')
-rw-r--r--core/Controller/LostController.php14
1 files changed, 13 insertions, 1 deletions
diff --git a/core/Controller/LostController.php b/core/Controller/LostController.php
index 87a629b9ee8..00a37ce01f4 100644
--- a/core/Controller/LostController.php
+++ b/core/Controller/LostController.php
@@ -37,6 +37,8 @@ namespace OC\Core\Controller;
use OC\Authentication\TwoFactorAuth\Manager;
use OC\Core\Exception\ResetPasswordException;
+use OC\Security\RateLimiting\Exception\RateLimitExceededException;
+use OC\Security\RateLimiting\Limiter;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\TemplateResponse;
@@ -91,6 +93,8 @@ class LostController extends Controller {
private $initialStateService;
/** @var IVerificationToken */
private $verificationToken;
+ /** @var Limiter */
+ private $limiter;
public function __construct(
$appName,
@@ -106,7 +110,8 @@ class LostController extends Controller {
ILogger $logger,
Manager $twoFactorManager,
IInitialStateService $initialStateService,
- IVerificationToken $verificationToken
+ IVerificationToken $verificationToken,
+ Limiter $limiter
) {
parent::__construct($appName, $request);
$this->urlGenerator = $urlGenerator;
@@ -121,6 +126,7 @@ class LostController extends Controller {
$this->twoFactorManager = $twoFactorManager;
$this->initialStateService = $initialStateService;
$this->verificationToken = $verificationToken;
+ $this->limiter = $limiter;
}
/**
@@ -294,6 +300,12 @@ class LostController extends Controller {
throw new ResetPasswordException('Could not send reset e-mail since there is no email for username ' . $input);
}
+ try {
+ $this->limiter->registerUserRequest('lostpasswordemail', 5, 1800, $user);
+ } catch (RateLimitExceededException $e) {
+ throw new ResetPasswordException('Could not send reset e-mail, 5 of them were already sent in the last 30 minutes', 0, $e);
+ }
+
// Generate the token. It is stored encrypted in the database with the
// secret being the users' email address appended with the system secret.
// This makes the token automatically invalidate once the user changes