]> source.dussan.org Git - nextcloud-server.git/commitdiff
Check quota on file copy
authorCôme Chilliet <come.chilliet@nextcloud.com>
Mon, 7 Nov 2022 16:25:42 +0000 (17:25 +0100)
committerbackportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com>
Tue, 22 Nov 2022 13:53:10 +0000 (13:53 +0000)
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
apps/dav/lib/Connector/Sabre/QuotaPlugin.php

index f2b652e33201ae0009898d04c321fcf61aa89707..0e5ffe517283ea5af4f340ac84c2379c7bd6f918 100644 (file)
@@ -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