Skip to content

Commit

Permalink
fix(dav): don't crash subscription on invalid calendar object
Browse files Browse the repository at this point in the history
Signed-off-by: escoand <[email protected]>
  • Loading branch information
escoand authored and kesselb committed Oct 2, 2024
1 parent 56d88f7 commit 531b73f
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
19 changes: 13 additions & 6 deletions apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use OCP\AppFramework\Utility\ITimeFactory;
use Psr\Log\LoggerInterface;
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\PropPatch;
use Sabre\VObject\Component;
use Sabre\VObject\DateTimeParser;
Expand Down Expand Up @@ -99,7 +100,13 @@ public function refreshSubscription(string $principalUri, string $uri) {
continue;
}

$denormalized = $this->calDavBackend->getDenormalizedData($vObject->serialize());
try {
$denormalized = $this->calDavBackend->getDenormalizedData($vObject->serialize());
} catch (InvalidDataException|Forbidden $ex) {
$this->logger->warning('Unable to denormalize calendar object from subscription {subscriptionId}', ['exception' => $ex, 'subscriptionId' => $subscription['id'], 'source' => $subscription['source']]);
continue;
}

// Find all identical sets and remove them from the update
if (isset($localData[$uid]) && $denormalized['etag'] === $localData[$uid]['etag']) {
unset($localData[$uid]);
Expand All @@ -124,19 +131,19 @@ public function refreshSubscription(string $principalUri, string $uri) {
try {
$objectUri = $this->getRandomCalendarObjectUri();
$this->calDavBackend->createCalendarObject($subscription['id'], $objectUri, $vObject->serialize(), CalDavBackend::CALENDAR_TYPE_SUBSCRIPTION);
} catch (NoInstancesException | BadRequest $ex) {
$this->logger->error('Unable to create calendar object from subscription {subscriptionId}', ['exception' => $ex, 'subscriptionId' => $subscription['id'], 'source' => $subscription['source']]);
} catch (NoInstancesException|BadRequest $ex) {
$this->logger->warning('Unable to create calendar object from subscription {subscriptionId}', ['exception' => $ex, 'subscriptionId' => $subscription['id'], 'source' => $subscription['source']]);
}
}

$ids = array_map(static function ($dataSet): int {
return (int) $dataSet['id'];
return (int)$dataSet['id'];
}, $localData);
$uris = array_map(static function ($dataSet): string {
return $dataSet['uri'];
}, $localData);

if(!empty($ids) && !empty($uris)) {
if (!empty($ids) && !empty($uris)) {
// Clean up on aisle 5
// The only events left over in the $localData array should be those that don't exist upstream
// All deleted VObjects from upstream are removed
Expand All @@ -150,7 +157,7 @@ public function refreshSubscription(string $principalUri, string $uri) {

$this->updateSubscription($subscription, $mutations);
} catch (ParseException $ex) {
$this->logger->error("Subscription {subscriptionId} could not be refreshed due to a parsing error", ['exception' => $ex, 'subscriptionId' => $subscription['id']]);
$this->logger->error('Subscription {subscriptionId} could not be refreshed due to a parsing error', ['exception' => $ex, 'subscriptionId' => $subscription['id']]);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ public function testRunCreateCalendarNoException(string $body, string $contentTy
->willThrowException($noInstanceException);

$this->logger->expects(self::once())
->method('error')
->method('warning')
->with('Unable to create calendar object from subscription {subscriptionId}', ['exception' => $noInstanceException, 'subscriptionId' => '42', 'source' => 'webcal://foo.bar/bla2']);

$refreshWebcalService->refreshSubscription('principals/users/testuser', 'sub123');
Expand Down Expand Up @@ -302,7 +302,7 @@ public function testRunCreateCalendarBadRequest(string $body, string $contentTyp
->willThrowException($badRequestException);

$this->logger->expects(self::once())
->method('error')
->method('warning')
->with('Unable to create calendar object from subscription {subscriptionId}', ['exception' => $badRequestException, 'subscriptionId' => '42', 'source' => 'webcal://foo.bar/bla2']);

$refreshWebcalService->refreshSubscription('principals/users/testuser', 'sub123');
Expand Down

0 comments on commit 531b73f

Please sign in to comment.