diff --git a/phpBB/phpbb/storage/adapter/local.php b/phpBB/phpbb/storage/adapter/local.php index 8e491b0240..c7fbe544e9 100644 --- a/phpBB/phpbb/storage/adapter/local.php +++ b/phpBB/phpbb/storage/adapter/local.php @@ -256,17 +256,20 @@ class local implements adapter_interface, stream_interface */ protected function remove_empty_dirs($path) { - $dirpath = dirname($this->root_path . $path); - $filepath = dirname($this->root_path . $this->get_path($path) . $this->get_filename($path)); - $path = filesystem_helper::make_path_relative($filepath, $dirpath); - - do + if ($this->subfolders) { - $parts = explode('/', $path); - $parts = array_slice($parts, 0, -1); - $path = implode('/', $parts); + $dirpath = dirname($this->root_path . $path); + $filepath = dirname($this->root_path . $this->get_path($path) . $this->get_filename($path)); + $path = filesystem_helper::make_path_relative($filepath, $dirpath); + + do + { + $parts = explode('/', $path); + $parts = array_slice($parts, 0, -1); + $path = implode('/', $parts); + } + while ($path && @rmdir($dirpath . '/' . $path)); } - while ($path && @rmdir($dirpath . '/' . $path)); } /** @@ -277,6 +280,9 @@ class local implements adapter_interface, stream_interface */ protected function get_path($path) { + $dirname = dirname($path); + $dirname = ($dirname != '.') ? $dirname . DIRECTORY_SEPARATOR : ''; + if ($this->subfolders) { $hash = md5(basename($path)); @@ -284,17 +290,13 @@ class local implements adapter_interface, stream_interface $parts = str_split($hash, 2); $parts = array_slice($parts, 0, $this->dir_depth); - // Create path - $dirname = dirname($path); - $path = $dirname . DIRECTORY_SEPARATOR; - if (!empty($parts)) { - $path .= implode(DIRECTORY_SEPARATOR, $parts) . DIRECTORY_SEPARATOR; + $dirname .= implode(DIRECTORY_SEPARATOR, $parts) . DIRECTORY_SEPARATOR; } } - return $path; + return $dirname; } /** diff --git a/tests/storage/adapter/local_subfolders_test.php b/tests/storage/adapter/local_subfolders_test.php new file mode 100644 index 0000000000..250e1973c7 --- /dev/null +++ b/tests/storage/adapter/local_subfolders_test.php @@ -0,0 +1,136 @@ + + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + + class phpbb_storage_adapter_local_subfolders_test extends phpbb_test_case + { + protected $adapter; + + protected $path; + + protected $filesystem; + + public function setUp() + { + parent::setUp(); + + $this->filesystem = new \phpbb\filesystem\filesystem(); + $phpbb_root_path = getcwd() . DIRECTORY_SEPARATOR; + + $this->adapter = new \phpbb\storage\adapter\local($this->filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); + $this->adapter->configure(['path' => 'test_path', 'subfolders' => true]); + + $this->path = $phpbb_root_path . 'test_path/'; + mkdir($this->path); + } + + public function tearDown() + { + $this->adapter = null; + rmdir($this->path); + } + + public function test_put_contents() + { + $this->adapter->put_contents('file.txt', 'abc'); + $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); + $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_get_contents() + { + mkdir($this->path . '3d/8e', 0777, true); + file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + $this->assertEquals($this->adapter->get_contents('file.txt'), 'abc'); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_exists() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $this->assertTrue($this->adapter->exists('file.txt')); + $this->assertFalse($this->adapter->exists('3d/8e/file.txt')); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_delete_file() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); + $this->adapter->delete('file.txt'); + $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); + $this->assertFalse(file_exists($this->path . '3d')); + } + + public function test_rename() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $this->adapter->rename('file.txt', 'file2.txt'); + $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); + $this->assertTrue(file_exists($this->path . '27/36/file2.txt')); + $this->assertFalse(file_exists($this->path . '3d')); + unlink($this->path . '27/36/file2.txt'); + rmdir($this->path . '27/36'); + rmdir($this->path . '27'); + } + + public function test_copy() + { + mkdir($this->path . '3d/8e', 0777, true); + file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + $this->adapter->copy('file.txt', 'file2.txt'); + $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); + $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + unlink($this->path . '27/36/file2.txt'); + rmdir($this->path . '27/36'); + rmdir($this->path . '27'); + } + + public function test_read_stream() + { + mkdir($this->path . '3d/8e', 0777, true); + touch($this->path . '3d/8e/file.txt'); + $stream = $this->adapter->read_stream('file.txt'); + $this->assertTrue(is_resource($stream)); + fclose($stream); + unlink($this->path . '3d/8e/file.txt'); + rmdir($this->path . '3d/8e'); + rmdir($this->path . '3d'); + } + + public function test_write_stream() + { + file_put_contents($this->path . 'file.txt', 'abc'); + $stream = fopen($this->path . 'file.txt', 'rb'); + $this->adapter->write_stream('file2.txt', $stream); + fclose($stream); + $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); + unlink($this->path . 'file.txt'); + unlink($this->path . '27/36/file2.txt'); + rmdir($this->path . '27/36'); + rmdir($this->path . '27'); + } + + } diff --git a/tests/storage/adapter/local_test.php b/tests/storage/adapter/local_test.php index d24759b8d3..eb4b5e0dcf 100644 --- a/tests/storage/adapter/local_test.php +++ b/tests/storage/adapter/local_test.php @@ -27,7 +27,7 @@ $phpbb_root_path = getcwd() . DIRECTORY_SEPARATOR; $this->adapter = new \phpbb\storage\adapter\local($this->filesystem, new \FastImageSize\FastImageSize(), new \phpbb\mimetype\guesser(array(new \phpbb\mimetype\extension_guesser)), $phpbb_root_path); - $this->adapter->configure(['path' => 'test_path', 'subfolders' => true]); + $this->adapter->configure(['path' => 'test_path', 'subfolders' => false]); $this->path = $phpbb_root_path . 'test_path/'; mkdir($this->path); @@ -42,82 +42,61 @@ public function test_put_contents() { $this->adapter->put_contents('file.txt', 'abc'); - $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); - $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + $this->assertTrue(file_exists($this->path . 'file.txt')); + $this->assertEquals(file_get_contents($this->path . 'file.txt'), 'abc'); + unlink($this->path . 'file.txt'); } public function test_get_contents() { - mkdir($this->path . '3d/8e', 0777, true); - file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + file_put_contents($this->path . 'file.txt', 'abc'); $this->assertEquals($this->adapter->get_contents('file.txt'), 'abc'); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + unlink($this->path . 'file.txt'); } public function test_exists() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); + touch($this->path . 'file.txt'); $this->assertTrue($this->adapter->exists('file.txt')); - $this->assertFalse($this->adapter->exists('3d/8e/file.txt')); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + $this->assertFalse($this->adapter->exists('noexist.txt')); + unlink($this->path . 'file.txt'); } public function test_delete_file() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); - $this->assertTrue(file_exists($this->path . '3d/8e/file.txt')); + touch($this->path . 'file.txt'); + $this->assertTrue(file_exists($this->path . 'file.txt')); $this->adapter->delete('file.txt'); - $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); - $this->assertFalse(file_exists($this->path . '3d')); + $this->assertFalse(file_exists($this->path . 'file.txt')); } public function test_rename() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); + touch($this->path . 'file.txt'); $this->adapter->rename('file.txt', 'file2.txt'); - $this->assertFalse(file_exists($this->path . '3d/8e/file.txt')); - $this->assertTrue(file_exists($this->path . '27/36/file2.txt')); - $this->assertFalse(file_exists($this->path . '3d')); - unlink($this->path . '27/36/file2.txt'); - rmdir($this->path . '27/36'); - rmdir($this->path . '27'); + $this->assertFalse(file_exists($this->path . 'file.txt')); + $this->assertTrue(file_exists($this->path . 'file2.txt')); + $this->assertFalse(file_exists($this->path . 'file.txt')); + unlink($this->path . 'file2.txt'); } public function test_copy() { - mkdir($this->path . '3d/8e', 0777, true); - file_put_contents($this->path . '3d/8e/file.txt', 'abc'); + file_put_contents($this->path . 'file.txt', 'abc'); $this->adapter->copy('file.txt', 'file2.txt'); - $this->assertEquals(file_get_contents($this->path . '3d/8e/file.txt'), 'abc'); - $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); - unlink($this->path . '27/36/file2.txt'); - rmdir($this->path . '27/36'); - rmdir($this->path . '27'); + $this->assertEquals(file_get_contents($this->path . 'file.txt'), 'abc'); + $this->assertEquals(file_get_contents($this->path . 'file2.txt'), 'abc'); + unlink($this->path . 'file.txt'); + unlink($this->path . 'file2.txt'); } public function test_read_stream() { - mkdir($this->path . '3d/8e', 0777, true); - touch($this->path . '3d/8e/file.txt'); + touch($this->path . 'file.txt'); $stream = $this->adapter->read_stream('file.txt'); $this->assertTrue(is_resource($stream)); fclose($stream); - unlink($this->path . '3d/8e/file.txt'); - rmdir($this->path . '3d/8e'); - rmdir($this->path . '3d'); + unlink($this->path . 'file.txt'); } public function test_write_stream() @@ -126,11 +105,9 @@ $stream = fopen($this->path . 'file.txt', 'rb'); $this->adapter->write_stream('file2.txt', $stream); fclose($stream); - $this->assertEquals(file_get_contents($this->path . '27/36/file2.txt'), 'abc'); + $this->assertEquals(file_get_contents($this->path . 'file2.txt'), 'abc'); unlink($this->path . 'file.txt'); - unlink($this->path . '27/36/file2.txt'); - rmdir($this->path . '27/36'); - rmdir($this->path . '27'); + unlink($this->path . 'file2.txt'); } }