diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 1d4654e11fc4a8f9f7308695e9b74a6b2d54e8ea..39e2fe6bfce26283b93fbdee6fcb8a3ac66ffaf7 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -1683,6 +1683,7 @@ class View { */ private function lockPath($path, $type) { $absolutePath = $this->getAbsolutePath($path); + $absolutePath = Filesystem::normalizePath($absolutePath); if (!$this->shouldLockFile($absolutePath)) { return false; } @@ -1717,6 +1718,7 @@ class View { */ public function changeLock($path, $type) { $absolutePath = $this->getAbsolutePath($path); + $absolutePath = Filesystem::normalizePath($absolutePath); if (!$this->shouldLockFile($absolutePath)) { return false; } @@ -1750,6 +1752,7 @@ class View { */ private function unlockPath($path, $type) { $absolutePath = $this->getAbsolutePath($path); + $absolutePath = Filesystem::normalizePath($absolutePath); if (!$this->shouldLockFile($absolutePath)) { return false; } @@ -1774,9 +1777,8 @@ class View { * @return bool False if the path is excluded from locking, true otherwise */ public function lockFile($path, $type) { - $path = '/' . trim($path, '/'); - $absolutePath = $this->getAbsolutePath($path); + $absolutePath = Filesystem::normalizePath($absolutePath); if (!$this->shouldLockFile($absolutePath)) { return false; } @@ -1799,9 +1801,8 @@ class View { * @return bool False if the path is excluded from locking, true otherwise */ public function unlockFile($path, $type) { - $path = rtrim($path, '/'); - $absolutePath = $this->getAbsolutePath($path); + $absolutePath = Filesystem::normalizePath($absolutePath); if (!$this->shouldLockFile($absolutePath)) { return false; } diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index 63d136bc7a9de21689d3c58c73392f53ac7cc494..dcdebfd9bceb2e8580875735fa7a48483e2d4b26 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -1208,4 +1208,26 @@ class View extends \Test\TestCase { $view = new \OC\Files\View(); $view->getPathRelativeToFiles($path); } + + public function testChangeLock() { + $view = new \OC\Files\View('/testuser/files/'); + $storage = new Temporary(array()); + \OC\Files\Filesystem::mount($storage, [], '/'); + + $view->lockFile('/test/sub', ILockingProvider::LOCK_SHARED); + $this->assertTrue($this->isFileLocked($view, '/test//sub', ILockingProvider::LOCK_SHARED)); + $this->assertFalse($this->isFileLocked($view, '/test//sub', ILockingProvider::LOCK_EXCLUSIVE)); + + $view->changeLock('//test/sub', ILockingProvider::LOCK_EXCLUSIVE); + $this->assertTrue($this->isFileLocked($view, '/test//sub', ILockingProvider::LOCK_EXCLUSIVE)); + + $view->changeLock('test/sub', ILockingProvider::LOCK_SHARED); + $this->assertTrue($this->isFileLocked($view, '/test//sub', ILockingProvider::LOCK_SHARED)); + + $view->unlockFile('/test/sub/', ILockingProvider::LOCK_SHARED); + + $this->assertFalse($this->isFileLocked($view, '/test//sub', ILockingProvider::LOCK_SHARED)); + $this->assertFalse($this->isFileLocked($view, '/test//sub', ILockingProvider::LOCK_EXCLUSIVE)); + + } }