summaryrefslogtreecommitdiffstats
path: root/apps/dav/lib/caldav/schedule/imipplugin.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav/lib/caldav/schedule/imipplugin.php')
-rw-r--r--apps/dav/lib/caldav/schedule/imipplugin.php110
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';
+ }
+ }
+
+}