diff options
Diffstat (limited to 'apps/dav/lib/caldav/schedule/imipplugin.php')
-rw-r--r-- | apps/dav/lib/caldav/schedule/imipplugin.php | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/apps/dav/lib/caldav/schedule/imipplugin.php b/apps/dav/lib/caldav/schedule/imipplugin.php new file mode 100644 index 00000000000..eafdbe9c1bd --- /dev/null +++ b/apps/dav/lib/caldav/schedule/imipplugin.php @@ -0,0 +1,110 @@ +<?php + +namespace OCA\DAV\CalDAV\Schedule; + +use OCP\ILogger; +use OCP\Mail\IMailer; +use Sabre\DAV; +use Sabre\VObject\ITip; +use Sabre\CalDAV\Schedule\IMipPlugin as SabreIMipPlugin; +/** + * iMIP handler. + * + * This class is responsible for sending out iMIP messages. iMIP is the + * email-based transport for iTIP. iTIP deals with scheduling operations for + * iCalendar objects. + * + * If you want to customize the email that gets sent out, you can do so by + * extending this class and overriding the sendMessage method. + * + * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/). + * @author Evert Pot (http://evertpot.com/) + * @license http://sabre.io/license/ Modified BSD License + */ +class IMipPlugin extends SabreIMipPlugin { + + /** @var IMailer */ + private $mailer; + + /** @var ILogger */ + private $logger; + + /** + * Creates the email handler. + * + * @param IMailer $mailer + */ + function __construct(IMailer $mailer, ILogger $logger) { + parent::__construct(''); + $this->mailer = $mailer; + $this->logger = $logger; + } + + /** + * Event handler for the 'schedule' event. + * + * @param ITip\Message $iTipMessage + * @return void + */ + function schedule(ITip\Message $iTipMessage) { + + // Not sending any emails if the system considers the update + // insignificant. + if (!$iTipMessage->significantChange) { + if (!$iTipMessage->scheduleStatus) { + $iTipMessage->scheduleStatus = '1.0;We got the message, but it\'s not significant enough to warrant an email'; + } + return; + } + + $summary = $iTipMessage->message->VEVENT->SUMMARY; + + if (parse_url($iTipMessage->sender, PHP_URL_SCHEME) !== 'mailto') { + return; + } + + if (parse_url($iTipMessage->recipient, PHP_URL_SCHEME) !== 'mailto') { + return; + } + + $sender = substr($iTipMessage->sender, 7); + $recipient = substr($iTipMessage->recipient, 7); + + $senderName = ($iTipMessage->senderName) ? $iTipMessage->senderName : null; + $recipientName = ($iTipMessage->recipientName) ? $iTipMessage->recipientName : null; + + $subject = 'SabreDAV iTIP message'; + switch (strtoupper($iTipMessage->method)) { + case 'REPLY' : + $subject = 'Re: ' . $summary; + break; + case 'REQUEST' : + $subject = $summary; + break; + case 'CANCEL' : + $subject = 'Cancelled: ' . $summary; + break; + } + + $contentType = 'text/calendar; charset=UTF-8; method=' . $iTipMessage->method; + + $message = $this->mailer->createMessage(); + + $message->setReplyTo([$sender => $senderName]) + ->setTo([$recipient => $recipientName]) + ->setSubject($subject) + ->setBody($iTipMessage->message->serialize(), $contentType); + try { + $failed = $this->mailer->send($message); + if ($failed) { + $this->logger->error('Unable to deliver message to {failed}', ['app' => 'dav', 'failed' => implode(', ', $failed)]); + $iTipMessage->scheduleStatus = '5.0; EMail delivery failed'; + } + $iTipMessage->scheduleStatus = '1.1; Scheduling message is sent via iMip'; + } catch(\Exception $ex) { + $this->logger->logException($ex, ['app' => 'dav']); + $iTipMessage->scheduleStatus = '5.0; EMail delivery failed'; + } + } + +} |