From: Côme Chilliet Date: Mon, 7 Nov 2022 16:25:42 +0000 (+0100) Subject: Check quota on file copy X-Git-Tag: v23.0.12rc1~9^2~3 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6638b5411e3f4a46c91e977d53fe5e03b5734ea6;p=nextcloud-server.git Check quota on file copy Signed-off-by: Côme Chilliet --- diff --git a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php index f2b652e3320..0e5ffe51728 100644 --- a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php +++ b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php @@ -44,7 +44,6 @@ use Sabre\DAV\INode; * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class QuotaPlugin extends \Sabre\DAV\ServerPlugin { - /** @var \OC\Files\View */ private $view; @@ -79,6 +78,7 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin { $server->on('beforeWriteContent', [$this, 'beforeWriteContent'], 10); $server->on('beforeCreateFile', [$this, 'beforeCreateFile'], 10); $server->on('beforeMove', [$this, 'beforeMove'], 10); + $server->on('beforeCopy', [$this, 'beforeCopy'], 10); } /** @@ -138,6 +138,27 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin { return $this->checkQuota($path, $sourceNode->getSize()); } + /** + * Check quota on the target destination before a copy. + */ + public function beforeCopy(string $sourcePath, string $destinationPath): bool { + $sourceNode = $this->server->tree->getNodeForPath($sourcePath); + if (!$sourceNode instanceof Node) { + return false; + } + + // get target node for proper path conversion + if ($this->server->tree->nodeExists($destinationPath)) { + $destinationNode = $this->server->tree->getNodeForPath($destinationPath); + $path = $destinationNode->getPath(); + } else { + $parentNode = $this->server->tree->getNodeForPath(dirname($destinationPath)); + $path = $parentNode->getPath(); + } + + return $this->checkQuota($path, $sourceNode->getSize()); + } + /** * This method is called before any HTTP method and validates there is enough free space to store the file