fix(caldav): limit vevent size
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>pull/46315/head
parent
a8e581ca94
commit
247fbb5538
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace OCA\DAV\CalDAV\Validation;
|
||||
|
||||
use OCA\DAV\AppInfo\Application;
|
||||
use OCP\IAppConfig;
|
||||
use Sabre\DAV\Exception\Forbidden;
|
||||
use Sabre\DAV\Server;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
use Sabre\HTTP\RequestInterface;
|
||||
use Sabre\HTTP\ResponseInterface;
|
||||
|
||||
class CalDavValidatePlugin extends ServerPlugin {
|
||||
|
||||
public function __construct(
|
||||
private IAppConfig $config
|
||||
) {
|
||||
}
|
||||
|
||||
public function initialize(Server $server): void {
|
||||
$server->on('beforeMethod:PUT', [$this, 'beforePut']);
|
||||
}
|
||||
|
||||
public function beforePut(RequestInterface $request, ResponseInterface $response): bool {
|
||||
// evaluate if card size exceeds defined limit
|
||||
$eventSizeLimit = $this->config->getValueInt(Application::APP_ID, 'event_size_limit', 10485760);
|
||||
if ((int) $request->getRawServerValue('CONTENT_LENGTH') > $eventSizeLimit) {
|
||||
throw new Forbidden("VEvent or VTodo object exceeds $eventSizeLimit bytes");
|
||||
}
|
||||
// all tests passed return true
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Tests\unit\CalDAV\Validation;
|
||||
|
||||
use OCA\DAV\CalDAV\Validation\CalDavValidatePlugin;
|
||||
use OCP\IAppConfig;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Sabre\DAV\Exception\Forbidden;
|
||||
use Sabre\HTTP\RequestInterface;
|
||||
use Sabre\HTTP\ResponseInterface;
|
||||
use Test\TestCase;
|
||||
|
||||
class CalDavValidatePluginTest extends TestCase {
|
||||
|
||||
private CalDavValidatePlugin $plugin;
|
||||
private IAppConfig|MockObject $config;
|
||||
private RequestInterface|MockObject $request;
|
||||
private ResponseInterface|MockObject $response;
|
||||
|
||||
protected function setUp(): void {
|
||||
parent::setUp();
|
||||
// construct mock objects
|
||||
$this->config = $this->createMock(IAppConfig::class);
|
||||
$this->request = $this->createMock(RequestInterface::class);
|
||||
$this->response = $this->createMock(ResponseInterface::class);
|
||||
$this->plugin = new CalDavValidatePlugin(
|
||||
$this->config,
|
||||
);
|
||||
}
|
||||
|
||||
public function testPutSizeLessThenLimit(): void {
|
||||
|
||||
// construct method responses
|
||||
$this->config
|
||||
->method('getValueInt')
|
||||
->with('dav', 'event_size_limit', 10485760)
|
||||
->willReturn(10485760);
|
||||
$this->request
|
||||
->method('getRawServerValue')
|
||||
->with('CONTENT_LENGTH')
|
||||
->willReturn('1024');
|
||||
// test condition
|
||||
$this->assertTrue(
|
||||
$this->plugin->beforePut($this->request, $this->response)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
public function testPutSizeMoreThenLimit(): void {
|
||||
|
||||
// construct method responses
|
||||
$this->config
|
||||
->method('getValueInt')
|
||||
->with('dav', 'event_size_limit', 10485760)
|
||||
->willReturn(10485760);
|
||||
$this->request
|
||||
->method('getRawServerValue')
|
||||
->with('CONTENT_LENGTH')
|
||||
->willReturn('16242880');
|
||||
$this->expectException(Forbidden::class);
|
||||
// test condition
|
||||
$this->plugin->beforePut($this->request, $this->response);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue