Browse Source
Use IClientService to check for remote ownCloud instances
Use IClientService to check for remote ownCloud instances
1. Allows to set a timeout (though still not perfect but way better than before) 2. Allows to have unit tests 3. I also added unit tests for the existing controller code 4. Corrected PHPDoc on IClientremotes/origin/notification-style
7 changed files with 257 additions and 53 deletions
-
46apps/files_sharing/ajax/testremote.php
-
6apps/files_sharing/appinfo/application.php
-
11apps/files_sharing/appinfo/routes.php
-
50apps/files_sharing/lib/controllers/externalsharescontroller.php
-
187apps/files_sharing/tests/controller/externalsharecontroller.php
-
5lib/private/http/client/client.php
-
5lib/public/http/client/iclient.php
@ -1,46 +0,0 @@ |
|||
<?php |
|||
/** |
|||
* @author Lukas Reschke <lukas@owncloud.com> |
|||
* @author Morris Jobke <hey@morrisjobke.de> |
|||
* @author Robin Appelman <icewind@owncloud.com> |
|||
* |
|||
* @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 <http://www.gnu.org/licenses/> |
|||
* |
|||
*/ |
|||
|
|||
OCP\JSON::callCheck(); |
|||
OCP\JSON::checkAppEnabled('files_sharing'); |
|||
|
|||
$remote = $_GET['remote']; |
|||
|
|||
function testUrl($url) { |
|||
try { |
|||
$result = file_get_contents($url); |
|||
$data = json_decode($result); |
|||
// public link mount is only supported in ownCloud 7+
|
|||
return is_object($data) and !empty($data->version) and version_compare($data->version, '7.0.0', '>='); |
|||
} catch (Exception $e) { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
if (testUrl('https://' . $remote . '/status.php')) { |
|||
echo 'https'; |
|||
} elseif (testUrl('http://' . $remote . '/status.php')) { |
|||
echo 'http'; |
|||
} else { |
|||
echo 'false'; |
|||
} |
@ -0,0 +1,187 @@ |
|||
<?php |
|||
/** |
|||
* @author Lukas Reschke <lukas@owncloud.com> |
|||
* |
|||
* @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 <http://www.gnu.org/licenses/> |
|||
* |
|||
*/ |
|||
|
|||
namespace OCA\Files_Sharing\Controllers; |
|||
|
|||
use OCP\AppFramework\Http\DataResponse; |
|||
use OCP\AppFramework\Http\JSONResponse; |
|||
use OCP\Http\Client\IClientService; |
|||
use OCP\IRequest; |
|||
|
|||
/** |
|||
* Class ExternalShareControllerTest |
|||
* |
|||
* @package OCA\Files_Sharing\Controllers |
|||
*/ |
|||
class ExternalShareControllerTest extends \Test\TestCase { |
|||
/** @var bool */ |
|||
private $incomingShareEnabled; |
|||
/** @var IRequest */ |
|||
private $request; |
|||
/** @var \OCA\Files_Sharing\External\Manager */ |
|||
private $externalManager; |
|||
/** @var IClientService */ |
|||
private $clientService; |
|||
|
|||
public function setUp() { |
|||
$this->request = $this->getMockBuilder('\\OCP\\IRequest') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->externalManager = $this->getMockBuilder('\\OCA\\Files_Sharing\\External\\Manager') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->clientService = $this->getMockBuilder('\\OCP\Http\\Client\\IClientService') |
|||
->disableOriginalConstructor()->getMock(); |
|||
} |
|||
|
|||
/** |
|||
* @return ExternalSharesController |
|||
*/ |
|||
public function getExternalShareController() { |
|||
return new ExternalSharesController( |
|||
'files_sharing', |
|||
$this->request, |
|||
$this->incomingShareEnabled, |
|||
$this->externalManager, |
|||
$this->clientService |
|||
); |
|||
} |
|||
|
|||
public function testIndexDisabled() { |
|||
$this->externalManager |
|||
->expects($this->never()) |
|||
->method('getOpenShares'); |
|||
|
|||
$this->assertEquals(new JSONResponse(), $this->getExternalShareController()->index()); |
|||
} |
|||
|
|||
public function testIndexEnabled() { |
|||
$this->incomingShareEnabled = true; |
|||
$this->externalManager |
|||
->expects($this->once()) |
|||
->method('getOpenShares') |
|||
->will($this->returnValue(['MyDummyArray'])); |
|||
|
|||
$this->assertEquals(new JSONResponse(['MyDummyArray']), $this->getExternalShareController()->index()); |
|||
} |
|||
|
|||
public function testCreateDisabled() { |
|||
$this->externalManager |
|||
->expects($this->never()) |
|||
->method('acceptShare'); |
|||
|
|||
$this->assertEquals(new JSONResponse(), $this->getExternalShareController()->create(4)); |
|||
} |
|||
|
|||
public function testCreateEnabled() { |
|||
$this->incomingShareEnabled = true; |
|||
$this->externalManager |
|||
->expects($this->once()) |
|||
->method('acceptShare') |
|||
->with(4); |
|||
|
|||
$this->assertEquals(new JSONResponse(), $this->getExternalShareController()->create(4)); |
|||
} |
|||
|
|||
public function testDestroyDisabled() { |
|||
$this->externalManager |
|||
->expects($this->never()) |
|||
->method('destroy'); |
|||
|
|||
$this->assertEquals(new JSONResponse(), $this->getExternalShareController()->destroy(4)); |
|||
} |
|||
|
|||
public function testDestroyEnabled() { |
|||
$this->incomingShareEnabled = true; |
|||
$this->externalManager |
|||
->expects($this->once()) |
|||
->method('declineShare') |
|||
->with(4); |
|||
|
|||
$this->assertEquals(new JSONResponse(), $this->getExternalShareController()->destroy(4)); |
|||
} |
|||
|
|||
public function testRemoteWithValidHttps() { |
|||
$client = $this->getMockBuilder('\\OCP\\Http\\Client\\IClient') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$response = $this->getMockBuilder('\\OCP\\Http\\Client\\IResponse') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$client |
|||
->expects($this->once()) |
|||
->method('get') |
|||
->with( |
|||
'https://owncloud.org/status.php', |
|||
[ |
|||
'timeout' => 3, |
|||
'connect_timeout' => 3, |
|||
] |
|||
)->will($this->returnValue($response)); |
|||
$response |
|||
->expects($this->once()) |
|||
->method('getBody') |
|||
->will($this->returnValue('{"installed":true,"maintenance":false,"version":"8.1.0.8","versionstring":"8.1.0","edition":""}')); |
|||
|
|||
$this->clientService |
|||
->expects($this->once()) |
|||
->method('newClient') |
|||
->will($this->returnValue($client)); |
|||
|
|||
$this->assertEquals(new DataResponse('https'), $this->getExternalShareController()->testRemote('owncloud.org')); |
|||
} |
|||
|
|||
public function testRemoteWithWorkingHttp() { |
|||
$client = $this->getMockBuilder('\\OCP\\Http\\Client\\IClient') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$response = $this->getMockBuilder('\\OCP\\Http\\Client\\IResponse') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$client |
|||
->method('get') |
|||
->will($this->onConsecutiveCalls($response, $response)); |
|||
$response |
|||
->expects($this->exactly(2)) |
|||
->method('getBody') |
|||
->will($this->onConsecutiveCalls('Certainly not a JSON string', '{"installed":true,"maintenance":false,"version":"8.1.0.8","versionstring":"8.1.0","edition":""}')); |
|||
$this->clientService |
|||
->expects($this->exactly(2)) |
|||
->method('newClient') |
|||
->will($this->returnValue($client)); |
|||
|
|||
$this->assertEquals(new DataResponse('http'), $this->getExternalShareController()->testRemote('owncloud.org')); |
|||
} |
|||
|
|||
public function testRemoteWithInvalidRemote() { |
|||
$client = $this->getMockBuilder('\\OCP\\Http\\Client\\IClient') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$response = $this->getMockBuilder('\\OCP\\Http\\Client\\IResponse') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$client |
|||
->method('get') |
|||
->will($this->onConsecutiveCalls($response, $response)); |
|||
$response |
|||
->expects($this->exactly(2)) |
|||
->method('getBody') |
|||
->will($this->returnValue('Certainly not a JSON string')); |
|||
$this->clientService |
|||
->expects($this->exactly(2)) |
|||
->method('newClient') |
|||
->will($this->returnValue($client)); |
|||
|
|||
$this->assertEquals(new DataResponse(false), $this->getExternalShareController()->testRemote('owncloud.org')); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue