catch errors when parsing calendar data for calendar query requests
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
This commit is contained in:
parent
f700cd14fa
commit
ea117bac31
|
@ -49,8 +49,9 @@ $principalBackend = new Principal(
|
|||
$db = \OC::$server->getDatabaseConnection();
|
||||
$userManager = \OC::$server->getUserManager();
|
||||
$random = \OC::$server->getSecureRandom();
|
||||
$logger = \OC::$server->getLogger();
|
||||
$dispatcher = \OC::$server->getEventDispatcher();
|
||||
$calDavBackend = new CalDavBackend($db, $principalBackend, $userManager, \OC::$server->getGroupManager(), $random, $dispatcher, true);
|
||||
$calDavBackend = new CalDavBackend($db, $principalBackend, $userManager, \OC::$server->getGroupManager(), $random, $logger, $dispatcher, true);
|
||||
|
||||
$debugging = \OC::$server->getConfig()->getSystemValue('debug', false);
|
||||
$sendInvitations = \OC::$server->getConfig()->getAppValue('dav', 'sendInvitations', 'yes') === 'yes';
|
||||
|
|
|
@ -37,6 +37,7 @@ use OCA\DAV\Connector\Sabre\Principal;
|
|||
use OCA\DAV\DAV\Sharing\Backend;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\ILogger;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\Security\ISecureRandom;
|
||||
|
@ -56,6 +57,8 @@ use Sabre\VObject\Component\VCalendar;
|
|||
use Sabre\VObject\Component\VEvent;
|
||||
use Sabre\VObject\Component\VTimeZone;
|
||||
use Sabre\VObject\DateTimeParser;
|
||||
use Sabre\VObject\InvalidDataException;
|
||||
use Sabre\VObject\ParseException;
|
||||
use Sabre\VObject\Property;
|
||||
use Sabre\VObject\Reader;
|
||||
use Sabre\VObject\Recur\EventIterator;
|
||||
|
@ -152,6 +155,9 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
|||
/** @var ISecureRandom */
|
||||
private $random;
|
||||
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
||||
/** @var EventDispatcherInterface */
|
||||
private $dispatcher;
|
||||
|
||||
|
@ -169,6 +175,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
|||
* @param IUserManager $userManager
|
||||
* @param IGroupManager $groupManager
|
||||
* @param ISecureRandom $random
|
||||
* @param ILogger $logger
|
||||
* @param EventDispatcherInterface $dispatcher
|
||||
* @param bool $legacyEndpoint
|
||||
*/
|
||||
|
@ -177,6 +184,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
|||
IUserManager $userManager,
|
||||
IGroupManager $groupManager,
|
||||
ISecureRandom $random,
|
||||
ILogger $logger,
|
||||
EventDispatcherInterface $dispatcher,
|
||||
$legacyEndpoint = false) {
|
||||
$this->db = $db;
|
||||
|
@ -184,6 +192,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
|||
$this->userManager = $userManager;
|
||||
$this->sharingBackend = new Backend($this->db, $this->userManager, $groupManager, $principalBackend, 'calendar');
|
||||
$this->random = $random;
|
||||
$this->logger = $logger;
|
||||
$this->dispatcher = $dispatcher;
|
||||
$this->legacyEndpoint = $legacyEndpoint;
|
||||
}
|
||||
|
@ -1219,7 +1228,25 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
|||
$result = [];
|
||||
while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
|
||||
if ($requirePostFilter) {
|
||||
if (!$this->validateFilterForObject($row, $filters)) {
|
||||
// validateFilterForObject will parse the calendar data
|
||||
// catch parsing errors
|
||||
try {
|
||||
$matches = $this->validateFilterForObject($row, $filters);
|
||||
} catch(ParseException $ex) {
|
||||
$this->logger->logException($ex, [
|
||||
'app' => 'dav',
|
||||
'message' => 'Caught parsing exception for calendar data. This usually indicates invalid calendar data. calendar-id:'.$calendarId.' uri:'.$row['uri']
|
||||
]);
|
||||
continue;
|
||||
} catch (InvalidDataException $ex) {
|
||||
$this->logger->logException($ex, [
|
||||
'app' => 'dav',
|
||||
'message' => 'Caught invalid data exception for calendar data. This usually indicates invalid calendar data. calendar-id:'.$calendarId.' uri:'.$row['uri']
|
||||
]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$matches) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,10 +78,11 @@ class CreateCalendar extends Command {
|
|||
$this->groupManager
|
||||
);
|
||||
$random = \OC::$server->getSecureRandom();
|
||||
$logger = \OC::$server->getLogger();
|
||||
$dispatcher = \OC::$server->getEventDispatcher();
|
||||
|
||||
$name = $input->getArgument('name');
|
||||
$caldav = new CalDavBackend($this->dbConnection, $principalBackend, $this->userManager, $this->groupManager, $random, $dispatcher);
|
||||
$caldav = new CalDavBackend($this->dbConnection, $principalBackend, $this->userManager, $this->groupManager, $random, $logger, $dispatcher);
|
||||
$caldav->createCalendar("principals/users/$user", $name, []);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ class RootCollection extends SimpleCollection {
|
|||
public function __construct() {
|
||||
$config = \OC::$server->getConfig();
|
||||
$random = \OC::$server->getSecureRandom();
|
||||
$logger = \OC::$server->getLogger();
|
||||
$userManager = \OC::$server->getUserManager();
|
||||
$groupManager = \OC::$server->getGroupManager();
|
||||
$db = \OC::$server->getDatabaseConnection();
|
||||
|
@ -61,7 +62,7 @@ class RootCollection extends SimpleCollection {
|
|||
$systemPrincipals->disableListing = $disableListing;
|
||||
$filesCollection = new Files\RootCollection($userPrincipalBackend, 'principals/users');
|
||||
$filesCollection->disableListing = $disableListing;
|
||||
$caldavBackend = new CalDavBackend($db, $userPrincipalBackend, $userManager, $groupManager, $random, $dispatcher);
|
||||
$caldavBackend = new CalDavBackend($db, $userPrincipalBackend, $userManager, $groupManager, $random, $logger, $dispatcher);
|
||||
$calendarRoot = new CalendarRoot($userPrincipalBackend, $caldavBackend, 'principals/users');
|
||||
$calendarRoot->disableListing = $disableListing;
|
||||
$publicCalendarRoot = new PublicCalendarRoot($caldavBackend);
|
||||
|
|
|
@ -28,6 +28,7 @@ namespace OCA\DAV\Tests\unit\CalDAV;
|
|||
use OCA\DAV\CalDAV\CalDavBackend;
|
||||
use OCA\DAV\Connector\Sabre\Principal;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\ILogger;
|
||||
use OCP\IUserManager;
|
||||
use OCP\Security\ISecureRandom;
|
||||
use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
|
||||
|
@ -57,6 +58,8 @@ abstract class AbstractCalDavBackend extends TestCase {
|
|||
|
||||
/** @var ISecureRandom */
|
||||
private $random;
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
||||
const UNIT_TEST_USER = 'principals/users/caldav-unit-test';
|
||||
const UNIT_TEST_USER1 = 'principals/users/caldav-unit-test1';
|
||||
|
@ -84,7 +87,8 @@ abstract class AbstractCalDavBackend extends TestCase {
|
|||
|
||||
$db = \OC::$server->getDatabaseConnection();
|
||||
$this->random = \OC::$server->getSecureRandom();
|
||||
$this->backend = new CalDavBackend($db, $this->principal, $this->userManager, $this->groupManager, $this->random, $this->dispatcher);
|
||||
$this->logger = $this->createMock(ILogger::class);
|
||||
$this->backend = new CalDavBackend($db, $this->principal, $this->userManager, $this->groupManager, $this->random, $this->logger, $this->dispatcher);
|
||||
|
||||
$this->cleanUpBackend();
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ use OCP\IGroupManager;
|
|||
use OCP\IL10N;
|
||||
use OCA\DAV\CalDAV\CalDavBackend;
|
||||
use OCA\DAV\CalDAV\PublicCalendarRoot;
|
||||
use OCP\ILogger;
|
||||
use OCP\IUserManager;
|
||||
use OCP\Security\ISecureRandom;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
|
@ -64,6 +65,8 @@ class PublicCalendarRootTest extends TestCase {
|
|||
|
||||
/** @var ISecureRandom */
|
||||
private $random;
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
@ -73,6 +76,7 @@ class PublicCalendarRootTest extends TestCase {
|
|||
$this->userManager = $this->createMock(IUserManager::class);
|
||||
$this->groupManager = $this->createMock(IGroupManager::class);
|
||||
$this->random = \OC::$server->getSecureRandom();
|
||||
$this->logger = $this->createMock(ILogger::class);
|
||||
$dispatcher = $this->createMock(EventDispatcherInterface::class);
|
||||
|
||||
$this->principal->expects($this->any())->method('getGroupMembership')
|
||||
|
@ -85,6 +89,7 @@ class PublicCalendarRootTest extends TestCase {
|
|||
$this->userManager,
|
||||
$this->groupManager,
|
||||
$this->random,
|
||||
$this->logger,
|
||||
$dispatcher
|
||||
);
|
||||
|
||||
|
|
Loading…
Reference in New Issue