Signed-off-by: Anna Larch <anna@nextcloud.com> Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>tags/v23.0.0beta1
@@ -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', |
@@ -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', |
@@ -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; | |||
} | |||
} |
@@ -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'; | |||
} | |||
} |
@@ -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); | |||
} | |||
} | |||
} |
@@ -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); |
@@ -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', |
@@ -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', |
@@ -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 { | |||
} |
@@ -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; | |||
} |