some basic path normalization

This commit is contained in:
Robin Appelman 2012-08-14 02:44:45 +02:00
parent c312171252
commit 0c8ce0bb32
3 changed files with 35 additions and 3 deletions

View File

@ -494,6 +494,28 @@ class OC_Filesystem{
}
OC_Connector_Sabre_Node::removeETagPropertyForPath($path);
}
public static function normalizePath($path){
//no windows style slashes
$path=str_replace('\\','/',$path);
//add leading slash
if($path[0]!=='/'){
$path='/'.$path;
}
//remove trainling slash
if(substr($path,-1,1)==='/'){
$path=substr($path,0,-1);
}
//remove duplicate slashes
while(strpos($path,'//')!==false){
$path=str_replace('//','/',$path);
}
//normalize unicode if possible
if(class_exists('Normalizer')){
$path=Normalizer::normalize($path);
}
return $path;
}
}
OC_Hook::connect('OC_Filesystem','post_write', 'OC_Filesystem','removeETagHook');
OC_Hook::connect('OC_Filesystem','post_delete','OC_Filesystem','removeETagHook');

View File

@ -54,10 +54,9 @@ class OC_FilesystemView {
if($path[0]!=='/'){
$path='/'.$path;
}
return $this->fakeRoot.$path;
return OC_Filesystem::normalizePath($this->fakeRoot.$path);
}
/**
* change the root to a fake toor
* @param string fakeRoot

View File

@ -59,6 +59,17 @@ class Test_Filesystem extends UnitTestCase{
$this->assertEqual('/',OC_Filesystem::getMountPoint('/some'));
$this->assertEqual('folder',OC_Filesystem::getInternalPath('/some/folder'));
}
public function testNormalize(){
$this->assertEqual('/path',OC_Filesystem::normalizePath('/path/'));
$this->assertEqual('/path',OC_Filesystem::normalizePath('path'));
$this->assertEqual('/path',OC_Filesystem::normalizePath('\path'));
$this->assertEqual('/foo/bar',OC_Filesystem::normalizePath('/foo//bar/'));
$this->assertEqual('/foo/bar',OC_Filesystem::normalizePath('/foo////bar'));
if(class_exists('Normalizer')){
$this->assertEqual("/foo/bar\xC3\xBC",OC_Filesystem::normalizePath("/foo/baru\xCC\x88"));
}
}
}
?>