]> source.dussan.org Git - nextcloud-server.git/commitdiff
Added error message for when target folder was removed
authorVincent Petry <pvince81@owncloud.com>
Wed, 22 Jan 2014 16:17:58 +0000 (17:17 +0100)
committerVincent Petry <pvince81@owncloud.com>
Wed, 29 Jan 2014 11:46:11 +0000 (12:46 +0100)
Whent trying to upload/rename/create files in a folder that was removed
or rename, the correct error message is now shown.

In the case of upload of multiple files, the upload is cancelled.

This situation can happen if the target folder was renamed or removed
from another browser window or client.

apps/files/ajax/newfile.php
apps/files/ajax/newfolder.php
apps/files/ajax/upload.php
apps/files/js/file-upload.js
apps/files/lib/app.php
apps/files/tests/ajax_rename.php

index ec5b716fb2a0bdfd72e28a60ecc24e42e4e1e1c4..1853098c5072cd06b9d158f41c178356b7d6a851 100644 (file)
@@ -64,6 +64,15 @@ if(strpos($filename, '/') !== false) {
        exit();
 }
 
+if (!\OC\Files\Filesystem::file_exists($dir . '/')) {
+       $result['data'] = array('message' => (string)$l10n->t(
+                       'The target folder has been moved or deleted.'),
+                       'code' => 'targetnotfound'
+               );
+       OCP\JSON::error($result);
+       exit();
+}
+
 //TODO why is stripslashes used on foldername in newfolder.php but not here?
 $target = $dir.'/'.$filename;
 
index 2cbc8cfeba5ee25bfce6d0fb92f6ea809356609f..4cfcae3090d58da8ad3201480d95278c30851a97 100644 (file)
@@ -29,6 +29,15 @@ if(strpos($foldername, '/') !== false) {
        exit();
 }
 
+if (!\OC\Files\Filesystem::file_exists($dir . '/')) {
+       $result['data'] = array('message' => (string)$l10n->t(
+                       'The target folder has been moved or deleted.'),
+                       'code' => 'targetnotfound'
+               );
+       OCP\JSON::error($result);
+       exit();
+}
+
 //TODO why is stripslashes used on foldername here but not in newfile.php?
 $target = $dir . '/' . stripslashes($foldername);
                
index bdaf6a77d1434fcadfb8b2fdff2726eb1116b40f..8f6c42d6620b49a7718c07085038b8e81cf4d69d 100644 (file)
@@ -8,6 +8,7 @@ OCP\JSON::setContentTypeHeader('text/plain');
 // If no token is sent along, rely on login only
 
 $allowedPermissions = OCP\PERMISSION_ALL;
