diff --git a/src/_h5ai/conf/options.json b/src/_h5ai/conf/options.json index a31a5987..b95a3504 100644 --- a/src/_h5ai/conf/options.json +++ b/src/_h5ai/conf/options.json @@ -89,7 +89,7 @@ Options }, /* [EXPERIMENTAL] - Allow file deletion. + Allow file and folder deletion. Be careful with this option! */ "delete": { "enabled": false diff --git a/src/_h5ai/server/php/inc/class-api.php b/src/_h5ai/server/php/inc/class-api.php index 8b0d47be..2f202de3 100644 --- a/src/_h5ai/server/php/inc/class-api.php +++ b/src/_h5ai/server/php/inc/class-api.php @@ -169,9 +169,9 @@ class Api { if ($code == MAGIC_SEQUENCE && !$this->app->is_ignored($n)) { - $abs_path = $this->app->to_path($href); + $path = $this->app->to_path($href); - if (!unlink($abs_path)) { + if (!delete_path($path, true)) { $errors[] = $href; } } @@ -196,10 +196,10 @@ class Api { if ($code == MAGIC_SEQUENCE && !$this->app->is_ignored($n)) { - $abs_path = $this->app->to_path($href); - $folder = normalize_path(dirname($abs_path)); + $path = $this->app->to_path($href); + $folder = normalize_path(dirname($path)); - if (!rename($abs_path, $folder . "/" . $name)) { + if (!rename($path, $folder . "/" . $name)) { json_fail(2, "renaming failed"); } } diff --git a/src/_h5ai/server/php/inc/util.php b/src/_h5ai/server/php/inc/util.php index a6476715..f3e040d4 100644 --- a/src/_h5ai/server/php/inc/util.php +++ b/src/_h5ai/server/php/inc/util.php @@ -86,6 +86,27 @@ function exec_cmdv($cmdv) { } +function delete_path($path, $recursive = false) { + + if (is_file($path)) { + return @unlink($path); + } + + if (is_dir($path)) { + if ($recursive === true && $dir = opendir($path)) { + while (($name = readdir($dir)) !== false) { + delete_path($path . "/" . $name); + } + closedir($dir); + } + + return @rmdir($path); + } + + return false; +} + + // debug tools function err_log($message, $obj = null) {