mirror of
https://github.com/nextcloud/server.git
synced 2026-05-19 08:25:56 -04:00
fix: check if properties exist before using them
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
This commit is contained in:
parent
62d2224ceb
commit
0641006b02
2 changed files with 810 additions and 252 deletions
|
|
@ -21,6 +21,7 @@ use Psr\Container\ContainerInterface;
|
|||
use Psr\Log\LoggerInterface;
|
||||
use Sabre\VObject\Component\VCalendar;
|
||||
use Sabre\VObject\Component\VEvent;
|
||||
use Sabre\VObject\ParseException;
|
||||
use Sabre\VObject\Property\VCard\DateTime;
|
||||
use Sabre\VObject\Reader;
|
||||
use Throwable;
|
||||
|
|
@ -213,23 +214,51 @@ class Manager implements IManager {
|
|||
string $recipient,
|
||||
string $calendarData,
|
||||
): bool {
|
||||
/** @var VCalendar $vObject|null */
|
||||
$vObject = Reader::read($calendarData);
|
||||
|
||||
$calendars = $this->getCalendarsForPrincipal($principalUri);
|
||||
if (empty($calendars)) {
|
||||
$this->logger->warning('iMip message could not be processed because user has no calendars');
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
/** @var VCalendar $vObject|null */
|
||||
$vObject = Reader::read($calendarData);
|
||||
} catch (ParseException $e) {
|
||||
$this->logger->error('iMip message could not be processed because an error occurred while parsing the iMip message', ['exception' => $e]);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($vObject === null) {
|
||||
$this->logger->warning('iMip message contains an invalid calendar object');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($vObject->METHOD) || $vObject->METHOD->getValue() !== 'REPLY') {
|
||||
$this->logger->warning('iMip message contains an incorrect or invalid method');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($vObject->VEVENT)) {
|
||||
$this->logger->warning('iMip message contains no event');
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @var VEvent|null $vEvent */
|
||||
$vEvent = $vObject->{'VEVENT'};
|
||||
$vEvent = $vObject->VEVENT;
|
||||
|
||||
if ($vEvent === null) {
|
||||
if (!isset($vEvent->UID)) {
|
||||
$this->logger->warning('iMip message event dose not contains a UID');
|
||||
return false;
|
||||
}
|
||||
|
||||
// First, we check if the correct method is passed to us
|
||||
if (strcasecmp('REPLY', $vObject->{'METHOD'}->getValue()) !== 0) {
|
||||
$this->logger->warning('Wrong method provided for processing');
|
||||
if (!isset($vEvent->ORGANIZER)) {
|
||||
$this->logger->warning('iMip message event dose not contains an organizer');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($vEvent->ATTENDEE)) {
|
||||
$this->logger->warning('iMip message event dose not contains any attendees');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -237,7 +266,7 @@ class Manager implements IManager {
|
|||
$organizer = substr($vEvent->{'ORGANIZER'}->getValue(), 7);
|
||||
|
||||
if (strcasecmp($recipient, $organizer) !== 0) {
|
||||
$this->logger->warning('Recipient and ORGANIZER must be identical');
|
||||
$this->logger->warning('iMip message event could not be processed because recipient and ORGANIZER must be identical');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -245,13 +274,7 @@ class Manager implements IManager {
|
|||
/** @var DateTime $eventTime */
|
||||
$eventTime = $vEvent->{'DTSTART'};
|
||||
if ($eventTime->getDateTime()->getTimeStamp() < $this->timeFactory->getTime()) { // this might cause issues with recurrences
|
||||
$this->logger->warning('Only events in the future are processed');
|
||||
return false;
|
||||
}
|
||||
|
||||
$calendars = $this->getCalendarsForPrincipal($principalUri);
|
||||
if (empty($calendars)) {
|
||||
$this->logger->warning('Could not find any calendars for principal ' . $principalUri);
|
||||
$this->logger->warning('iMip message event could not be processed because the event is in the past');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -273,14 +296,14 @@ class Manager implements IManager {
|
|||
}
|
||||
|
||||
if (empty($found)) {
|
||||
$this->logger->info('Event not found in any calendar for principal ' . $principalUri . 'and UID' . $vEvent->{'UID'}->getValue());
|
||||
$this->logger->warning('iMip message event could not be processed because no corresponding event was found in any calendar ' . $principalUri . ' and UID ' . $vEvent->{'UID'}->getValue());
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$found->handleIMipMessage($name, $calendarData); // sabre will handle the scheduling behind the scenes
|
||||
} catch (CalendarException $e) {
|
||||
$this->logger->error('Could not update calendar for iMIP processing', ['exception' => $e]);
|
||||
$this->logger->error('An error occurred while processing the iMip message event', ['exception' => $e]);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
@ -297,29 +320,57 @@ class Manager implements IManager {
|
|||
string $recipient,
|
||||
string $calendarData,
|
||||
): bool {
|
||||
/** @var VCalendar $vObject|null */
|
||||
$vObject = Reader::read($calendarData);
|
||||
|
||||
$calendars = $this->getCalendarsForPrincipal($principalUri);
|
||||
if (empty($calendars)) {
|
||||
$this->logger->warning('iMip message could not be processed because user has no calendars');
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
/** @var VCalendar $vObject|null */
|
||||
$vObject = Reader::read($calendarData);
|
||||
} catch (ParseException $e) {
|
||||
$this->logger->error('iMip message could not be processed because an error occurred while parsing the iMip message', ['exception' => $e]);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($vObject === null) {
|
||||
$this->logger->warning('iMip message contains an invalid calendar object');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($vObject->METHOD) || $vObject->METHOD->getValue() !== 'CANCEL') {
|
||||
$this->logger->warning('iMip message contains an incorrect or invalid method');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($vObject->VEVENT)) {
|
||||
$this->logger->warning('iMip message contains no event');
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @var VEvent|null $vEvent */
|
||||
$vEvent = $vObject->{'VEVENT'};
|
||||
|
||||
if ($vEvent === null) {
|
||||
if (!isset($vEvent->UID)) {
|
||||
$this->logger->warning('iMip message event dose not contains a UID');
|
||||
return false;
|
||||
}
|
||||
|
||||
// First, we check if the correct method is passed to us
|
||||
if (strcasecmp('CANCEL', $vObject->{'METHOD'}->getValue()) !== 0) {
|
||||
$this->logger->warning('Wrong method provided for processing');
|
||||
if (!isset($vEvent->ORGANIZER)) {
|
||||
$this->logger->warning('iMip message event dose not contains an organizer');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($vEvent->ATTENDEE)) {
|
||||
$this->logger->warning('iMip message event dose not contains any attendees');
|
||||
return false;
|
||||
}
|
||||
|
||||
$attendee = substr($vEvent->{'ATTENDEE'}->getValue(), 7);
|
||||
if (strcasecmp($recipient, $attendee) !== 0) {
|
||||
$this->logger->warning('Recipient must be an ATTENDEE of this event');
|
||||
$this->logger->warning('iMip message event could not be processed because recipient must be an ATTENDEE of this event');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -330,7 +381,7 @@ class Manager implements IManager {
|
|||
$organizer = substr($vEvent->{'ORGANIZER'}->getValue(), 7);
|
||||
$isNotOrganizer = ($replyTo !== null) ? (strcasecmp($sender, $organizer) !== 0 && strcasecmp($replyTo, $organizer) !== 0) : (strcasecmp($sender, $organizer) !== 0);
|
||||
if ($isNotOrganizer) {
|
||||
$this->logger->warning('Sender must be the ORGANIZER of this event');
|
||||
$this->logger->warning('iMip message event could not be processed because sender must be the ORGANIZER of this event');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -338,14 +389,7 @@ class Manager implements IManager {
|
|||
/** @var DateTime $eventTime */
|
||||
$eventTime = $vEvent->{'DTSTART'};
|
||||
if ($eventTime->getDateTime()->getTimeStamp() < $this->timeFactory->getTime()) { // this might cause issues with recurrences
|
||||
$this->logger->warning('Only events in the future are processed');
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if we have a calendar to work with
|
||||
$calendars = $this->getCalendarsForPrincipal($principalUri);
|
||||
if (empty($calendars)) {
|
||||
$this->logger->warning('Could not find any calendars for principal ' . $principalUri);
|
||||
$this->logger->warning('iMip message event could not be processed because the event is in the past');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -367,17 +411,15 @@ class Manager implements IManager {
|
|||
}
|
||||
|
||||
if (empty($found)) {
|
||||
$this->logger->info('Event not found in any calendar for principal ' . $principalUri . 'and UID' . $vEvent->{'UID'}->getValue());
|
||||
// this is a safe operation
|
||||
// we can ignore events that have been cancelled but were not in the calendar anyway
|
||||
return true;
|
||||
$this->logger->warning('iMip message event could not be processed because no corresponding event was found in any calendar ' . $principalUri . ' and UID ' . $vEvent->{'UID'}->getValue());
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$found->handleIMipMessage($name, $calendarData); // sabre will handle the scheduling behind the scenes
|
||||
return true;
|
||||
} catch (CalendarException $e) {
|
||||
$this->logger->error('Could not update calendar for iMIP processing', ['exception' => $e]);
|
||||
$this->logger->error('An error occurred while processing the iMip message event', ['exception' => $e]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue