diff options
Diffstat (limited to 'apps/dav/lib/Connector/Sabre/ChecksumUpdatePlugin.php')
-rw-r--r-- | apps/dav/lib/Connector/Sabre/ChecksumUpdatePlugin.php | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/apps/dav/lib/Connector/Sabre/ChecksumUpdatePlugin.php b/apps/dav/lib/Connector/Sabre/ChecksumUpdatePlugin.php new file mode 100644 index 00000000000..18009080585 --- /dev/null +++ b/apps/dav/lib/Connector/Sabre/ChecksumUpdatePlugin.php @@ -0,0 +1,55 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\DAV\Connector\Sabre; + +use OCP\AppFramework\Http; +use Sabre\DAV\Server; +use Sabre\DAV\ServerPlugin; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; + +class ChecksumUpdatePlugin extends ServerPlugin { + protected ?Server $server = null; + + public function initialize(Server $server) { + $this->server = $server; + $server->on('method:PATCH', [$this, 'httpPatch']); + } + + public function getPluginName(): string { + return 'checksumupdate'; + } + + /** @return string[] */ + public function getFeatures(): array { + return ['nextcloud-checksum-update']; + } + + public function httpPatch(RequestInterface $request, ResponseInterface $response) { + $path = $request->getPath(); + + $node = $this->server->tree->getNodeForPath($path); + if ($node instanceof File) { + $type = strtolower( + (string)$request->getHeader('X-Recalculate-Hash') + ); + + $hash = $node->hash($type); + if ($hash) { + $checksum = strtoupper($type) . ':' . $hash; + $node->setChecksum($checksum); + $response->addHeader('OC-Checksum', $checksum); + $response->setHeader('Content-Length', '0'); + $response->setStatus(Http::STATUS_NO_CONTENT); + + return false; + } + } + } +} |