From f83821c388120eda258a968cc6be3e1a875ce34c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 23 Jun 2014 13:33:55 +0200 Subject: [PATCH 1/4] fix recursion on rmdirr --- lib/private/helper.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/private/helper.php b/lib/private/helper.php index 243baa4694..206c20d916 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -405,15 +405,19 @@ class OC_Helper { */ static function rmdirr($dir) { if (is_dir($dir)) { - $files = scandir($dir); - // FIXME: use flat array instead of recursion to avoid - // too many levels - foreach ($files as $file) { - if ($file !== '' && $file !== "." && $file !== "..") { - self::rmdirr("$dir/$file"); + $files = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ($files as $fileInfo) { + /** @var FilesystemIterator $fileInfo */ + if ($fileInfo->isDir()) { + rmdir($fileInfo->getRealPath()); + } else { + unlink($fileInfo->getRealPath()); } } - rmdir($dir); } elseif (file_exists($dir)) { unlink($dir); } From ed31f30afd481014612fa88be17e7450b20e562b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 23 Jun 2014 14:40:10 +0200 Subject: [PATCH 2/4] dir itself has to be removed as well --- lib/private/helper.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/private/helper.php b/lib/private/helper.php index 206c20d916..b3e2b1ade1 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -418,6 +418,7 @@ class OC_Helper { unlink($fileInfo->getRealPath()); } } + rmdir($dir); } elseif (file_exists($dir)) { unlink($dir); } From 0ab66d9b48b2d7d99afacd2c303fb09a6984cc56 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 23 Jun 2014 16:48:25 +0200 Subject: [PATCH 3/4] Added unit test for the helper's rmdirr --- tests/lib/helper.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/lib/helper.php b/tests/lib/helper.php index cfd66e9970..20b8571b91 100644 --- a/tests/lib/helper.php +++ b/tests/lib/helper.php @@ -454,4 +454,28 @@ class Test_Helper extends PHPUnit_Framework_TestCase { $this->assertEquals('http://localhost/owncloud/public.php?service=files', $result); } + /** + * Tests recursive folder deletion with rmdirr() + */ + public function testRecursiveFolderDeletion() { + $baseDir = \OC_Helper::tmpFolder() . '/'; + mkdir($baseDir . 'a/b/c/d/e', 0777, true); + mkdir($baseDir . 'a/b/c1/d/e', 0777, true); + mkdir($baseDir . 'a/b/c2/d/e', 0777, true); + mkdir($baseDir . 'a/b1/c1/d/e', 0777, true); + mkdir($baseDir . 'a/b2/c1/d/e', 0777, true); + mkdir($baseDir . 'a/b3/c1/d/e', 0777, true); + mkdir($baseDir . 'a1/b', 0777, true); + mkdir($baseDir . 'a1/c', 0777, true); + file_put_contents($baseDir . 'a/test.txt', 'Hello file!'); + file_put_contents($baseDir . 'a/b1/c1/test one.txt', 'Hello file one!'); + file_put_contents($baseDir . 'a1/b/test two.txt', 'Hello file two!'); + \OC_Helper::rmdirr($baseDir . 'a'); + + $this->assertFalse(file_exists($baseDir . 'a')); + $this->assertTrue(file_exists($baseDir . 'a1')); + + \OC_Helper::rmdirr($baseDir); + $this->assertFalse(file_exists($baseDir)); + } } From fba694edaeb7c30f4367c30d412cc4c775b95ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 23 Jun 2014 23:15:30 +0200 Subject: [PATCH 4/4] update PHPDoc $fileInfo is a SplFileInfo --- lib/private/helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/helper.php b/lib/private/helper.php index b3e2b1ade1..f90c38d236 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -411,7 +411,7 @@ class OC_Helper { ); foreach ($files as $fileInfo) { - /** @var FilesystemIterator $fileInfo */ + /** @var SplFileInfo $fileInfo */ if ($fileInfo->isDir()) { rmdir($fileInfo->getRealPath()); } else {