From b3cff4beb6f3628fd914650b97f6c13285615b93 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 8 Aug 2014 16:11:07 +0200 Subject: [PATCH 1/4] add error message if user wants to rename a file which no longer exists --- apps/files/js/filelist.js | 4 ++++ apps/files/lib/app.php | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 532ed46696..4fd57cf127 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -1322,6 +1322,10 @@ if (!result || result.status === 'error') { OC.dialogs.alert(result.data.message, t('core', 'Could not rename file')); fileInfo = oldFileInfo; + if (result.data.code === 'sourcenotfound') { + self.remove(result.data.newname, {updateSummary: true}); + return; + } } else { fileInfo = result.data; diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php index e32225d068..c21e44bff4 100644 --- a/apps/files/lib/app.php +++ b/apps/files/lib/app.php @@ -71,15 +71,25 @@ class App { 'data' => NULL ); + $normalizedOldPath = \OC\Files\Filesystem::normalizePath($dir . '/' . $oldname); + $normalizedNewPath = \OC\Files\Filesystem::normalizePath($dir . '/' . $newname); + // rename to non-existing folder is denied - if (!$this->view->file_exists($dir)) { + if (!$this->view->file_exists($normalizedOldPath)) { + $result['data'] = array( + 'message' => $this->l10n->t('%s could not be renamed as it has been deleted', array($oldname)), + 'code' => 'sourcenotfound', + 'oldname' => $oldname, + 'newname' => $newname, + ); + }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)) { + } else if ($this->view->file_exists($normalizedNewPath)) { $result['data'] = array( 'message' => $this->l10n->t( @@ -90,10 +100,10 @@ class App { // rename to "." is denied $newname !== '.' and // THEN try to rename - $this->view->rename($dir . '/' . $oldname, $dir . '/' . $newname) + $this->view->rename($normalizedOldPath, $normalizedNewPath) ) { // successful rename - $meta = $this->view->getFileInfo($dir . '/' . $newname); + $meta = $this->view->getFileInfo($normalizedNewPath); $fileinfo = \OCA\Files\Helper::formatFileInfo($meta); $result['success'] = true; $result['data'] = $fileinfo; From 5bbecdb9eeae1981cc64fe90f54829345507b92b Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 8 Aug 2014 16:13:47 +0200 Subject: [PATCH 2/4] no special action for folder named 'Shared' needed --- apps/files/ajax/delete.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php index a28b7b76c9..196bccea0f 100644 --- a/apps/files/ajax/delete.php +++ b/apps/files/ajax/delete.php @@ -26,7 +26,7 @@ $success = true; //Now delete foreach ($files as $file) { - if (($dir === '' && $file === 'Shared') || !\OC\Files\Filesystem::unlink($dir . '/' . $file)) { + if (!\OC\Files\Filesystem::unlink($dir . '/' . $file)) { $filesWithError .= $file . "\n"; $success = false; } From 5b75b1529299368f54e1c7fe34ada139acdf3cf9 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 8 Aug 2014 16:16:01 +0200 Subject: [PATCH 3/4] no error if we try to delete a file which no longer exists --- apps/files/ajax/delete.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php index 196bccea0f..aed53d5db5 100644 --- a/apps/files/ajax/delete.php +++ b/apps/files/ajax/delete.php @@ -26,7 +26,8 @@ $success = true; //Now delete foreach ($files as $file) { - if (!\OC\Files\Filesystem::unlink($dir . '/' . $file)) { + if (\OC\Files\Filesystem::file_exists($dir . '/' . $file) && + !\OC\Files\Filesystem::unlink($dir . '/' . $file)) { $filesWithError .= $file . "\n"; $success = false; } From bc8e1ebf75b641f4be1d404cbcdbf5f77bbff5dc Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Mon, 11 Aug 2014 12:02:33 +0200 Subject: [PATCH 4/4] new unit test added --- apps/files/tests/ajax_rename.php | 46 +++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php index fed366aa8e..5ed8b1931f 100644 --- a/apps/files/tests/ajax_rename.php +++ b/apps/files/tests/ajax_rename.php @@ -73,10 +73,14 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { $oldname = 'oldname'; $newname = 'newname'; - $this->viewMock->expects($this->at(0)) + $this->viewMock->expects($this->any()) ->method('file_exists') - ->with('/') - ->will($this->returnValue(true)); + ->with($this->anything()) + ->will($this->returnValueMap(array( + array('/', true), + array('/oldname', true) + ))); + $this->viewMock->expects($this->any()) ->method('getFileInfo') @@ -119,7 +123,7 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { $this->viewMock->expects($this->at(0)) ->method('file_exists') - ->with('/unexist') + ->with('/unexist/oldname') ->will($this->returnValue(false)); $this->viewMock->expects($this->any()) @@ -136,6 +140,40 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { $result = $this->files->rename($dir, $oldname, $newname); + $this->assertFalse($result['success']); + $this->assertEquals('sourcenotfound', $result['data']['code']); + } + + /** + * Test move to a folder that doesn't exist any more + */ + function testRenameToNonExistingFolder() { + $dir = '/'; + $oldname = 'oldname'; + $newname = '/unexist/newname'; + + $this->viewMock->expects($this->any()) + ->method('file_exists') + ->with($this->anything()) + ->will($this->returnValueMap(array( + array('/oldname', true), + array('/unexist', 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']); }