]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add create method to extended calendar implementation 29188/head
authorAnna Larch <anna@nextcloud.com>
Tue, 12 Oct 2021 14:30:00 +0000 (16:30 +0200)
committerChristoph Wurst <christoph@winzerhof-wurst.at>
Fri, 15 Oct 2021 07:35:29 +0000 (09:35 +0200)
Signed-off-by: Anna Larch <anna@nextcloud.com>
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
apps/dav/composer/composer/autoload_classmap.php
apps/dav/composer/composer/autoload_static.php
apps/dav/lib/CalDAV/Auth/CustomPrincipalPlugin.php [new file with mode: 0644]
apps/dav/lib/CalDAV/Auth/PublicPrincipalPlugin.php [new file with mode: 0644]
apps/dav/lib/CalDAV/CalendarImpl.php
apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/public/Calendar/Exceptions/CalendarException.php [new file with mode: 0644]
lib/public/Calendar/ICreateFromString.php [new file with mode: 0644]

index daf2cff31613eadba0874be6a4c6af3dec3ffd6a..62c41a0828d6fa0606db73643dd01cfd7836906a 100644 (file)
@@ -33,6 +33,8 @@ return array(
     'OCA\\DAV\\CalDAV\\Activity\\Setting\\Calendar' => $baseDir . '/../lib/CalDAV/Activity/Setting/Calendar.php',
     'OCA\\DAV\\CalDAV\\Activity\\Setting\\Event' => $baseDir . '/../lib/CalDAV/Activity/Setting/Event.php',
     'OCA\\DAV\\CalDAV\\Activity\\Setting\\Todo' => $baseDir . '/../lib/CalDAV/Activity/Setting/Todo.php',
+    'OCA\\DAV\\CalDAV\\Auth\\CustomPrincipalPlugin' => $baseDir . '/../lib/CalDAV/Auth/CustomPrincipalPlugin.php',
+    'OCA\\DAV\\CalDAV\\Auth\\PublicPrincipalPlugin' => $baseDir . '/../lib/CalDAV/Auth/PublicPrincipalPlugin.php',
     'OCA\\DAV\\CalDAV\\BirthdayCalendar\\EnablePlugin' => $baseDir . '/../lib/CalDAV/BirthdayCalendar/EnablePlugin.php',
     'OCA\\DAV\\CalDAV\\BirthdayService' => $baseDir . '/../lib/CalDAV/BirthdayService.php',
     'OCA\\DAV\\CalDAV\\CachedSubscription' => $baseDir . '/../lib/CalDAV/CachedSubscription.php',
index d00299ed047baf3c9fec6eb3e09d29712b5d6bad..5d5f57eb51b3c700d2e96066d2ec25da5e44f7af 100644 (file)
@@ -48,6 +48,8 @@ class ComposerStaticInitDAV
         'OCA\\DAV\\CalDAV\\Activity\\Setting\\Calendar' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/Setting/Calendar.php',
         'OCA\\DAV\\CalDAV\\Activity\\Setting\\Event' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/Setting/Event.php',
         'OCA\\DAV\\CalDAV\\Activity\\Setting\\Todo' => __DIR__ . '/..' . '/../lib/CalDAV/Activity/Setting/Todo.php',
+        'OCA\\DAV\\CalDAV\\Auth\\CustomPrincipalPlugin' => __DIR__ . '/..' . '/../lib/CalDAV/Auth/CustomPrincipalPlugin.php',
+        'OCA\\DAV\\CalDAV\\Auth\\PublicPrincipalPlugin' => __DIR__ . '/..' . '/../lib/CalDAV/Auth/PublicPrincipalPlugin.php',
         'OCA\\DAV\\CalDAV\\BirthdayCalendar\\EnablePlugin' => __DIR__ . '/..' . '/../lib/CalDAV/BirthdayCalendar/EnablePlugin.php',
         'OCA\\DAV\\CalDAV\\BirthdayService' => __DIR__ . '/..' . '/../lib/CalDAV/BirthdayService.php',
         'OCA\\DAV\\CalDAV\\CachedSubscription' => __DIR__ . '/..' . '/../lib/CalDAV/CachedSubscription.php',
diff --git a/apps/dav/lib/CalDAV/Auth/CustomPrincipalPlugin.php b/apps/dav/lib/CalDAV/Auth/CustomPrincipalPlugin.php
new file mode 100644 (file)
index 0000000..89e50c7
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * CalDAV App
+ *
+ * @copyright 2021 Anna Larch <anna.larch@gmx.net>
+ *
+ * @author Anna Larch <anna.larch@gmx.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\DAV\CalDAV\Auth;
+
+use Sabre\DAV\Auth\Plugin;
+
+/**
+ * Set a custom principal uri to allow public requests to its calendar
+ */
+class CustomPrincipalPlugin extends Plugin {
+       public function setCurrentPrincipal(?string $currentPrincipal): void {
+               $this->currentPrincipal = $currentPrincipal;
+       }
+}
diff --git a/apps/dav/lib/CalDAV/Auth/PublicPrincipalPlugin.php b/apps/dav/lib/CalDAV/Auth/PublicPrincipalPlugin.php
new file mode 100644 (file)
index 0000000..9666955
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * CalDAV App
+ *
+ * @copyright 2021 Anna Larch <anna.larch@gmx.net>
+ *
+ * @author Anna Larch <anna.larch@gmx.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace OCA\DAV\CalDAV\Auth;
+
+use Sabre\DAV\Auth\Plugin;
+
+/**
+ * Defines the public facing principal option
+ */
+class PublicPrincipalPlugin extends Plugin {
+       public function getCurrentPrincipal(): ?string {
+               return 'principals/system/public';
+       }
+}
index 356f28000317bdffc6c3e4e4abede79b9504b1c8..ed37c0a745ddbba4519930d418e1a817e438c83e 100644 (file)
@@ -27,10 +27,14 @@ declare(strict_types=1);
  */
 namespace OCA\DAV\CalDAV;
 
-use OCP\Calendar\ICalendar;
+use OCA\DAV\CalDAV\Auth\CustomPrincipalPlugin;
+use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer;
+use OCP\Calendar\Exceptions\CalendarException;
+use OCP\Calendar\ICreateFromString;
 use OCP\Constants;
+use Sabre\DAV\Exception\Conflict;
 
-class CalendarImpl implements ICalendar {
+class CalendarImpl implements ICreateFromString {
 
        /** @var CalDavBackend */
        private $backend;
@@ -48,7 +52,8 @@ class CalendarImpl implements ICalendar {
         * @param array $calendarInfo
         * @param CalDavBackend $backend
         */
-       public function __construct(Calendar $calendar, array $calendarInfo,
+       public function __construct(Calendar $calendar,
+                                                               array $calendarInfo,
                                                                CalDavBackend $backend) {
                $this->calendar = $calendar;
                $this->calendarInfo = $calendarInfo;
@@ -120,4 +125,35 @@ class CalendarImpl implements ICalendar {
 
                return $result;
        }
+
+       /**
+        * Create a new calendar event for this calendar
+        * by way of an ICS string
+        *
+        * @param string $name the file name - needs to contan the .ics ending
+        * @param string $calendarData a string containing a valid VEVENT ics
+        *
+        * @throws CalendarException
+        */
+       public function createFromString(string $name, string $calendarData): void {
+               $server = new InvitationResponseServer(false);
+
+               /** @var CustomPrincipalPlugin $plugin */
+               $plugin = $server->server->getPlugin('auth');
+               // we're working around the previous implementation
+               // that only allowed the public system principal to be used
+               // so set the custom principal here
+               $plugin->setCurrentPrincipal($this->calendar->getPrincipalURI());
+
+               $stream = fopen('php://memory', 'rb+');
+               fwrite($stream, $calendarData);
+               rewind($stream);
+               try {
+                       $server->server->createFile($name, $stream);
+               } catch (Conflict $e) {
+                       throw new CalendarException('Could not create new calendar event: ' . $e->getMessage(), 0, $e);
+               } finally {
+                       fclose($stream);
+               }
+       }
 }
index d1ea6902af39a0c48d47337048ba5999145a332f..90e2e478e1ce349e2054fb54eb91cb52cd134bc9 100644 (file)
@@ -26,6 +26,8 @@
 namespace OCA\DAV\CalDAV\InvitationResponse;
 
 use OCA\DAV\AppInfo\PluginManager;
+use OCA\DAV\CalDAV\Auth\CustomPrincipalPlugin;
+use OCA\DAV\CalDAV\Auth\PublicPrincipalPlugin;
 use OCA\DAV\Connector\Sabre\AnonymousOptionsPlugin;
 use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin;
 use OCA\DAV\Connector\Sabre\CachingTree;
@@ -33,7 +35,6 @@ use OCA\DAV\Connector\Sabre\DavAclPlugin;
 use OCA\DAV\Events\SabrePluginAuthInitEvent;
 use OCA\DAV\RootCollection;
 use OCP\EventDispatcher\IEventDispatcher;
-use Sabre\DAV\Auth\Plugin;
 use Sabre\VObject\ITip\Message;
 
 class InvitationResponseServer {
@@ -44,7 +45,7 @@ class InvitationResponseServer {
        /**
         * InvitationResponseServer constructor.
         */
-       public function __construct() {
+       public function __construct(bool $public = true) {
                $baseUri = \OC::$WEBROOT . '/remote.php/dav/';
                $logger = \OC::$server->getLogger();
                /** @var IEventDispatcher $dispatcher */
@@ -62,11 +63,13 @@ class InvitationResponseServer {
 
                $this->server->addPlugin(new BlockLegacyClientPlugin(\OC::$server->getConfig()));
                $this->server->addPlugin(new AnonymousOptionsPlugin());
-               $this->server->addPlugin(new class() extends Plugin {
-                       public function getCurrentPrincipal() {
-                               return 'principals/system/public';
-                       }
-               });
+
+               // allow custom principal uri option
+               if ($public) {
+                       $this->server->addPlugin(new PublicPrincipalPlugin());
+               } else {
+                       $this->server->addPlugin(new CustomPrincipalPlugin());
+               }
 
                // allow setup of additional auth backends
                $event = new SabrePluginAuthInitEvent($this->server);
index 353fc22d486982f0d48a0f29541d008ecc54822a..b67b25b77f8bb08d22bb2e11688de4c4fd4d9257 100644 (file)
@@ -116,9 +116,11 @@ return array(
     'OCP\\BackgroundJob\\TimedJob' => $baseDir . '/lib/public/BackgroundJob/TimedJob.php',
     'OCP\\Broadcast\\Events\\IBroadcastEvent' => $baseDir . '/lib/public/Broadcast/Events/IBroadcastEvent.php',
     'OCP\\Calendar\\BackendTemporarilyUnavailableException' => $baseDir . '/lib/public/Calendar/BackendTemporarilyUnavailableException.php',
+    'OCP\\Calendar\\Exceptions\\CalendarException' => $baseDir . '/lib/public/Calendar/Exceptions/CalendarException.php',
     'OCP\\Calendar\\ICalendar' => $baseDir . '/lib/public/Calendar/ICalendar.php',
     'OCP\\Calendar\\ICalendarProvider' => $baseDir . '/lib/public/Calendar/ICalendarProvider.php',
     'OCP\\Calendar\\ICalendarQuery' => $baseDir . '/lib/public/Calendar/ICalendarQuery.php',
+    'OCP\\Calendar\\ICreateFromString' => $baseDir . '/lib/public/Calendar/ICreateFromString.php',
     'OCP\\Calendar\\IManager' => $baseDir . '/lib/public/Calendar/IManager.php',
     'OCP\\Calendar\\IMetadataProvider' => $baseDir . '/lib/public/Calendar/IMetadataProvider.php',
     'OCP\\Calendar\\Resource\\IBackend' => $baseDir . '/lib/public/Calendar/Resource/IBackend.php',
index f7c541d8c319d4bda08a7420e6805afaa5c62844..cf2f6505817ee5f4b26171162aa5ba08f011f64f 100644 (file)
@@ -145,9 +145,11 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OCP\\BackgroundJob\\TimedJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/TimedJob.php',
         'OCP\\Broadcast\\Events\\IBroadcastEvent' => __DIR__ . '/../../..' . '/lib/public/Broadcast/Events/IBroadcastEvent.php',
         'OCP\\Calendar\\BackendTemporarilyUnavailableException' => __DIR__ . '/../../..' . '/lib/public/Calendar/BackendTemporarilyUnavailableException.php',
+        'OCP\\Calendar\\Exceptions\\CalendarException' => __DIR__ . '/../../..' . '/lib/public/Calendar/Exceptions/CalendarException.php',
         'OCP\\Calendar\\ICalendar' => __DIR__ . '/../../..' . '/lib/public/Calendar/ICalendar.php',
         'OCP\\Calendar\\ICalendarProvider' => __DIR__ . '/../../..' . '/lib/public/Calendar/ICalendarProvider.php',
         'OCP\\Calendar\\ICalendarQuery' => __DIR__ . '/../../..' . '/lib/public/Calendar/ICalendarQuery.php',
+        'OCP\\Calendar\\ICreateFromString' => __DIR__ . '/../../..' . '/lib/public/Calendar/ICreateFromString.php',
         'OCP\\Calendar\\IManager' => __DIR__ . '/../../..' . '/lib/public/Calendar/IManager.php',
         'OCP\\Calendar\\IMetadataProvider' => __DIR__ . '/../../..' . '/lib/public/Calendar/IMetadataProvider.php',
         'OCP\\Calendar\\Resource\\IBackend' => __DIR__ . '/../../..' . '/lib/public/Calendar/Resource/IBackend.php',
diff --git a/lib/public/Calendar/Exceptions/CalendarException.php b/lib/public/Calendar/Exceptions/CalendarException.php
new file mode 100644 (file)
index 0000000..834dd1a
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright 2021 Anna Larch <anna.larch@gmx.net>
+ *
+ * @author Anna Larch <anna.larch@gmx.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Calendar\Exceptions;
+
+use Exception;
+
+/**
+ * @since 23.0.0
+ */
+class CalendarException extends Exception {
+}
diff --git a/lib/public/Calendar/ICreateFromString.php b/lib/public/Calendar/ICreateFromString.php
new file mode 100644 (file)
index 0000000..343405e
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @copyright 2021 Anna Larch <anna.larch@gmx.net>
+ *
+ * @author Anna Larch <anna.larch@gmx.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace OCP\Calendar;
+
+use OCP\Calendar\Exceptions\CalendarException;
+
+/**
+ * Extends the current ICalendar interface
+ * to add a public write method
+ *
+ * @since 23.0.0
+ */
+interface ICreateFromString extends ICalendar {
+
+       /**
+        * @since 23.0.0
+        *
+        * @throws CalendarException
+        */
+       public function createFromString(string $name, string $calendarData): void;
+}