Merge pull request #10622 from owncloud/recursive-delete-forbidden
Fix isDeletable
This commit is contained in:
commit
c88d517e88
7 changed files with 46 additions and 17 deletions
|
@ -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)) {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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)),
|
||||
|
|
Loading…
Reference in a new issue