[Pkg-owncloud-commits] [owncloud] 67/205: Merge spliteUserRemote with fixRemoteUrlInShareWith

David Prévot taffit at moszumanska.debian.org
Thu Jul 2 17:36:56 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 2b7e5f841a016e8682d560643dce4797758a44c3
Author: Joas Schilling <nickvergessen at owncloud.com>
Date:   Thu Jun 18 11:46:37 2015 +0200

    Merge spliteUserRemote with fixRemoteUrlInShareWith
---
 lib/private/share/helper.php | 60 +++++++++++++++++++++------------
 lib/private/share/share.php  |  9 ++---
 tests/lib/share/helper.php   | 80 +++++++++++++++++---------------------------
 3 files changed, 75 insertions(+), 74 deletions(-)

diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php
index d88c4bc..5081a51 100644
--- a/lib/private/share/helper.php
+++ b/lib/private/share/helper.php
@@ -218,33 +218,25 @@ class Helper extends \OC\Share\Constants {
 	}
 
 	/**
-	 * Extracts the necessary remote name from a given link
+	 * Strips away a potential file names and trailing slashes:
+	 * - http://localhost
+	 * - http://localhost/
+	 * - http://localhost/index.php
+	 * - http://localhost/index.php/s/{shareToken}
 	 *
-	 * Strips away a potential file name, to allow
-	 * - user
-	 * - user at localhost
-	 * - user at http://localhost
-	 * - user at http://localhost/
-	 * - user at http://localhost/index.php
-	 * - user at http://localhost/index.php/s/{shareToken}
+	 * all return: http://localhost
 	 *
 	 * @param string $shareWith
 	 * @return string
 	 */
