Skip to content

Commit 41a414d

Browse files
authored
Merge pull request #52815 from nextcloud/backport/52798/stable31
[stable31] fix: log requests exceeding the rate limiting
2 parents ff5bd5c + b422189 commit 41a414d

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

lib/private/Security/RateLimiting/Limiter.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
use OC\Security\RateLimiting\Exception\RateLimitExceededException;
1414
use OCP\IUser;
1515
use OCP\Security\RateLimiting\ILimiter;
16+
use Psr\Log\LoggerInterface;
1617

1718
class Limiter implements ILimiter {
1819
public function __construct(
1920
private IBackend $backend,
21+
private LoggerInterface $logger,
2022
) {
2123
}
2224

@@ -32,6 +34,11 @@ private function register(
3234
): void {
3335
$existingAttempts = $this->backend->getAttempts($methodIdentifier, $userIdentifier);
3436
if ($existingAttempts >= $limit) {
37+
$this->logger->info('Request blocked because it exceeds the rate limit [method: {method}, limit: {limit}, period: {period}]', [
38+
'method' => $methodIdentifier,
39+
'limit' => $limit,
40+
'period' => $period,
41+
]);
3542
throw new RateLimitExceededException();
3643
}
3744

tests/lib/Security/RateLimiting/LimiterTest.php

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,26 @@
1212
use OC\Security\RateLimiting\Backend\IBackend;
1313
use OC\Security\RateLimiting\Limiter;
1414
use OCP\IUser;
15+
use OCP\Security\RateLimiting\ILimiter;
16+
use PHPUnit\Framework\MockObject\MockObject;
17+
use Psr\Log\LoggerInterface;
1518
use Test\TestCase;
1619

1720
class LimiterTest extends TestCase {
18-
/** @var IBackend|\PHPUnit\Framework\MockObject\MockObject */
19-
private $backend;
20-
/** @var Limiter */
21-
private $limiter;
21+
22+
private IBackend&MockObject $backend;
23+
private ILimiter $limiter;
24+
private LoggerInterface $logger;
2225

2326
protected function setUp(): void {
2427
parent::setUp();
2528

2629
$this->backend = $this->createMock(IBackend::class);
30+
$this->logger = $this->createMock(LoggerInterface::class);
2731

2832
$this->limiter = new Limiter(
29-
$this->backend
33+
$this->backend,
34+
$this->logger,
3035
);
3136
}
3237

@@ -43,6 +48,8 @@ public function testRegisterAnonRequestExceeded(): void {
4348
'4664f0d9c88dcb7552be47b37bb52ce35977b2e60e1ac13757cf625f31f87050a41f3da064887fa87d49fd042e4c8eb20de8f10464877d3959677ab011b73a47'
4449
)
4550
->willReturn(101);
51+
$this->logger->expects($this->once())
52+
->method('info');
4653

4754
$this->limiter->registerAnonRequest('MyIdentifier', 100, 100, '127.0.0.1');
4855
}
@@ -64,6 +71,8 @@ public function testRegisterAnonRequestSuccess(): void {
6471
'4664f0d9c88dcb7552be47b37bb52ce35977b2e60e1ac13757cf625f31f87050a41f3da064887fa87d49fd042e4c8eb20de8f10464877d3959677ab011b73a47',
6572
100
6673
);
74+
$this->logger->expects($this->never())
75+
->method('info');
6776

6877
$this->limiter->registerAnonRequest('MyIdentifier', 100, 100, '127.0.0.1');
6978
}
@@ -87,6 +96,8 @@ public function testRegisterUserRequestExceeded(): void {
8796
'ddb2ec50fa973fd49ecf3d816f677c8095143e944ad10485f30fb3dac85c13a346dace4dae2d0a15af91867320957bfd38a43d9eefbb74fe6919e15119b6d805'
8897
)
8998
->willReturn(101);
99+
$this->logger->expects($this->once())
100+
->method('info');
90101

91102
$this->limiter->registerUserRequest('MyIdentifier', 100, 100, $user);
92103
}
@@ -115,6 +126,8 @@ public function testRegisterUserRequestSuccess(): void {
115126
'ddb2ec50fa973fd49ecf3d816f677c8095143e944ad10485f30fb3dac85c13a346dace4dae2d0a15af91867320957bfd38a43d9eefbb74fe6919e15119b6d805',
116127
100
117128
);
129+
$this->logger->expects($this->never())
130+
->method('info');
118131

119132
$this->limiter->registerUserRequest('MyIdentifier', 100, 100, $user);
120133
}

0 commit comments

Comments
 (0)