diff options
author | Björn Schießle <bjoern@schiessle.org> | 2015-12-09 12:00:00 +0100 |
---|---|---|
committer | Björn Schießle <bjoern@schiessle.org> | 2015-12-15 11:43:17 +0100 |
commit | c8366f3de580495441b1495b56b2ccdb8f619508 (patch) | |
tree | b2f0225efd79052be246626b00985d9c7d2852c0 | |
parent | 79857c975c5eb62605700c5fd00e1cddea7b04f3 (diff) | |
download | nextcloud-server-c8366f3de580495441b1495b56b2ccdb8f619508.tar.gz nextcloud-server-c8366f3de580495441b1495b56b2ccdb8f619508.zip |
don't allow to create a federated share if source and target server are the same
-rw-r--r-- | apps/files_sharing/ajax/external.php | 8 | ||||
-rw-r--r-- | lib/private/share/helper.php | 23 | ||||
-rw-r--r-- | lib/private/share/share.php | 17 | ||||
-rw-r--r-- | tests/lib/share/helper.php | 37 |
4 files changed, 83 insertions, 2 deletions
diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php index 153285e11ff..7c41dc96813 100644 --- a/apps/files_sharing/ajax/external.php +++ b/apps/files_sharing/ajax/external.php @@ -30,6 +30,14 @@ if(!\OCP\Util::isValidFileName($name)) { exit(); } +$currentUser = \OC::$server->getUserSession()->getUser()->getUID(); +$currentServer = \OC::$server->getURLGenerator()->getAbsoluteURL('/'); +if (\OC\Share\Helper::isSameUserOnSameServer($owner, $remote, $currentUser, $currentServer )) { + \OCP\JSON::error(array('data' => array('message' => $l->t('Not allowed to create a federated share with the same user server')))); + exit(); +} + + $externalManager = new \OCA\Files_Sharing\External\Manager( \OC::$server->getDatabaseConnection(), \OC\Files\Filesystem::getMountManager(), diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php index 55b71ceeeac..362577955d2 100644 --- a/lib/private/share/helper.php +++ b/lib/private/share/helper.php @@ -251,4 +251,27 @@ class Helper extends \OC\Share\Constants { return rtrim($shareWith, '/'); } + + /** + * check if two federated cloud IDs refer to the same user + * + * @param string $user1 + * @param string $server1 + * @param string $user2 + * @param string $server2 + * @return bool true if both users and servers are the same + */ + public static function isSameUserOnSameServer($user1, $server1, $user2, $server2) { + $normalizedServer1 = strtolower(\OC\Share\Share::removeProtocolFromUrl($server1)); + $normalizedServer2 = strtolower(\OC\Share\Share::removeProtocolFromUrl($server2)); + + if ( + rtrim($normalizedServer1, '/') === rtrim($normalizedServer2, '/') && + strtolower($user1) === strtolower($user2) + ){ + return true; + } + + return false; + } } diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 8d2a1d022d7..4d4d798e84c 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -730,10 +730,23 @@ class Share extends \OC\Share\Constants { \OC_Log::write('OCP\Share', sprintf($message, $itemSourceName), \OC_Log::ERROR); throw new \Exception($message_t); } else if ($shareType === self::SHARE_TYPE_REMOTE) { + + $shareWith = Helper::fixRemoteURLInShareWith($shareWith); + + // don't allow federated shares if source and target server are the same + list($user, $remote) = Helper::splitUserRemote($shareWith); + $currentServer = self::removeProtocolFromUrl(\OC::$server->getURLGenerator()->getAbsoluteURL('/')); + $currentUser = \OC::$server->getUserSession()->getUser()->getUID(); + if (Helper::isSameUserOnSameServer($user, $remote, $currentUser, $currentServer)) { + $message = 'Not allowed to create a federated share with the same user.'; + $message_t = $l->t('Not allowed to create a federated share with the same user'); + \OCP\Util::writeLog('OCP\Share', $message, \OCP\Util::DEBUG); + throw new \Exception($message_t); + } + $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); $shareId = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, $token, $itemSourceName); $send = false; @@ -2352,7 +2365,7 @@ class Share extends \OC\Share\Constants { * @param string $url * @return string */ - private static function removeProtocolFromUrl($url) { + public static function removeProtocolFromUrl($url) { if (strpos($url, 'https://') === 0) { return substr($url, strlen('https://')); } else if (strpos($url, 'http://') === 0) { diff --git a/tests/lib/share/helper.php b/tests/lib/share/helper.php index 0385263fd91..49476e4bc43 100644 --- a/tests/lib/share/helper.php +++ b/tests/lib/share/helper.php @@ -19,6 +19,10 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. */ +/** + * @group DB + * Class Test_Share_Helper + */ class Test_Share_Helper extends \Test\TestCase { public function expireDateProvider() { @@ -100,4 +104,37 @@ class Test_Share_Helper extends \Test\TestCase { public function testFixRemoteURLInShareWith($remote, $expected) { $this->assertSame($expected, \OC\Share\Helper::fixRemoteURLInShareWith($remote)); } + + /** + * @dataProvider dataTestCompareServerAddresses + * + * @param string $server1 + * @param string $server2 + * @param bool $expected + */ + public function testIsSameUserOnSameServer($user1, $server1, $user2, $server2, $expected) { + $this->assertSame($expected, + \OC\Share\Helper::isSameUserOnSameServer($user1, $server1, $user2, $server2) + ); + } + + public function dataTestCompareServerAddresses() { + return [ + ['user1', 'http://server1', 'user1', 'http://server1', true], + ['user1', 'https://server1', 'user1', 'http://server1', true], + ['user1', 'http://serVer1', 'user1', 'http://server1', true], + ['user1', 'http://server1/', 'user1', 'http://server1', true], + ['user1', 'server1', 'user1', 'http://server1', true], + ['user1', 'http://server1', 'user1', 'http://server2', false], + ['user1', 'https://server1', 'user1', 'http://server2', false], + ['user1', 'http://serVer1', 'user1', 'http://serer2', false], + ['user1', 'http://server1/', 'user1', 'http://server2', false], + ['user1', 'server1', 'user1', 'http://server2', false], + ['user1', 'http://server1', 'user2', 'http://server1', false], + ['user1', 'https://server1', 'user2', 'http://server1', false], + ['user1', 'http://serVer1', 'user2', 'http://server1', false], + ['user1', 'http://server1/', 'user2', 'http://server1', false], + ['user1', 'server1', 'user2', 'http://server1', false], + ]; + } } |