Merge pull request #1975 from nextcloud/federated-sharing-always-https-by-default
use https by default if no protocol is given.
This commit is contained in:
commit
acf01b7f06
|
@ -160,6 +160,22 @@ class AddressHandler {
|
|||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if the url contain the protocol (http or https)
|
||||
*
|
||||
* @param string $url
|
||||
* @return bool
|
||||
*/
|
||||
public function urlContainProtocol($url) {
|
||||
if (strpos($url, 'https://') === 0 ||
|
||||
strpos($url, 'http://') === 0) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips away a potential file names and trailing slashes:
|
||||
* - http://localhost
|
||||
|
|
|
@ -84,7 +84,6 @@ class Notifications {
|
|||
list($user, $remote) = $this->addressHandler->splitUserRemote($shareWith);
|
||||
|
||||
if ($user && $remote) {
|
||||
$url = $remote;
|
||||
$local = $this->addressHandler->generateRemoteURL();
|
||||
|
||||
$fields = array(
|
||||
|
@ -99,8 +98,7 @@ class Notifications {
|
|||
'remote' => $local,
|
||||
);
|
||||
|
||||
$url = $this->addressHandler->removeProtocolFromUrl($url);
|
||||
$result = $this->tryHttpPostToShareEndpoint($url, '', $fields);
|
||||
$result = $this->tryHttpPostToShareEndpoint($remote, '', $fields);
|
||||
$status = json_decode($result['result'], true);
|
||||
|
||||
if ($result['success'] && ($status['ocs']['meta']['statuscode'] === 100 || $status['ocs']['meta']['statuscode'] === 200)) {
|
||||
|
@ -135,8 +133,7 @@ class Notifications {
|
|||
'remoteId' => $shareId
|
||||
);
|
||||
|
||||
$url = $this->addressHandler->removeProtocolFromUrl($remote);
|
||||
$result = $this->tryHttpPostToShareEndpoint(rtrim($url, '/'), '/' . $id . '/reshare', $fields);
|
||||
$result = $this->tryHttpPostToShareEndpoint(rtrim($remote, '/'), '/' . $id . '/reshare', $fields);
|
||||
$status = json_decode($result['result'], true);
|
||||
|
||||
$httpRequestSuccessful = $result['success'];
|
||||
|
@ -231,8 +228,7 @@ class Notifications {
|
|||
$fields[$key] = $value;
|
||||
}
|
||||
|
||||
$url = $this->addressHandler->removeProtocolFromUrl($remote);
|
||||
$result = $this->tryHttpPostToShareEndpoint(rtrim($url, '/'), '/' . $remoteId . '/' . $action, $fields);
|
||||
$result = $this->tryHttpPostToShareEndpoint(rtrim($remote, '/'), '/' . $remoteId . '/' . $action, $fields);
|
||||
$status = json_decode($result['result'], true);
|
||||
|
||||
if ($result['success'] &&
|
||||
|
@ -270,7 +266,8 @@ class Notifications {
|
|||
}
|
||||
|
||||
/**
|
||||
* try http post first with https and then with http as a fallback
|
||||
* try http post with the given protocol, if no protocol is given we pick
|
||||
* the secure one (https)
|
||||
*
|
||||
* @param string $remoteDomain
|
||||
* @param string $urlSuffix
|
||||
|
@ -280,24 +277,25 @@ class Notifications {
|
|||
*/
|
||||
protected function tryHttpPostToShareEndpoint($remoteDomain, $urlSuffix, array $fields) {
|
||||
$client = $this->httpClientService->newClient();
|
||||
$protocol = 'https://';
|
||||
|
||||
if ($this->addressHandler->urlContainProtocol($remoteDomain) === false) {
|
||||
$remoteDomain = 'https://' . $remoteDomain;
|
||||
}
|
||||
|
||||
$result = [
|
||||
'success' => false,
|
||||
'result' => '',
|
||||
];
|
||||
$try = 0;
|
||||
|
||||
while ($result['success'] === false && $try < 2) {
|
||||
$endpoint = $this->discoveryManager->getShareEndpoint($protocol . $remoteDomain);
|
||||
$endpoint = $this->discoveryManager->getShareEndpoint($remoteDomain);
|
||||
try {
|
||||
$response = $client->post($protocol . $remoteDomain . $endpoint . $urlSuffix . '?format=' . self::RESPONSE_FORMAT, [
|
||||
$response = $client->post($remoteDomain . $endpoint . $urlSuffix . '?format=' . self::RESPONSE_FORMAT, [
|
||||
'body' => $fields,
|
||||
'timeout' => 10,
|
||||
'connect_timeout' => 10,
|
||||
]);
|
||||
$result['result'] = $response->getBody();
|
||||
$result['success'] = true;
|
||||
break;
|
||||
} catch (\Exception $e) {
|
||||
// if flat re-sharing is not supported by the remote server
|
||||
// we re-throw the exception and fall back to the old behaviour.
|
||||
|
@ -305,9 +303,6 @@ class Notifications {
|
|||
if ($e->getCode() === Http::STATUS_INTERNAL_SERVER_ERROR) {
|
||||
throw $e;
|
||||
}
|
||||
$try++;
|
||||
$protocol = 'http://';
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
|
|
@ -177,6 +177,26 @@ class AddressHandlerTest extends \Test\TestCase {
|
|||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataTestUrlContainProtocol
|
||||
*
|
||||
* @param string $url
|
||||
* @param bool $expectedResult
|
||||
*/
|
||||
public function testUrlContainProtocol($url, $expectedResult) {
|
||||
$result = $this->addressHandler->urlContainProtocol($url);
|
||||
$this->assertSame($expectedResult, $result);
|
||||
}
|
||||
|
||||
public function dataTestUrlContainProtocol() {
|
||||
return [
|
||||
['http://nextcloud.com', true],
|
||||
['https://nextcloud.com', true],
|
||||
['nextcloud.com', false],
|
||||
['httpserver.com', false],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataTestFixRemoteUrl
|
||||
*
|
||||
|
|
|
@ -94,7 +94,7 @@ class NotificationsTest extends \Test\TestCase {
|
|||
* @param bool $expected
|
||||
*/
|
||||
public function testSendUpdateToRemote($try, $httpRequestResult, $expected) {
|
||||
$remote = 'remote';
|
||||
$remote = 'http://remote';
|
||||
$id = 42;
|
||||
$timestamp = 63576;
|
||||
$token = 'token';
|
||||
|
@ -106,9 +106,6 @@ class NotificationsTest extends \Test\TestCase {
|
|||
->with($remote, '/'.$id.'/unshare', ['token' => $token, 'data1Key' => 'data1Value'])
|
||||
->willReturn($httpRequestResult);
|
||||
|
||||
$this->addressHandler->expects($this->once())->method('removeProtocolFromUrl')
|
||||
->with($remote)->willReturn($remote);
|
||||
|
||||
// only add background job on first try
|
||||
if ($try === 0 && $expected === false) {
|
||||
$this->jobList->expects($this->once())->method('add')
|
||||
|
|
Loading…
Reference in New Issue