Redirect unlink to rmdir (#27101)

Many API callers will call unlink even for directories and it can mess
up with some wrappers like the encryption wrapper

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
This commit is contained in:
Vincent Petry 2017-02-08 15:56:34 +01:00 committed by Morris Jobke
parent 5683365a2c
commit 7256940524
No known key found for this signature in database
GPG Key ID: 9CE5ED29E7FCD38A
2 changed files with 29 additions and 1 deletions

View File

@ -692,7 +692,11 @@ class View {
if ($mount and $mount->getInternalPath($absolutePath) === '') {
return $this->removeMount($mount, $absolutePath);
}
$result = $this->basicOperation('unlink', $path, array('delete'));
if ($this->is_dir($path)) {
$result = $this->basicOperation('rmdir', $path, ['delete']);
} else {
$result = $this->basicOperation('unlink', $path, ['delete']);
}
if (!$result && !$this->file_exists($path)) { //clear ghost files from the cache on delete
$storage = $mount->getStorage();
$internalPath = $mount->getInternalPath($absolutePath);

View File

@ -515,6 +515,30 @@ class ViewTest extends \Test\TestCase {
$this->assertFalse($rootView->file_exists('substorage/bar.txt'));
}
public function rmdirOrUnlinkDataProvider() {
return [['rmdir'], ['unlink']];
}
/**
* @dataProvider rmdirOrUnlinkDataProvider
*/
public function testRmdir($method) {
$storage1 = $this->getTestStorage();
$storage2 = $this->getTestStorage();
Filesystem::mount($storage1, [], '/');
$rootView = new View('');
$rootView->mkdir('sub');
$rootView->mkdir('sub/deep');
$rootView->file_put_contents('/sub/deep/foo.txt', 'asd');
$this->assertTrue($rootView->file_exists('sub/deep/foo.txt'));
$this->assertTrue($rootView->$method('sub'));
$this->assertFalse($rootView->file_exists('sub'));
}
/**
* @medium
*/