Merge spliteUserRemote with fixRemoteUrlInShareWith
This commit is contained in:
parent
d38a378b8c
commit
2b7e5f841a
|
@ -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@localhost
|
||||
* - user@http://localhost
|
||||
* - user@http://localhost/
|
||||
* - user@http://localhost/index.php
|
||||
* - user@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);
|
||||
|
||||
protected static function fixRemoteURL($remote) {
|
||||
$remote = str_replace('\\', '/', $remote);
|
||||
if ($fileNamePosition = strpos($remote, '/index.php')) {
|
||||
$remote = substr($remote, 0, $fileNamePosition);
|
||||
}
|
||||
$remote = rtrim($remote, '/');
|
||||
|
||||
$shareWith = $user . '@' . $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);
|
||||
}
|
||||
|
|
|
@ -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('/');
|
||||
|
||||
|
|
|
@ -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@name', 'username'];
|
||||
$protocols = ['', 'http://', 'https://'];
|
||||
$remotes = [
|
||||
'localhost',
|
||||
'test:foobar@localhost',
|
||||
'local.host',
|
||||
'dev.local.host',
|
||||
'dev.local.host/path',
|
||||
'dev.local.host/at@inpath',
|
||||
'127.0.0.1',
|
||||
'::1',
|
||||
'::192.0.2.128',
|
||||
'::192.0.2.128/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@server', 'user', 'server'),
|
||||
array('user@name@server', 'user@name', 'server')
|
||||
// Invalid path
|
||||
array('user@'),
|
||||
|
||||
// Invalid user
|
||||
array('@server'),
|
||||
array('us/er@server'),
|
||||
array('us:er@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(''),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue