diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index 9df64db7f0..bf44cf48aa 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -699,6 +699,6 @@ class Cache { */ public function normalize($path) { - return \OC_Util::normalizeUnicode($path); + return trim(\OC_Util::normalizeUnicode($path), '/'); } } diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php index 81d7f3ce0b..6df98ee531 100644 --- a/tests/lib/files/cache/cache.php +++ b/tests/lib/files/cache/cache.php @@ -517,6 +517,42 @@ class Cache extends \Test\TestCase { $this->assertEquals(1, count($this->cache->getFolderContents('folder'))); } + function bogusPathNamesProvider() { + return array( + array('/bogus.txt', 'bogus.txt'), + array('//bogus.txt', 'bogus.txt'), + array('bogus/', 'bogus'), + array('bogus//', 'bogus'), + ); + } + + /** + * Test bogus paths with leading or doubled slashes + * + * @dataProvider bogusPathNamesProvider + */ + public function testBogusPaths($bogusPath, $fixedBogusPath) { + $data = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory'); + + // put root folder + $this->assertFalse($this->cache->get('')); + $parentId = $this->cache->put('', $data); + $this->assertGreaterThan(0, $parentId); + + $this->assertGreaterThan(0, $this->cache->put($bogusPath, $data)); + + $newData = $this->cache->get($fixedBogusPath); + $this->assertNotFalse($newData); + + $this->assertEquals($fixedBogusPath, $newData['path']); + // parent is the correct one, resolved properly (they used to not be) + $this->assertEquals($parentId, $newData['parent']); + + $newDataFromBogus = $this->cache->get($bogusPath); + // same entry + $this->assertEquals($newData, $newDataFromBogus); + } + protected function tearDown() { if ($this->cache) { $this->cache->clear();