Procházet zdrojové kódy

Added error message for when target folder was removed

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.
tags/v7.0.0alpha2
Vincent Petry před 10 roky
rodič
revize
58c7042e70

+ 9
- 0
apps/files/ajax/newfile.php Zobrazit soubor

@@ -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;


+ 9
- 0
apps/files/ajax/newfolder.php Zobrazit soubor

@@ -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);

+ 4
- 2
apps/files/ajax/upload.php Zobrazit soubor

@@ -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))));
}

+ 7
- 0
apps/files/js/file-upload.js Zobrazit soubor

@@ -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() {

+ 7
- 0
apps/files/lib/app.php Zobrazit soubor

@@ -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)) {

+ 47
- 2
apps/files/tests/ajax_rename.php Zobrazit soubor

@@ -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']);
}
}

Načítá se…
Zrušit
Uložit