fix(throttler): Don't query bruteforce attempts twice

Signed-off-by: Joas Schilling <coding@schilljs.com>
pull/52971/head
Joas Schilling 2025-05-20 08:37:23 +07:00
parent cc22d74887
commit 1d8556ecc3
No known key found for this signature in database
GPG Key ID: F72FA5B49FFA96B0
1 changed files with 14 additions and 12 deletions

@ -206,25 +206,27 @@ class Throttler implements IThrottler {
* {@inheritDoc}
*/
public function sleepDelayOrThrowOnMax(string $ip, string $action = ''): int {
$attempts = $this->getAttempts($ip, $action, 0.5);
if ($attempts > $this->config->getSystemValueInt('auth.bruteforce.max-attempts', self::MAX_ATTEMPTS)) {
$this->logger->info('IP address blocked because it reached the maximum failed attempts in the last 30 minutes [action: {action}, attempts: {attempts}, ip: {ip}]', [
'action' => $action,
'ip' => $ip,
'attempts' => $attempts,
]);
// If the ip made too many attempts within the last 30 mins we don't execute anymore
throw new MaxDelayReached('Reached maximum delay');
}
$maxAttempts = $this->config->getSystemValueInt('auth.bruteforce.max-attempts', self::MAX_ATTEMPTS);
$attempts = $this->getAttempts($ip, $action);
if ($attempts > 10) {
if ($attempts > $maxAttempts) {
$attempts30mins = $this->getAttempts($ip, $action, 0.5);
if ($attempts30mins > $maxAttempts) {
$this->logger->info('IP address blocked because it reached the maximum failed attempts in the last 30 minutes [action: {action}, attempts: {attempts}, ip: {ip}]', [
'action' => $action,
'ip' => $ip,
'attempts' => $attempts30mins,
]);
// If the ip made too many attempts within the last 30 mins we don't execute anymore
throw new MaxDelayReached('Reached maximum delay');
}
$this->logger->info('IP address throttled because it reached the attempts limit in the last 12 hours [action: {action}, attempts: {attempts}, ip: {ip}]', [
'action' => $action,
'ip' => $ip,
'attempts' => $attempts,
]);
}
if ($attempts > 0) {
return $this->calculateDelay($attempts);
}