Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d07c9ea

Browse files
committed
Improve condition and add test
1 parent 77949f0 commit d07c9ea

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

src/Symfony/Bundle/SecurityBundle/Tests/Functional/FormLoginTest.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ public function testLoginThrottling()
124124
['johannes', 'also_wrong'],
125125
['wrong', 'wrong'],
126126
['johannes', 'wrong_again'],
127+
['johannes', 'still_wrong'],
127128
];
128129
foreach ($attempts as $i => $attempt) {
129130
$form = $client->request('GET', '/login')->selectButton('login')->form();
@@ -137,17 +138,21 @@ public function testLoginThrottling()
137138
$this->assertStringContainsString('Invalid credentials', $text, 'Invalid response on 1st attempt');
138139

139140
break;
140-
case 1: // Second attempt : login throttling !
141+
case 1: // Second attempt : login throttling!
141142
$this->assertStringContainsString('Too many failed login attempts, please try again in 8 minutes.', $text, 'Invalid response on 2nd attempt');
142143

143144
break;
144145
case 2: // Third attempt with unexisting username
145146
$this->assertStringContainsString('Invalid credentials.', $text, 'Invalid response on 3rd attempt');
146147

147148
break;
148-
case 3: // Fourth attempt : still login throttling !
149+
case 3: // Fourth attempt : still login throttling!
149150
$this->assertStringContainsString('Too many failed login attempts, please try again in 8 minutes.', $text, 'Invalid response on 4th attempt');
150151

152+
break;
153+
case 4: // Fifth attempt : still login throttling!
154+
$this->assertStringContainsString('Too many failed login attempts, please try again in 8 minutes.', $text, 'Invalid response on 5th attempt');
155+
151156
break;
152157
}
153158
}

src/Symfony/Component/HttpFoundation/RateLimiter/AbstractRequestRateLimiter.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@ public function consume(Request $request): RateLimit
3535
foreach ($limiters as $limiter) {
3636
$rateLimit = $limiter->consume(1);
3737

38-
if (null === $minimalRateLimit || $rateLimit->getRemainingTokens() < $minimalRateLimit->getRemainingTokens() || !$rateLimit->isAccepted()) {
39-
$minimalRateLimit = $rateLimit;
40-
}
38+
$minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit;
4139
}
4240

4341
return $minimalRateLimit;
@@ -54,4 +52,20 @@ public function reset(Request $request): void
5452
* @return LimiterInterface[] a set of limiters using keys extracted from the request
5553
*/
5654
abstract protected function getLimiters(Request $request): array;
55+
56+
private static function getMinimalRateLimit(RateLimit $first, RateLimit $second): RateLimit
57+
{
58+
if ($first->isAccepted() !== $second->isAccepted()) {
59+
return $first->isAccepted() ? $second : $first;
60+
}
61+
62+
$firstRemainingTokens = $first->getRemainingTokens();
63+
$secondRemainingTokens = $second->getRemainingTokens();
64+
65+
if ($firstRemainingTokens === $secondRemainingTokens) {
66+
return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first;
67+
}
68+
69+
return $firstRemainingTokens > $secondRemainingTokens ? $second : $first;
70+
}
5771
}

0 commit comments

Comments
 (0)