]> source.dussan.org Git - nextcloud-server.git/commitdiff
Detect failed deletes in the trashbin
authorRobin Appelman <icewind@owncloud.com>
Wed, 28 Jan 2015 14:35:49 +0000 (15:35 +0100)
committerRobin Appelman <icewind@owncloud.com>
Thu, 29 Jan 2015 14:39:58 +0000 (15:39 +0100)
apps/files_trashbin/lib/trashbin.php
apps/files_trashbin/tests/storage.php

index 0576be66b4b9016ab1cf8bb942ffec175eeb97c1..ead7f3e09ca93a63cab6775ab31a656cc413b9a8 100644 (file)
@@ -180,6 +180,11 @@ class Trashbin {
                }
                \OC_FileProxy::$enabled = $proxyStatus;
 
+               if ($view->file_exists('/files/' . $file_path)) { // failed to delete the original file, abort
+                       $view->unlink($trashPath);
+                       return false;
+               }
+
                if ($sizeOfAddedFiles !== false) {
                        $size = $sizeOfAddedFiles;
                        $query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)");
index d9a18e5a15cce2ac412ac7086b8f777f518bf9d5..24a04e68b2a76ef286076f06e8a3823543ee973f 100644 (file)
@@ -71,7 +71,7 @@ class Storage extends \Test\TestCase {
        public function testSingleStorageDelete() {
                $this->assertTrue($this->userView->file_exists('test.txt'));
                $this->userView->unlink('test.txt');
-               list($storage, ) = $this->userView->resolvePath('test.txt');
+               list($storage,) = $this->userView->resolvePath('test.txt');
                $storage->getScanner()->scan(''); // make sure we check the storage
                $this->assertFalse($this->userView->getFileInfo('test.txt'));
 
@@ -123,7 +123,7 @@ class Storage extends \Test\TestCase {
                $this->userView->unlink('test.txt');
 
                // rescan trash storage
-               list($rootStorage, ) = $this->rootView->resolvePath($this->user . '/files_trashbin');
+               list($rootStorage,) = $this->rootView->resolvePath($this->user . '/files_trashbin');
                $rootStorage->getScanner()->scan('');
 
                // check if versions are in trashbin
@@ -158,7 +158,7 @@ class Storage extends \Test\TestCase {
                $this->userView->file_exists('substorage/test.txt');
 
                // rescan trash storage
-               list($rootStorage, ) = $this->rootView->resolvePath($this->user . '/files_trashbin');
+               list($rootStorage,) = $this->rootView->resolvePath($this->user . '/files_trashbin');
                $rootStorage->getScanner()->scan('');
 
                // versions were moved too
@@ -173,4 +173,37 @@ class Storage extends \Test\TestCase {
                $results = $this->rootView->getDirectoryContent($this->user . '/files_trashbin/versions/');
                $this->assertEquals(0, count($results));
        }
+
+       /**
+        * Delete should fail is the source file cant be deleted
+        */
+       public function testSingleStorageDeleteFail() {
+               /**
+                * @var \OC\Files\Storage\Temporary | \PHPUnit_Framework_MockObject_MockObject $storage
+                */
+               $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary')
+                       ->setConstructorArgs([[]])
+                       ->setMethods(['rename', 'unlink'])
+                       ->getMock();
+
+               $storage->expects($this->any())
+                       ->method('rename')
+                       ->will($this->returnValue(false));
+               $storage->expects($this->any())
+                       ->method('unlink')
+                       ->will($this->returnValue(false));
+
+               $cache = $storage->getCache();
+
+               Filesystem::mount($storage, [], '/' . $this->user . '/files');
+               $this->userView->file_put_contents('test.txt', 'foo');
+               $this->assertTrue($storage->file_exists('test.txt'));
+               $this->assertFalse($this->userView->unlink('test.txt'));
+               $this->assertTrue($storage->file_exists('test.txt'));
+               $this->assertTrue($cache->inCache('test.txt'));
+
+               // file should not be in the trashbin
+               $results = $this->rootView->getDirectoryContent($this->user . '/files_trashbin/files/');
+               $this->assertEquals(0, count($results));
+       }
 }