diff --git a/apps/dav/lib/Connector/Sabre/QuirksPlugin.php b/apps/dav/lib/Connector/Sabre/QuirksPlugin.php new file mode 100644 index 0000000000000..5f546aa95729c --- /dev/null +++ b/apps/dav/lib/Connector/Sabre/QuirksPlugin.php @@ -0,0 +1,91 @@ + + * + * @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 . + * + */ +namespace OCA\DAV\Connector\Sabre; + +use Sabre\DAV\Server; +use Sabre\DAV\ServerPlugin; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; + +class QuirksPlugin extends ServerPlugin { + + private $isMacOSDavAgent = false; + + private $macOSVersion; + + private $macOSAgent; + + private $macOSAgentVersion; + + /** + * Sets up the plugin. + * + * This method is automatically called by the server class. + */ + public function initialize(Server $server) + { + $server->on('beforeMethod:*', [$this, 'beforeMethod'], 0); + $server->on('report', [$this, 'report'], 0); + } + + /** + * Triggered before any method is handled. + */ + public function beforeMethod(RequestInterface $request, ResponseInterface $response) + { + $userAgent = $request->getRawServerValue('HTTP_USER_AGENT'); + + // OSX agent string: macOS/13.2.1 (22D68) dataaccessd/1.0 + if (preg_match('|macOS/([0-9]+)\\.([0-9]+)\\.([0-9]+)\s+\((\w+)\)\s+([^/]+)/([0-9]+)(?:\\.([0-9]+))?(?:\\.([0-9]+))?$|i', $userAgent, $matches)) { + $this->isMacOSDavAgent = true; + $this->macOSVersion = [ + 'major' => $matches[1], + 'minor' => $matches[2], + 'patch' => $matches[3], + ]; + $this->macOSAgent = $matches[5]; + $this->macOSAgentVersion = [ + 'major' => $matches[6], + 'minor' => $matches[7] ?? null, + 'patch' => $matches[8] ?? null, + ]; + // \OCP\Util::writeLog('dav', 'OSX AGENT', \OCP\Util::INFO); + } + } + + /** + * This method handles HTTP REPORT requests. + * + * @param string $reportName + * @param mixed $report + * @param mixed $path + */ + public function report($reportName, $report, $path) + { + if ($this->isMacOSDavAgent && $reportName == '{DAV:}principal-property-search') { + /** @var \Sabre\DAVACL\Xml\Request\PrincipalPropertySearchReport $report */ + $report->applyToPrincipalCollectionSet = true; + } + return true; + } +} diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index a5833e5175f48..4aa17d3f659af 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -110,6 +110,8 @@ public function __construct(IRequest $request, string $baseUri) { // Add maintenance plugin $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\MaintenancePlugin(\OC::$server->getConfig(), \OC::$server->getL10N('dav'))); + $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\QuirksPlugin()); + // Backends $authBackend = new Auth( \OC::$server->getSession(),