+$errorCode = null;
 
 $l = OC_L10N::get('files');
 if (empty($_POST['dirToken'])) {
@@ -125,7 +126,8 @@ if (strpos($dir, '..') === false) {
 
                                        $meta = \OC\Files\Filesystem::getFileInfo($target);
                                        if ($meta === false) {
-                                               $error = $l->t('Upload failed. Could not get file info.');
+                                               $error = $l->t('The target folder has been moved or deleted.');
+                                               $errorCode = 'targetnotfound';
                                        } else {
                                                $result[] = array('status' => 'success',
                                                        'mime' => $meta['mimetype'],
@@ -177,5 +179,5 @@ if ($error === false) {
        OCP\JSON::encodedPrint($result);
        exit();
 } else {
-       OCP\JSON::error(array(array('data' => array_merge(array('message' => $error), $storageStats))));
+       OCP\JSON::error(array(array('data' => array_merge(array('message' => $error, 'code' => $errorCode), $storageStats))));
 }
index 225c3319107dd2e1a27fab4a9177202c4fee99c8..486273a910cf481f34bcc1eccfbca36b364a4d33 100644 (file)
@@ -315,6 +315,13 @@ $(document).ready(function() {
                                        } else {
                                                // HTTP connection problem
                                                OC.Notification.show(data.errorThrown);
+                                               if (data.result) {
+                                                       var result = JSON.parse(data.result);
+                                                       if (result && result[0] && result[0].data && result[0].data.code === 'targetnotfound') {
+                                                               // abort upload of next files if any
+                                                               OC.Upload.cancelUploads();
+                                                       }
+                                               }
                                        }
                                        //hide notification after 10 sec
                                        setTimeout(function() {
index 1ac266073db001f3209b4b36a45fe99b2d9bfece..fea88faa92a872cb17b8757b8d2e952004f246f7 100644 (file)
@@ -59,6 +59,13 @@ class App {
                        $result['data'] = array(
                                'message'       => $this->l10n->t("Invalid folder name. Usage of 'Shared' is reserved.")
                        );
+               // rename to non-existing folder is denied
+               } else if (!$this->view->file_exists($dir)) {
+                       $result['data'] = array('message' => (string)$this->l10n->t(
+                                       'The target folder has been moved or deleted.',
+                                       array($dir)),
+                                       'code' => 'targetnotfound'
+                               );
                // rename to existing file is denied
                } else if ($this->view->file_exists($dir . '/' . $newname)) {
                        
index 350ff5d36871072d86521501a0a337d0c19e4296..a1a5c8983ba3d304a163776020c02c364dad7d70 100644 (file)
@@ -38,7 +38,7 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
                $l10nMock->expects($this->any())
                        ->method('t')
                        ->will($this->returnArgument(0));
-               $viewMock = $this->getMock('\OC\Files\View', array('rename', 'normalizePath', 'getFileInfo'), array(), '', false);
+               $viewMock = $this->getMock('\OC\Files\View', array('rename', 'normalizePath', 'getFileInfo', 'file_exists'), array(), '', false);
                $viewMock->expects($this->any())
                        ->method('normalizePath')
                        ->will($this->returnArgument(0));
@@ -63,6 +63,11 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
                $oldname = 'Shared';
                $newname = 'new_name';
 
+               $this->viewMock->expects($this->at(0))
+                       ->method('file_exists')
+                       ->with('/')
+                       ->will($this->returnValue(true));
+
                $result = $this->files->rename($dir, $oldname, $newname);
                $expected = array(
                        'success'       => false,
@@ -80,6 +85,11 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
                $oldname = 'Shared';
                $newname = 'new_name';
 
+               $this->viewMock->expects($this->at(0))
+                       ->method('file_exists')
+                       ->with('/test')
+                       ->will($this->returnValue(true));
+
                $this->viewMock->expects($this->any())
                        ->method('getFileInfo')
                        ->will($this->returnValue(array(
@@ -129,6 +139,11 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
                $oldname = 'oldname';
                $newname = 'newname';
 
+               $this->viewMock->expects($this->at(0))
+                       ->method('file_exists')
+                       ->with('/')
+                       ->will($this->returnValue(true));
+
                $this->viewMock->expects($this->any())
                        ->method('getFileInfo')
                        ->will($this->returnValue(array(
@@ -141,7 +156,6 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
                                'name' => 'new_name',
                        )));
 
-
                $result = $this->files->rename($dir, $oldname, $newname);
 
                $this->assertTrue($result['success']);
@@ -154,4 +168,35 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
                $this->assertEquals(\OC_Helper::mimetypeIcon('dir'), $result['data']['icon']);
                $this->assertFalse($result['data']['isPreviewAvailable']);
        }
+
+       /**
+        * Test rename inside a folder that doesn't exist any more
+        */
+       function testRenameInNonExistingFolder() {
+               $dir = '/unexist';
+               $oldname = 'oldname';
+               $newname = 'newname';
+
+               $this->viewMock->expects($this->at(0))
+                       ->method('file_exists')
+                       ->with('/unexist')
+                       ->will($this->returnValue(false));
+
+               $this->viewMock->expects($this->any())
+                       ->method('getFileInfo')
+                       ->will($this->returnValue(array(
+                               'fileid' => 123,
+                               'type' => 'dir',
+                               'mimetype' => 'httpd/unix-directory',
+                               'size' => 18,
+                               'etag' => 'abcdef',
+                               'directory' => '/unexist',
+                               'name' => 'new_name',
+                       )));
+
+               $result = $this->files->rename($dir, $oldname, $newname);
+
+               $this->assertFalse($result['success']);
+               $this->assertEquals('targetnotfound', $result['data']['code']);
+       }
 }