diff --git a/lib/private/share/exceptions/invalidfederatedcloudidexception.php b/lib/private/share/exceptions/invalidfederatedcloudidexception.php new file mode 100644 index 0000000000..1f3e63c880 --- /dev/null +++ b/lib/private/share/exceptions/invalidfederatedcloudidexception.php @@ -0,0 +1,30 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + + +namespace OC\Share\Exceptions; + + +use OC\HintException; + +class InvalidFederatedCloudIdException extends HintException { + +} diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php index 65167dd754..d88c4bcbfc 100644 --- a/lib/private/share/helper.php +++ b/lib/private/share/helper.php @@ -27,6 +27,8 @@ namespace OC\Share; +use OC\Share\Exceptions\InvalidFederatedCloudIdException; + class Helper extends \OC\Share\Constants { /** @@ -244,4 +246,24 @@ class Helper extends \OC\Share\Constants { return rtrim($shareWith, '/'); } + + /** + * split user and remote from federated cloud id + * + * @param string $id + * @return array + * @throws InvalidFederatedCloudIdException + */ + public static function splitUserRemote($id) { + $pos = strrpos($id, '@'); + if ($pos !== false) { + $user = substr($id, 0, $pos); + $remote = substr($id, $pos + 1); + if (!empty($user) && !empty($remote)) { + return array($user, $remote); + } + } + + throw new InvalidFederatedCloudIdException('invalid Federated Cloud ID'); + } } diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 027c518f9f..3c4b6863af 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -2427,7 +2427,7 @@ class Share extends Constants { */ private static function sendRemoteShare($token, $shareWith, $name, $remote_id, $owner) { - list($user, $remote) = explode('@', $shareWith, 2); + list($user, $remote) = Helper::splitUserRemote($shareWith); if ($user && $remote) { $url = rtrim($remote, '/') . self::BASE_PATH_TO_SHARE_API . '?format=' . self::RESPONSE_FORMAT; diff --git a/tests/lib/share/helper.php b/tests/lib/share/helper.php index 0385263fd9..0dfb85856c 100644 --- a/tests/lib/share/helper.php +++ b/tests/lib/share/helper.php @@ -100,4 +100,43 @@ class Test_Share_Helper extends \Test\TestCase { public function testFixRemoteURLInShareWith($remote, $expected) { $this->assertSame($expected, \OC\Share\Helper::fixRemoteURLInShareWith($remote)); } + + /** + * @dataProvider dataTestSplitUserRemoteSuccess + * + * @param string $id + * @param string $expectedUser + * @param string $expectedRemote + */ + public function testSplitUserRemoteSuccess($id, $expectedUser, $expectedRemote) { + list($user, $remote) = \OC\Share\Helper::splitUserRemote($id); + $this->assertSame($expectedUser, $user); + $this->assertSame($expectedRemote, $remote); + } + + public function dataTestSplitUserRemoteSuccess() { + return array( + array('user@server', 'user', 'server'), + array('user@name@server', 'user@name', 'server') + ); + } + + /** + * @dataProvider dataTestSplitUserRemoteError + * + * @param string $id + * @expectedException \OC\Share\Exceptions\InvalidFederatedCloudIdException + */ + public function testSplitUserRemoteError($id) { + \OC\Share\Helper::splitUserRemote($id); + } + + public function dataTestSplitUserRemoteError() { + return array( + array('user@'), + array('@server'), + array('user'), + array(''), + ); + } }