[Pkg-owncloud-commits] [owncloud] 427/457: Rethrow LockedException with full path

David Prévot taffit at moszumanska.debian.org
Sun Jun 28 20:07:01 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch stable8
in repository owncloud.

commit 0e3a3dd5d7fd9d57a099f3720af20b6f9a22d63f
Author: Vincent Petry <pvince81 at owncloud.com>
Date:   Thu Jun 11 18:32:15 2015 +0200

    Rethrow LockedException with full path
    
    Because the path is converted to md5 from the original exception,
    rethrow the exception with the correct full path
---
 lib/private/files/view.php          | 65 +++++++++++++++++++++++++++++++------
 lib/public/lock/lockedexception.php | 11 +++++--
 tests/lib/files/view.php            | 39 ++++++++++++++++++++++
 3 files changed, 102 insertions(+), 13 deletions(-)

diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 99db05f..0d8439e 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -1659,6 +1659,8 @@ class View {
 	}
 
 	/**
+	 * Lock the given path
+	 *
 	 * @param string $path the path of the file to lock, relative to the view
 	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
 	 * @return bool False if the path is excluded from locking, true otherwise
@@ -1672,11 +1674,19 @@ class View {
 
 		$mount = $this->getMount($path);
 		if ($mount) {
-			$mount->getStorage()->acquireLock(
-				$mount->getInternalPath($absolutePath),
-				$type,
-				$this->lockingProvider
-			);
+			try {
+				$mount->getStorage()->acquireLock(
+					$mount->getInternalPath($absolutePath),
+					$type,
+					$this->lockingProvider
+				);
+			} catch (\OCP\Lock\LockedException $e) {
+				// rethrow with the a human-readable path
+				throw new \OCP\Lock\LockedException(
+					$this->getPathRelativeToFiles($absolutePath),
+					$e
+				);
+			}
 		}
 
 		return true;
@@ -1698,17 +1708,27 @@ class View {
 
 		$mount = $this->getMount($path);
 		if ($mount) {
-			$mount->getStorage()->changeLock(
-				$mount->getInternalPath($absolutePath),
-				$type,
-				$this->lockingProvider
-			);
+			try {
+				$mount->getStorage()->changeLock(
+					$mount->getInternalPath($absolutePath),
+					$type,
+					$this->lockingProvider
+				);
+			} catch (\OCP\Lock\LockedException $e) {
+				// rethrow with the a human-readable path
+				throw new \OCP\Lock\LockedException(
+					$this->getPathRelativeToFiles($absolutePath),
+					$e
+				);
+			}
 		}
 
 		return true;
 	}
 
 	/**
+	 * Unlock the given path
+	 *
 	 * @param string $path the path of the file to unlock, relative to the view
 	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
 	 * @return bool False if the path is excluded from locking, true otherwise
@@ -1798,4 +1818,29 @@ class View {
 
 		return true;
 	}
+
+	/**
+	 * Shortens the given absolute path to be relative to
+	 * "$user/files".
+	 *
+	 * @param string $absolutePath absolute path which is under "files"
+	 *
+	 * @return string path relative to "files" with trimmed slashes or null
+	 * if the path was NOT relative to files
+	 *
+	 * @throws \InvalidArgumentException if the given path was not under "files"
+	 * @since 8.1.0
+	 */
+	public function getPathRelativeToFiles($absolutePath) {
+		$path = Filesystem::normalizePath($absolutePath);
+		$parts = explode('/', trim($path, '/'), 3);
+		// "$user", "files", "path/to/dir"
+		if (!isset($parts[1]) || $parts[1] !== 'files') {
+			throw new \InvalidArgumentException('$absolutePath must be relative to "files"');
+		}
+		if (isset($parts[2])) {
+			return $parts[2];
+		}
+		return '';
+	}
 }
diff --git a/lib/public/lock/lockedexception.php b/lib/public/lock/lockedexception.php
index f8a0221..d6cec4c 100644
--- a/lib/public/lock/lockedexception.php
+++ b/lib/public/lock/lockedexception.php
@@ -28,7 +28,10 @@ namespace OCP\Lock;
  * @since 8.1.0
  */
 class LockedException extends \Exception {
+
 	/**
+	 * Locked path
+	 *
 	 * @var string
 	 */
 	private $path;
@@ -36,11 +39,13 @@ class LockedException extends \Exception {
 	/**
 	 * LockedException constructor.
 	 *
-	 * @param string $path
+	 * @param string $path locked path
+	 * @param \Exception $previous previous exception for cascading
+	 *
 	 * @since 8.1.0
 	 */
-	public function __construct($path) {
-		parent::__construct($path . ' is locked');
+	public function __construct($path, \Exception $previous = null) {
+		parent::__construct('"' . $path . '" is locked', 0, $previous);
 		$this->path = $path;
 	}
 
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index 1050c36..63d136b 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -1169,4 +1169,43 @@ class View extends \Test\TestCase {
 			['', '/testuser/{folder}'],
 		];
 	}
+
+	public function pathRelativeToFilesProvider() {
+		return [
+			['admin/files', ''],
+			['admin/files/x', 'x'],
+			['/admin/files', ''],
+			['/admin/files/sub', 'sub'],
+			['/admin/files/sub/', 'sub'],
+			['/admin/files/sub/sub2', 'sub/sub2'],
+			['//admin//files/sub//sub2', 'sub/sub2'],
+		];
+	}
+
+	/**
+	 * @dataProvider pathRelativeToFilesProvider
+	 */
+	public function testGetPathRelativeToFiles($path, $expectedPath) {
+		$view = new \OC\Files\View();
+		$this->assertEquals($expectedPath, $view->getPathRelativeToFiles($path));
+	}
+
+	public function pathRelativeToFilesProviderExceptionCases() {
+		return [
+			[''],
+			['x'],
+			['files'],
+			['/files'],
+			['/admin/files_versions/abc'],
+		];
+	}
+
+	/**
+	 * @dataProvider pathRelativeToFilesProviderExceptionCases
+	 * @expectedException \InvalidArgumentException
+	 */
+	public function testGetPathRelativeToFilesWithInvalidArgument($path) {
+		$view = new \OC\Files\View();
+		$view->getPathRelativeToFiles($path);
+	}
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list