Merge pull request #10622 from owncloud/recursive-delete-forbidden

Fix isDeletable
This commit is contained in:
Lukas Reschke 2014-09-17 15:36:41 +02:00
commit c88d517e88
7 changed files with 46 additions and 17 deletions

View File

@ -204,6 +204,9 @@ class Google extends \OC\Files\Storage\Common {
}
public function rmdir($path) {
if (!$this->isDeletable($path)) {
return false;
}
if (trim($path, '/') === '') {
$dir = $this->opendir($path);
if(is_resource($dir)) {

View File

@ -21,7 +21,7 @@ abstract class StreamWrapper extends Common {
}
public function rmdir($path) {
if ($this->file_exists($path)) {
if ($this->file_exists($path) && $this->isDeletable($path)) {
$dh = $this->opendir($path);
while (($file = readdir($dh)) !== false) {
if ($this->is_dir($path . '/' . $file)) {

View File

@ -187,7 +187,7 @@ class Swift extends \OC\Files\Storage\Common {
public function rmdir($path) {
$path = $this->normalizePath($path);
if (!$this->is_dir($path)) {
if (!$this->is_dir($path) || !$this->isDeletable($path)) {
return false;
}

View File

@ -66,8 +66,8 @@ class Mapper
*/
public function copy($path1, $path2)
{
$path1 = $this->stripLast($path1);
$path2 = $this->stripLast($path2);
$path1 = $this->resolveRelativePath($path1);
$path2 = $this->resolveRelativePath($path2);
$physicPath1 = $this->logicToPhysical($path1, true);
$physicPath2 = $this->logicToPhysical($path2, true);
@ -113,18 +113,11 @@ class Mapper
return '';
}
private function stripLast($path) {
if (substr($path, -1) == '/') {
$path = substr_replace($path, '', -1);
}
return $path;
}
/**
* @param string $logicPath
*/
private function resolveLogicPath($logicPath) {
$logicPath = $this->stripLast($logicPath);
$logicPath = $this->resolveRelativePath($logicPath);
$sql = 'SELECT * FROM `*PREFIX*file_map` WHERE `logic_path_hash` = ?';
$result = \OC_DB::executeAudited($sql, array(md5($logicPath)));
$result = $result->fetchRow();
@ -136,7 +129,7 @@ class Mapper
}
private function resolvePhysicalPath($physicalPath) {
$physicalPath = $this->stripLast($physicalPath);
$physicalPath = $this->resolveRelativePath($physicalPath);
$sql = \OC_DB::prepare('SELECT * FROM `*PREFIX*file_map` WHERE `physic_path_hash` = ?');
$result = \OC_DB::executeAudited($sql, array(md5($physicalPath)));
$result = $result->fetchRow();
@ -144,12 +137,35 @@ class Mapper
return $result['logic_path'];
}
private function resolveRelativePath($path) {
$explodedPath = explode('/', $path);
$pathArray = array();
foreach ($explodedPath as $pathElement) {
if (empty($pathElement) || ($pathElement == '.')) {
continue;
} elseif ($pathElement == '..') {
if (count($pathArray) == 0) {
return false;
}
array_pop($pathArray);
} else {
array_push($pathArray, $pathElement);
}
}
if (substr($path, 0, 1) == '/') {
$path = '/';
} else {
$path = '';
}
return $path.implode('/', $pathArray);
}
/**
* @param string $logicPath
* @param boolean $store
*/
private function create($logicPath, $store) {
$logicPath = $this->stripLast($logicPath);
$logicPath = $this->resolveRelativePath($logicPath);
$index = 0;
// create the slugified path
@ -205,8 +221,8 @@ class Mapper
}
}
$sluggedPath = $this->unchangedPhysicalRoot . implode('/', $sluggedElements);
return $this->stripLast($sluggedPath);
$sluggedPath = $this->unchangedPhysicalRoot.implode('/', $sluggedElements);
return $this->resolveRelativePath($sluggedPath);
}
/**

View File

@ -95,7 +95,11 @@ abstract class Common implements \OC\Files\Storage\Storage {
}
public function isDeletable($path) {
return $this->isUpdatable($path);
if ($path === '' || $path === '/') {
return false;
}
$parent = dirname($path);
return $this->isUpdatable($parent) && $this->isUpdatable($path);
}
public function isSharable($path) {

View File

@ -39,6 +39,9 @@ if (\OC_Util::runningOnWindows()) {
}
public function rmdir($path) {
if (!$this->isDeletable($path)) {
return false;
}
try {
$it = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($this->datadir . $path),

View File

@ -38,6 +38,9 @@ class MappedLocal extends \OC\Files\Storage\Common {
}
public function rmdir($path) {
if (!$this->isDeletable($path)) {
return false;
}
try {
$it = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($this->buildPath($path)),