-	public static function fixRemoteURLInShareWith($shareWith) {
-		if (strpos($shareWith, '@')) {
-			list($user, $remote) = explode('@', $shareWith, 2);
-
-			$remote = str_replace('\\', '/', $remote);
-			if ($fileNamePosition = strpos($remote, '/index.php')) {
-				$remote = substr($remote, 0, $fileNamePosition);
-			}
-			$remote = rtrim($remote, '/');
-
-			$shareWith = $user . '@' . $remote;
+	protected static function fixRemoteURL($remote) {
+		$remote = str_replace('\\', '/', $remote);
+		if ($fileNamePosition = strpos($remote, '/index.php')) {
+			$remote = substr($remote, 0, $fileNamePosition);
 		}
+		$remote = rtrim($remote, '/');
 
-		return rtrim($shareWith, '/');
+		return $remote;
 	}
 
 	/**
@@ -255,10 +247,36 @@ class Helper extends \OC\Share\Constants {
 	 * @throws InvalidFederatedCloudIdException
 	 */
 	public static function splitUserRemote($id) {
-		$pos = strrpos($id, '@');
+		if (strpos($id, '@') === false) {
+			throw new InvalidFederatedCloudIdException('invalid Federated Cloud ID');
+		}
+
+		// Find the first character that is not allowed in user names
+		$id = str_replace('\\', '/', $id);
+		$posSlash = strpos($id, '/');
+		$posColon = strpos($id, ':');
+
+		if ($posSlash === false && $posColon === false) {
+			$invalidPos = strlen($id);
+		} else if ($posSlash === false) {
+			$invalidPos = $posColon;
+		} else if ($posColon === false) {
+			$invalidPos = $posSlash;
+		} else {
+			$invalidPos = min($posSlash, $posColon);
+		}
+
+		// Find the last @ before $invalidPos
+		$pos = $lastAtPos = 0;
+		while ($lastAtPos !== false && $lastAtPos <= $invalidPos) {
+			$pos = $lastAtPos;
+			$lastAtPos = strpos($id, '@', $pos + 1);
+		}
+
 		if ($pos !== false) {
 			$user = substr($id, 0, $pos);
 			$remote = substr($id, $pos + 1);
+			$remote = self::fixRemoteURL($remote);
 			if (!empty($user) && !empty($remote)) {
 				return array($user, $remote);
 			}
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 3c4b686..6fcb020 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -749,7 +749,8 @@ class Share extends Constants {
 			$token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(self::TOKEN_LENGTH, \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER .
 				\OCP\Security\ISecureRandom::CHAR_DIGITS);
 
-			$shareWith = Helper::fixRemoteURLInShareWith($shareWith);
+			list($user, $remote) = Helper::splitUserRemote($shareWith);
+			$shareWith = $user . '@' . $remote;
 			$shareId = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, $token, $itemSourceName);
 
 			$send = false;
@@ -1300,8 +1301,8 @@ class Share extends Constants {
 		$hookParams['deletedShares'] = $deletedShares;
 		\OC_Hook::emit('OCP\Share', 'post_unshare', $hookParams);
 		if ((int)$item['share_type'] === \OCP\Share::SHARE_TYPE_REMOTE && \OC::$server->getUserSession()->getUser()) {
-			$urlParts = explode('@', $item['share_with'], 2);
-			self::sendRemoteUnshare($urlParts[1], $item['id'], $item['token']);
+			list(, $remote) = Helper::splitUserRemote($item['share_with']);
+			self::sendRemoteUnshare($remote, $item['id'], $item['token']);
 		}
 	}
 
@@ -2430,7 +2431,7 @@ class Share extends Constants {
 		list($user, $remote) = Helper::splitUserRemote($shareWith);
 
 		if ($user && $remote) {
-			$url = rtrim($remote, '/') . self::BASE_PATH_TO_SHARE_API . '?format=' . self::RESPONSE_FORMAT;
+			$url = $remote . self::BASE_PATH_TO_SHARE_API . '?format=' . self::RESPONSE_FORMAT;
 
 			$local = \OC::$server->getURLGenerator()->getAbsoluteURL('/');
 
diff --git a/tests/lib/share/helper.php b/tests/lib/share/helper.php
index 0dfb858..c91d0bd 100644
--- a/tests/lib/share/helper.php
+++ b/tests/lib/share/helper.php
@@ -50,44 +50,31 @@ class Test_Share_Helper extends \Test\TestCase {
 		$this->assertSame($expected, $result);
 	}
 
-	public function fixRemoteURLInShareWithData() {
-		$userPrefix = ['test@', 'na/me@'];
+	public function dataTestSplitUserRemote() {
+		$userPrefix = ['user at name', 'username'];
 		$protocols = ['', 'http://', 'https://'];
 		$remotes = [
 			'localhost',
-			'test:foobar at localhost',
 			'local.host',
 			'dev.local.host',
 			'dev.local.host/path',
+			'dev.local.host/at at inpath',
 			'127.0.0.1',
 			'::1',
 			'::192.0.2.128',
+			'::192.0.2.128/at at inpath',
 		];
 
-		$testCases = [
-			['test', 'test'],
-			['na/me', 'na/me'],
-			['na/me/', 'na/me'],
-			['na/index.php', 'na/index.php'],
-			['http://localhost', 'http://localhost'],
-			['http://localhost/', 'http://localhost'],
-			['http://localhost/index.php', 'http://localhost/index.php'],
-			['http://localhost/index.php/s/token', 'http://localhost/index.php/s/token'],
-			['http://test:foobar@localhost', 'http://test:foobar@localhost'],
-			['http://test:foobar@localhost/', 'http://test:foobar@localhost'],
-			['http://test:foobar@localhost/index.php', 'http://test:foobar@localhost'],
-			['http://test:foobar@localhost/index.php/s/token', 'http://test:foobar@localhost'],
-		];
-
+		$testCases = [];
 		foreach ($userPrefix as $user) {
 			foreach ($remotes as $remote) {
 				foreach ($protocols as $protocol) {
-					$baseUrl = $user . $protocol . $remote;
+					$baseUrl = $user . '@' . $protocol . $remote;
 
-					$testCases[] = [$baseUrl, $baseUrl];
-					$testCases[] = [$baseUrl . '/', $baseUrl];
-					$testCases[] = [$baseUrl . '/index.php', $baseUrl];
-					$testCases[] = [$baseUrl . '/index.php/s/token', $baseUrl];
+					$testCases[] = [$baseUrl, $user, $protocol . $remote];
+					$testCases[] = [$baseUrl . '/', $user, $protocol . $remote];
+					$testCases[] = [$baseUrl . '/index.php', $user, $protocol . $remote];
+					$testCases[] = [$baseUrl . '/index.php/s/token', $user, $protocol . $remote];
 				}
 			}
 		}
@@ -95,29 +82,33 @@ class Test_Share_Helper extends \Test\TestCase {
 	}
 
 	/**
-	 * @dataProvider fixRemoteURLInShareWithData
-	 */
-	public function testFixRemoteURLInShareWith($remote, $expected) {
-		$this->assertSame($expected, \OC\Share\Helper::fixRemoteURLInShareWith($remote));
-	}
-
-	/**
-	 * @dataProvider dataTestSplitUserRemoteSuccess
+	 * @dataProvider dataTestSplitUserRemote
 	 *
-	 * @param string $id
+	 * @param string $remote
 	 * @param string $expectedUser
-	 * @param string $expectedRemote
+	 * @param string $expectedUrl
 	 */
-	public function testSplitUserRemoteSuccess($id, $expectedUser, $expectedRemote) {
-		list($user, $remote) = \OC\Share\Helper::splitUserRemote($id);
-		$this->assertSame($expectedUser, $user);
-		$this->assertSame($expectedRemote, $remote);
+	public function testSplitUserRemote($remote, $expectedUser, $expectedUrl) {
+		list($remoteUser, $remoteUrl) = \OC\Share\Helper::splitUserRemote($remote);
+		$this->assertSame($expectedUser, $remoteUser);
+		$this->assertSame($expectedUrl, $remoteUrl);
 	}
 
-	public function dataTestSplitUserRemoteSuccess() {
+	public function dataTestSplitUserRemoteError() {
 		return array(
-			array('user at server', 'user', 'server'),
-			array('user at name@server', 'user at name', 'server')
+			// Invalid path
+			array('user@'),
+
+			// Invalid user
+			array('@server'),
+			array('us/er at server'),
+			array('us:er at server'),
+
+			// Invalid splitting
+			array('user'),
+			array(''),
+			array('us/erserver'),
+			array('us:erserver'),
 		);
 	}
 
@@ -130,13 +121,4 @@ class Test_Share_Helper extends \Test\TestCase {
 	public function testSplitUserRemoteError($id) {
 		\OC\Share\Helper::splitUserRemote($id);
 	}
-
-	public function dataTestSplitUserRemoteError() {
-		return array(
-			array('user@'),
-			array('@server'),
-			array('user'),
-			array(''),
-		);
-	}
 }

-- 
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