Browse Source

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>
pull/3892/head
Vincent Petry 9 years ago
committed by Morris Jobke
parent
commit
7256940524
No known key found for this signature in database GPG Key ID: 9CE5ED29E7FCD38A
  1. 6
      lib/private/Files/View.php
  2. 24
      tests/lib/Files/ViewTest.php

6
lib/private/Files/View.php

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

24
tests/lib/Files/ViewTest.php

@ -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
*/

Loading…
Cancel
Save