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
No known key found for this signature in database
GPG Key ID: 9CE5ED29E7FCD38A
2 changed files with
29 additions and
1 deletions
lib/private/Files/View.php
tests/lib/Files/ViewTest.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 );
@ -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
*/