diff options
author | Daniel <mail@danielkesselberg.de> | 2021-10-15 11:33:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-15 11:33:37 +0200 |
commit | 5645b2a18ad6d719e2de42760be238dc56460fbb (patch) | |
tree | 0ecff24eabdfe16509b5aa656b5f2950c56f65b9 /apps/dav/lib | |
parent | f7a4ff4d633ab9cd964e1f5f71158737e73ed1b7 (diff) | |
parent | 0401d6dc0ff33d31982f7aa7e752378d98d82f9d (diff) | |
download | nextcloud-server-5645b2a18ad6d719e2de42760be238dc56460fbb.tar.gz nextcloud-server-5645b2a18ad6d719e2de42760be238dc56460fbb.zip |
Merge pull request #29188 from nextcloud/enhancement/public-write-api
Add calendar object creation API to OCP
Diffstat (limited to 'apps/dav/lib')
-rw-r--r-- | apps/dav/lib/CalDAV/Auth/CustomPrincipalPlugin.php | 38 | ||||
-rw-r--r-- | apps/dav/lib/CalDAV/Auth/PublicPrincipalPlugin.php | 37 | ||||
-rw-r--r-- | apps/dav/lib/CalDAV/CalendarImpl.php | 42 | ||||
-rw-r--r-- | apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php | 17 |
4 files changed, 124 insertions, 10 deletions
diff --git a/apps/dav/lib/CalDAV/Auth/CustomPrincipalPlugin.php b/apps/dav/lib/CalDAV/Auth/CustomPrincipalPlugin.php new file mode 100644 index 00000000000..89e50c7da6b --- /dev/null +++ b/apps/dav/lib/CalDAV/Auth/CustomPrincipalPlugin.php @@ -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 index 00000000000..96669558818 --- /dev/null +++ b/apps/dav/lib/CalDAV/Auth/PublicPrincipalPlugin.php @@ -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'; + } +} diff --git a/apps/dav/lib/CalDAV/CalendarImpl.php b/apps/dav/lib/CalDAV/CalendarImpl.php index 356f2800031..ed37c0a745d 100644 --- a/apps/dav/lib/CalDAV/CalendarImpl.php +++ b/apps/dav/lib/CalDAV/CalendarImpl.php @@ -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); + } + } } diff --git a/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php b/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php index d1ea6902af3..90e2e478e1c 100644 --- a/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php +++ b/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php @@ -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); |