]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix bogus deletion on copy + unlink through rename
authorVincent Petry <pvince81@owncloud.com>
Mon, 26 Jan 2015 11:22:22 +0000 (12:22 +0100)
committerVincent Petry <pvince81@owncloud.com>
Mon, 26 Jan 2015 11:22:22 +0000 (12:22 +0100)
Cross-storage rename would cause copy + unlink. That unlink operation
must not trigger the trashbin.

apps/files_trashbin/lib/storage.php
apps/files_trashbin/lib/trashbin.php
apps/files_trashbin/tests/storage.php

index f51d2a2fb702fbb44a6ae9a8e4f5d0e64e651a92..21b4e56d0bbbbad2f682e5791b472cea46091954 100644 (file)
@@ -33,12 +33,43 @@ class Storage extends Wrapper {
        // move files across storages
        private $deletedFiles = array();
 
+       /**
+        * Disable trash logic
+        *
+        * @var bool
+        */
+       private static $disableTrash = false;
+
        function __construct($parameters) {
                $this->mountPoint = $parameters['mountPoint'];
                parent::__construct($parameters);
        }
 
+       /**
+        * @internal
+        */
+       public static function preRenameHook($params) {
+               // in cross-storage cases, a rename is a copy + unlink,
+               // that last unlink must not go to trash
+               self::$disableTrash = true;
+       }
+
+       /**
+        * @internal
+        */
+       public static function postRenameHook($params) {
+               self::$disableTrash = false;
+       }
+
+       /**
+        * Deletes the given file by moving it into the trashbin.
+        *
+        * @param string $path
+        */
        public function unlink($path) {
+               if (self::$disableTrash) {
+                       return $this->storage->unlink($path);
+               }
                $normalized = Filesystem::normalizePath($this->mountPoint . '/' . $path);
                $result = true;
                if (!isset($this->deletedFiles[$normalized])) {
index f5cebea6b789a0d18d3eebb4dfd5a71a517c77ce..4086bb1216dcfa6f23cbcf3072f10b6f1d4eff56 100644 (file)
@@ -928,6 +928,9 @@ class Trashbin {
                \OCP\Util::connectHook('OC_User', 'pre_deleteUser', 'OCA\Files_Trashbin\Hooks', 'deleteUser_hook');
                //Listen to post write hook
                \OCP\Util::connectHook('OC_Filesystem', 'post_write', 'OCA\Files_Trashbin\Hooks', 'post_write_hook');
+               // pre and post-rename, disable trash logic for the copy+unlink case
+               \OCP\Util::connectHook('OC_Filesystem', 'rename', 'OCA\Files_Trashbin\Storage', 'preRenameHook');
+               \OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Files_Trashbin\Storage', 'postRenameHook');
        }
 
        /**
index 050d5fcee5bbaa0211f4520d1b0e6a1cd1a8c207..d9a18e5a15cce2ac412ac7086b8f777f518bf9d5 100644 (file)
@@ -37,6 +37,9 @@ class Storage extends \Test\TestCase {
        protected function setUp() {
                parent::setUp();
 
+               \OC_Hook::clear();
+               \OCA\Files_Trashbin\Trashbin::registerHooks();
+
                $this->user = $this->getUniqueId('user');
                \OC::$server->getUserManager()->createUser($this->user, $this->user);
 
@@ -58,6 +61,7 @@ class Storage extends \Test\TestCase {
                \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
                $this->logout();
                \OC_User::deleteUser($this->user);
+               \OC_Hook::clear();
                parent::tearDown();
        }