Skip to content
Snippets Groups Projects
Commit b90e9114 authored by Björn Schießle's avatar Björn Schießle Committed by GitHub
Browse files

Merge pull request #3614 from nextcloud/discover-federatedsharing-endpoints

Discover federatedsharing endpoints
parents 3cf2f6e3 42f40659
No related branches found
No related tags found
No related merge requests found
Showing
with 175 additions and 314 deletions
...@@ -75,6 +75,7 @@ class SyncService { ...@@ -75,6 +75,7 @@ class SyncService {
/** /**
* @param string $url * @param string $url
* @param string $userName * @param string $userName
* @param string $addressBookUrl
* @param string $sharedSecret * @param string $sharedSecret
* @param string $syncToken * @param string $syncToken
* @param int $targetBookId * @param int $targetBookId
...@@ -83,14 +84,14 @@ class SyncService { ...@@ -83,14 +84,14 @@ class SyncService {
* @return string * @return string
* @throws \Exception * @throws \Exception
*/ */
public function syncRemoteAddressBook($url, $userName, $sharedSecret, $syncToken, $targetBookId, $targetPrincipal, $targetProperties) { public function syncRemoteAddressBook($url, $userName, $addressBookUrl, $sharedSecret, $syncToken, $targetBookId, $targetPrincipal, $targetProperties) {
// 1. create addressbook // 1. create addressbook
$book = $this->ensureSystemAddressBookExists($targetPrincipal, $targetBookId, $targetProperties); $book = $this->ensureSystemAddressBookExists($targetPrincipal, $targetBookId, $targetProperties);
$addressBookId = $book['id']; $addressBookId = $book['id'];
// 2. query changes // 2. query changes
try { try {
$response = $this->requestSyncReport($url, $userName, $sharedSecret, $syncToken); $response = $this->requestSyncReport($url, $userName, $addressBookUrl, $sharedSecret, $syncToken);
} catch (ClientHttpException $ex) { } catch (ClientHttpException $ex) {
if ($ex->getCode() === Http::STATUS_UNAUTHORIZED) { if ($ex->getCode() === Http::STATUS_UNAUTHORIZED) {
// remote server revoked access to the address book, remove it // remote server revoked access to the address book, remove it
...@@ -105,7 +106,7 @@ class SyncService { ...@@ -105,7 +106,7 @@ class SyncService {
foreach ($response['response'] as $resource => $status) { foreach ($response['response'] as $resource => $status) {
$cardUri = basename($resource); $cardUri = basename($resource);
if (isset($status[200])) { if (isset($status[200])) {
$vCard = $this->download($url, $sharedSecret, $resource); $vCard = $this->download($url, $userName, $sharedSecret, $resource);
$existingCard = $this->backend->getCard($addressBookId, $cardUri); $existingCard = $this->backend->getCard($addressBookId, $cardUri);
if ($existingCard === false) { if ($existingCard === false) {
$this->backend->createCard($addressBookId, $cardUri, $vCard['body']); $this->backend->createCard($addressBookId, $cardUri, $vCard['body']);
...@@ -162,6 +163,7 @@ class SyncService { ...@@ -162,6 +163,7 @@ class SyncService {
/** /**
* @param string $url * @param string $url
* @param string $userName * @param string $userName
* @param string $addressBookUrl
* @param string $sharedSecret * @param string $sharedSecret
* @return Client * @return Client
*/ */
...@@ -185,31 +187,32 @@ class SyncService { ...@@ -185,31 +187,32 @@ class SyncService {
/** /**
* @param string $url * @param string $url
* @param string $userName * @param string $userName
* @param string $addressBookUrl
* @param string $sharedSecret * @param string $sharedSecret
* @param string $syncToken * @param string $syncToken
* @return array * @return array
*/ */
protected function requestSyncReport($url, $userName, $sharedSecret, $syncToken) { protected function requestSyncReport($url, $userName, $addressBookUrl, $sharedSecret, $syncToken) {
$client = $this->getClient($url, $userName, $sharedSecret); $client = $this->getClient($url, $userName, $sharedSecret);
$addressBookUrl = "remote.php/dav/addressbooks/system/system/system"; $body = $this->buildSyncCollectionRequestBody($syncToken);
$body = $this->buildSyncCollectionRequestBody($syncToken);
$response = $client->request('REPORT', $addressBookUrl, $body, [ $response = $client->request('REPORT', $addressBookUrl, $body, [
'Content-Type' => 'application/xml' 'Content-Type' => 'application/xml'
]); ]);
return $this->parseMultiStatus($response['body']); return $this->parseMultiStatus($response['body']);
} }
/** /**
* @param string $url * @param string $url
* @param string $userName
* @param string $sharedSecret * @param string $sharedSecret
* @param string $resourcePath * @param string $resourcePath
* @return array * @return array
*/ */
protected function download($url, $sharedSecret, $resourcePath) { protected function download($url, $userName, $sharedSecret, $resourcePath) {
$client = $this->getClient($url, 'system', $sharedSecret); $client = $this->getClient($url, $userName, $sharedSecret);
return $client->request('GET', $resourcePath); return $client->request('GET', $resourcePath);
} }
......
...@@ -37,7 +37,7 @@ class SyncServiceTest extends TestCase { ...@@ -37,7 +37,7 @@ class SyncServiceTest extends TestCase {
$backend = $this->getBackendMock(0, 0, 0); $backend = $this->getBackendMock(0, 0, 0);
$ss = $this->getSyncServiceMock($backend, []); $ss = $this->getSyncServiceMock($backend, []);
$return = $ss->syncRemoteAddressBook('', 'system', '1234567890', null, '1', 'principals/system/system', []); $return = $ss->syncRemoteAddressBook('', 'system', 'system', '1234567890', null, '1', 'principals/system/system', []);
$this->assertEquals('sync-token-1', $return); $this->assertEquals('sync-token-1', $return);
} }
...@@ -46,7 +46,7 @@ class SyncServiceTest extends TestCase { ...@@ -46,7 +46,7 @@ class SyncServiceTest extends TestCase {
$backend->method('getCard')->willReturn(false); $backend->method('getCard')->willReturn(false);
$ss = $this->getSyncServiceMock($backend, ['0' => [200 => '']]); $ss = $this->getSyncServiceMock($backend, ['0' => [200 => '']]);
$return = $ss->syncRemoteAddressBook('', 'system', '1234567890', null, '1', 'principals/system/system', []); $return = $ss->syncRemoteAddressBook('', 'system', 'system', '1234567890', null, '1', 'principals/system/system', []);
$this->assertEquals('sync-token-1', $return); $this->assertEquals('sync-token-1', $return);
} }
...@@ -55,7 +55,7 @@ class SyncServiceTest extends TestCase { ...@@ -55,7 +55,7 @@ class SyncServiceTest extends TestCase {
$backend->method('getCard')->willReturn(true); $backend->method('getCard')->willReturn(true);
$ss = $this->getSyncServiceMock($backend, ['0' => [200 => '']]); $ss = $this->getSyncServiceMock($backend, ['0' => [200 => '']]);
$return = $ss->syncRemoteAddressBook('', 'system', '1234567890', null, '1', 'principals/system/system', []); $return = $ss->syncRemoteAddressBook('', 'system', 'system', '1234567890', null, '1', 'principals/system/system', []);
$this->assertEquals('sync-token-1', $return); $this->assertEquals('sync-token-1', $return);
} }
...@@ -63,7 +63,7 @@ class SyncServiceTest extends TestCase { ...@@ -63,7 +63,7 @@ class SyncServiceTest extends TestCase {
$backend = $this->getBackendMock(0, 0, 1); $backend = $this->getBackendMock(0, 0, 1);
$ss = $this->getSyncServiceMock($backend, ['0' => [404 => '']]); $ss = $this->getSyncServiceMock($backend, ['0' => [404 => '']]);
$return = $ss->syncRemoteAddressBook('', 'system', '1234567890', null, '1', 'principals/system/system', []); $return = $ss->syncRemoteAddressBook('', 'system', 'system', '1234567890', null, '1', 'principals/system/system', []);
$this->assertEquals('sync-token-1', $return); $this->assertEquals('sync-token-1', $return);
} }
......
...@@ -51,10 +51,7 @@ class Application extends App { ...@@ -51,10 +51,7 @@ class Application extends App {
$notification = new Notifications( $notification = new Notifications(
$addressHandler, $addressHandler,
$server->getHTTPClientService(), $server->getHTTPClientService(),
new \OCA\FederatedFileSharing\DiscoveryManager( $server->query(\OCP\OCS\IDiscoveryService::class),
$server->getMemCacheFactory(),
$server->getHTTPClientService()
),
\OC::$server->getJobList() \OC::$server->getJobList()
); );
return new RequestHandlerController( return new RequestHandlerController(
...@@ -99,14 +96,10 @@ class Application extends App { ...@@ -99,14 +96,10 @@ class Application extends App {
\OC::$server->getL10N('federatedfilesharing'), \OC::$server->getL10N('federatedfilesharing'),
\OC::$server->getCloudIdManager() \OC::$server->getCloudIdManager()
); );
$discoveryManager = new \OCA\FederatedFileSharing\DiscoveryManager(
\OC::$server->getMemCacheFactory(),
\OC::$server->getHTTPClientService()
);
$notifications = new \OCA\FederatedFileSharing\Notifications( $notifications = new \OCA\FederatedFileSharing\Notifications(
$addressHandler, $addressHandler,
\OC::$server->getHTTPClientService(), \OC::$server->getHTTPClientService(),
$discoveryManager, \OC::$server->query(\OCP\OCS\IDiscoveryService::class),
\OC::$server->getJobList() \OC::$server->getJobList()
); );
$tokenHandler = new \OCA\FederatedFileSharing\TokenHandler( $tokenHandler = new \OCA\FederatedFileSharing\TokenHandler(
......
...@@ -27,7 +27,6 @@ namespace OCA\FederatedFileSharing\BackgroundJob; ...@@ -27,7 +27,6 @@ namespace OCA\FederatedFileSharing\BackgroundJob;
use OC\BackgroundJob\Job; use OC\BackgroundJob\Job;
use OC\BackgroundJob\JobList; use OC\BackgroundJob\JobList;
use OCA\FederatedFileSharing\AddressHandler; use OCA\FederatedFileSharing\AddressHandler;
use OCA\FederatedFileSharing\DiscoveryManager;
use OCA\FederatedFileSharing\Notifications; use OCA\FederatedFileSharing\Notifications;
use OCP\BackgroundJob\IJobList; use OCP\BackgroundJob\IJobList;
use OCP\ILogger; use OCP\ILogger;
...@@ -68,14 +67,10 @@ class RetryJob extends Job { ...@@ -68,14 +67,10 @@ class RetryJob extends Job {
\OC::$server->getL10N('federatedfilesharing'), \OC::$server->getL10N('federatedfilesharing'),
\OC::$server->getCloudIdManager() \OC::$server->getCloudIdManager()
); );
$discoveryManager = new DiscoveryManager(
\OC::$server->getMemCacheFactory(),
\OC::$server->getHTTPClientService()
);
$this->notifications = new Notifications( $this->notifications = new Notifications(
$addressHandler, $addressHandler,
\OC::$server->getHTTPClientService(), \OC::$server->getHTTPClientService(),
$discoveryManager, \OC::$server->query(\OCP\OCS\IDiscoveryService::class),
\OC::$server->getJobList() \OC::$server->getJobList()
); );
} }
...@@ -108,7 +103,7 @@ class RetryJob extends Job { ...@@ -108,7 +103,7 @@ class RetryJob extends Job {
$try = (int)$argument['try'] + 1; $try = (int)$argument['try'] + 1;
$result = $this->notifications->sendUpdateToRemote($remote, $remoteId, $token, $action, $data, $try); $result = $this->notifications->sendUpdateToRemote($remote, $remoteId, $token, $action, $data, $try);
if ($result === true || $try > $this->maxTry) { if ($result === true || $try > $this->maxTry) {
$this->retainJob = false; $this->retainJob = false;
} }
......
...@@ -248,17 +248,13 @@ class MountPublicLinkController extends Controller { ...@@ -248,17 +248,13 @@ class MountPublicLinkController extends Controller {
if (Helper::isSameUserOnSameServer($owner, $remote, $currentUser, $currentServer)) { if (Helper::isSameUserOnSameServer($owner, $remote, $currentUser, $currentServer)) {
return new JSONResponse(['message' => $this->l->t('Not allowed to create a federated share with the owner.')], Http::STATUS_BAD_REQUEST); return new JSONResponse(['message' => $this->l->t('Not allowed to create a federated share with the owner.')], Http::STATUS_BAD_REQUEST);
} }
$discoveryManager = new DiscoveryManager(
\OC::$server->getMemCacheFactory(),
\OC::$server->getHTTPClientService()
);
$externalManager = new Manager( $externalManager = new Manager(
\OC::$server->getDatabaseConnection(), \OC::$server->getDatabaseConnection(),
Filesystem::getMountManager(), Filesystem::getMountManager(),
Filesystem::getLoader(), Filesystem::getLoader(),
\OC::$server->getHTTPClientService(), \OC::$server->getHTTPClientService(),
\OC::$server->getNotificationManager(), \OC::$server->getNotificationManager(),
$discoveryManager, \OC::$server->query(\OCP\OCS\IDiscoveryService::class),
\OC::$server->getUserSession()->getUser()->getUID() \OC::$server->getUserSession()->getUser()->getUID()
); );
......
...@@ -152,19 +152,15 @@ class RequestHandlerController extends OCSController { ...@@ -152,19 +152,15 @@ class RequestHandlerController extends OCSController {
\OC_Util::setupFS($shareWith); \OC_Util::setupFS($shareWith);
$discoveryManager = new DiscoveryManager(
\OC::$server->getMemCacheFactory(),
\OC::$server->getHTTPClientService()
);
$externalManager = new \OCA\Files_Sharing\External\Manager( $externalManager = new \OCA\Files_Sharing\External\Manager(
\OC::$server->getDatabaseConnection(), \OC::$server->getDatabaseConnection(),
\OC\Files\Filesystem::getMountManager(), \OC\Files\Filesystem::getMountManager(),
\OC\Files\Filesystem::getLoader(), \OC\Files\Filesystem::getLoader(),
\OC::$server->getHTTPClientService(), \OC::$server->getHTTPClientService(),
\OC::$server->getNotificationManager(), \OC::$server->getNotificationManager(),
$discoveryManager, \OC::$server->query(\OCP\OCS\IDiscoveryService::class),
$shareWith $shareWith
); );
try { try {
$externalManager->addShare($remote, $token, '', $name, $owner, false, $shareWith, $remoteId); $externalManager->addShare($remote, $token, '', $name, $owner, false, $shareWith, $remoteId);
......
...@@ -30,6 +30,7 @@ namespace OCA\FederatedFileSharing; ...@@ -30,6 +30,7 @@ namespace OCA\FederatedFileSharing;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use OCP\BackgroundJob\IJobList; use OCP\BackgroundJob\IJobList;
use OCP\Http\Client\IClientService; use OCP\Http\Client\IClientService;
use OCP\OCS\IDiscoveryService;
class Notifications { class Notifications {
const RESPONSE_FORMAT = 'json'; // default response format for ocs calls const RESPONSE_FORMAT = 'json'; // default response format for ocs calls
...@@ -40,8 +41,8 @@ class Notifications { ...@@ -40,8 +41,8 @@ class Notifications {
/** @var IClientService */ /** @var IClientService */
private $httpClientService; private $httpClientService;
/** @var DiscoveryManager */ /** @var IDiscoveryService */
private $discoveryManager; private $discoveryService;
/** @var IJobList */ /** @var IJobList */
private $jobList; private $jobList;
...@@ -49,18 +50,18 @@ class Notifications { ...@@ -49,18 +50,18 @@ class Notifications {
/** /**
* @param AddressHandler $addressHandler * @param AddressHandler $addressHandler
* @param IClientService $httpClientService * @param IClientService $httpClientService
* @param DiscoveryManager $discoveryManager * @param IDiscoveryService $discoveryService
* @param IJobList $jobList * @param IJobList $jobList
*/ */
public function __construct( public function __construct(
AddressHandler $addressHandler, AddressHandler $addressHandler,
IClientService $httpClientService, IClientService $httpClientService,
DiscoveryManager $discoveryManager, IDiscoveryService $discoveryService,
IJobList $jobList IJobList $jobList
) { ) {
$this->addressHandler = $addressHandler; $this->addressHandler = $addressHandler;
$this->httpClientService = $httpClientService; $this->httpClientService = $httpClientService;
$this->discoveryManager = $discoveryManager; $this->discoveryService = $discoveryService;
$this->jobList = $jobList; $this->jobList = $jobList;
} }
...@@ -287,7 +288,8 @@ class Notifications { ...@@ -287,7 +288,8 @@ class Notifications {
'result' => '', 'result' => '',
]; ];
$endpoint = $this->discoveryManager->getShareEndpoint($remoteDomain); $federationEndpoints = $this->discoveryService->discover($remoteDomain, 'FEDERATED_SHARING');
$endpoint = isset($federationEndpoints['share']) ? $federationEndpoints['share'] : '/ocs/v2.php/cloud/shares';
try { try {
$response = $client->post($remoteDomain . $endpoint . $urlSuffix . '?format=' . self::RESPONSE_FORMAT, [ $response = $client->post($remoteDomain . $endpoint . $urlSuffix . '?format=' . self::RESPONSE_FORMAT, [
'body' => $fields, 'body' => $fields,
......
...@@ -270,17 +270,13 @@ class RequestHandlerControllerTest extends TestCase { ...@@ -270,17 +270,13 @@ class RequestHandlerControllerTest extends TestCase {
->method('newClient') ->method('newClient')
->willReturn($client); ->willReturn($client);
$discoveryManager = new DiscoveryManager(
\OC::$server->getMemCacheFactory(),
$httpClientService
);
$manager = new \OCA\Files_Sharing\External\Manager( $manager = new \OCA\Files_Sharing\External\Manager(
\OC::$server->getDatabaseConnection(), \OC::$server->getDatabaseConnection(),
Filesystem::getMountManager(), Filesystem::getMountManager(),
Filesystem::getLoader(), Filesystem::getLoader(),
$httpClientService, $httpClientService,
\OC::$server->getNotificationManager(), \OC::$server->getNotificationManager(),
$discoveryManager, \OC::$server->query(\OCP\OCS\IDiscoveryService::class),
$toDelete $toDelete
); );
......
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Björn Schießle <bjoern@schiessle.org>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Vincent Petry <pvince81@owncloud.com>
*
* @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\FederatedFileSharing\Tests;
use OCA\FederatedFileSharing\DiscoveryManager;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
use OCP\ICache;
use OCP\ICacheFactory;
class DiscoveryManagerTest extends \Test\TestCase {
/** @var ICache */
private $cache;
/** @var IClient */
private $client;
/** @var DiscoveryManager */
private $discoveryManager;
public function setUp() {
parent::setUp();
$this->cache = $this->getMockBuilder('\OCP\ICache')
->getMock();
/** @var ICacheFactory $cacheFactory */
$cacheFactory = $this->getMockBuilder('\OCP\ICacheFactory')
->disableOriginalConstructor()->getMock();
$cacheFactory
->expects($this->once())
->method('create')
->with('ocs-discovery')
->willReturn($this->cache);
$this->client = $this->getMockBuilder('\OCP\Http\Client\IClient')
->disableOriginalConstructor()->getMock();
/** @var IClientService $clientService */
$clientService = $this->getMockBuilder('\OCP\Http\Client\IClientService')
->disableOriginalConstructor()->getMock();
$clientService
->expects($this->once())
->method('newClient')
->willReturn($this->client);
$this->discoveryManager = new DiscoveryManager(
$cacheFactory,
$clientService
);
}
public function testWithMalformedFormattedEndpointCached() {
$response = $this->getMockBuilder('\OCP\Http\Client\IResponse')
->getMock();
$response
->expects($this->once())
->method('getStatusCode')
->willReturn(200);
$response
->expects($this->once())
->method('getBody')
->willReturn('CertainlyNotJson');
$this->client
->expects($this->once())
->method('get')
->with('https://myhost.com/ocs-provider/', [
'timeout' => 10,
'connect_timeout' => 10,
])
->willReturn($response);
$this->cache
->expects($this->at(0))
->method('get')
->with('https://myhost.com')
->willReturn(null);
$this->cache
->expects($this->at(1))
->method('set')
->with('https://myhost.com', '{"webdav":"\/public.php\/webdav","share":"\/ocs\/v1.php\/cloud\/shares"}');
$this->cache
->expects($this->at(2))
->method('get')
->with('https://myhost.com')
->willReturn('{"webdav":"\/public.php\/webdav","share":"\/ocs\/v1.php\/cloud\/shares"}');
$this->assertSame('/public.php/webdav', $this->discoveryManager->getWebDavEndpoint('https://myhost.com'));
$this->assertSame('/ocs/v1.php/cloud/shares', $this->discoveryManager->getShareEndpoint('https://myhost.com'));
}
public function testGetWebDavEndpointWithValidFormattedEndpointAndNotCached() {
$response = $this->getMockBuilder('\OCP\Http\Client\IResponse')
->getMock();
$response
->expects($this->once())
->method('getStatusCode')
->willReturn(200);
$response
->expects($this->once())
->method('getBody')
->willReturn('{"version":2,"services":{"PRIVATE_DATA":{"version":1,"endpoints":{"store":"\/ocs\/v2.php\/privatedata\/setattribute","read":"\/ocs\/v2.php\/privatedata\/getattribute","delete":"\/ocs\/v2.php\/privatedata\/deleteattribute"}},"SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/apps\/files_sharing\/api\/v1\/shares"}},"FEDERATED_SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/cloud\/shares","webdav":"\/public.php\/MyCustomEndpoint\/"}},"ACTIVITY":{"version":1,"endpoints":{"list":"\/ocs\/v2.php\/cloud\/activity"}},"PROVISIONING":{"version":1,"endpoints":{"user":"\/ocs\/v2.php\/cloud\/users","groups":"\/ocs\/v2.php\/cloud\/groups","apps":"\/ocs\/v2.php\/cloud\/apps"}}}}');
$this->client
->expects($this->once())
->method('get')
->with('https://myhost.com/ocs-provider/', [
'timeout' => 10,
'connect_timeout' => 10,
])
->willReturn($response);
$expectedResult = '/public.php/MyCustomEndpoint/';
$this->assertSame($expectedResult, $this->discoveryManager->getWebDavEndpoint('https://myhost.com'));
}
public function testGetWebDavEndpointWithValidFormattedEndpointWithoutDataAndNotCached() {
$response = $this->getMockBuilder('\OCP\Http\Client\IResponse')
->getMock();
$response
->expects($this->once())
->method('getStatusCode')
->willReturn(200);
$response
->expects($this->once())
->method('getBody')
->willReturn('{"version":2,"PRIVATE_DATA":{"version":1,"endpoints":{"store":"\/ocs\/v2.php\/privatedata\/setattribute","read":"\/ocs\/v2.php\/privatedata\/getattribute","delete":"\/ocs\/v2.php\/privatedata\/deleteattribute"}},"SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/apps\/files_sharing\/api\/v1\/shares"}},"FEDERATED_SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/cloud\/shares","webdav":"\/public.php\/MyCustomEndpoint\/"}},"ACTIVITY":{"version":1,"endpoints":{"list":"\/ocs\/v2.php\/cloud\/activity"}},"PROVISIONING":{"version":1,"endpoints":{"user":"\/ocs\/v2.php\/cloud\/users","groups":"\/ocs\/v2.php\/cloud\/groups","apps":"\/ocs\/v2.php\/cloud\/apps"}}}');
$this->client
->expects($this->once())
->method('get')
->with('https://myhost.com/ocs-provider/', [
'timeout' => 10,
'connect_timeout' => 10,
])
->willReturn($response);
$expectedResult = '/public.php/webdav';
$this->assertSame($expectedResult, $this->discoveryManager->getWebDavEndpoint('https://myhost.com'));
}
public function testGetShareEndpointWithValidFormattedEndpointAndNotCached() {
$response = $this->getMockBuilder('\OCP\Http\Client\IResponse')
->getMock();
$response
->expects($this->once())
->method('getStatusCode')
->willReturn(200);
$response
->expects($this->once())
->method('getBody')
->willReturn('{"version":2,"services":{"PRIVATE_DATA":{"version":1,"endpoints":{"store":"\/ocs\/v2.php\/privatedata\/setattribute","read":"\/ocs\/v2.php\/privatedata\/getattribute","delete":"\/ocs\/v2.php\/privatedata\/deleteattribute"}},"SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/apps\/files_sharing\/api\/v1\/shares"}},"FEDERATED_SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/cloud\/MyCustomShareEndpoint","webdav":"\/public.php\/MyCustomEndpoint\/"}},"ACTIVITY":{"version":1,"endpoints":{"list":"\/ocs\/v2.php\/cloud\/activity"}},"PROVISIONING":{"version":1,"endpoints":{"user":"\/ocs\/v2.php\/cloud\/users","groups":"\/ocs\/v2.php\/cloud\/groups","apps":"\/ocs\/v2.php\/cloud\/apps"}}}}');
$this->client
->expects($this->once())
->method('get')
->with('https://myhost.com/ocs-provider/', [
'timeout' => 10,
'connect_timeout' => 10,
])
->willReturn($response);
$expectedResult = '/ocs/v2.php/cloud/MyCustomShareEndpoint';
$this->assertSame($expectedResult, $this->discoveryManager->getShareEndpoint('https://myhost.com'));
}
public function testWithMaliciousEndpointCached() {
$response = $this->getMockBuilder('\OCP\Http\Client\IResponse')
->getMock();
$response
->expects($this->once())
->method('getStatusCode')
->willReturn(200);
$response
->expects($this->once())
->method('getBody')
->willReturn('{"version":2,"services":{"PRIVATE_DATA":{"version":1,"endpoints":{"store":"\/ocs\/v2.php\/privatedata\/setattribute","read":"\/ocs\/v2.php\/privatedata\/getattribute","delete":"\/ocs\/v2.php\/privatedata\/deleteattribute"}},"SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/apps\/files_sharing\/api\/v1\/shares"}},"FEDERATED_SHARING":{"version":1,"endpoints":{"share":"\/ocs\/v2.php\/cl@oud\/MyCustomShareEndpoint","webdav":"\/public.php\/MyC:ustomEndpoint\/"}},"ACTIVITY":{"version":1,"endpoints":{"list":"\/ocs\/v2.php\/cloud\/activity"}},"PROVISIONING":{"version":1,"endpoints":{"user":"\/ocs\/v2.php\/cloud\/users","groups":"\/ocs\/v2.php\/cloud\/groups","apps":"\/ocs\/v2.php\/cloud\/apps"}}}}');
$this->client
->expects($this->once())
->method('get')
->with('https://myhost.com/ocs-provider/', [
'timeout' => 10,
'connect_timeout' => 10,
])
->willReturn($response);
$this->cache
->expects($this->at(0))
->method('get')
->with('https://myhost.com')
->willReturn(null);
$this->cache
->expects($this->at(1))
->method('set')
->with('https://myhost.com', '{"webdav":"\/public.php\/webdav","share":"\/ocs\/v1.php\/cloud\/shares"}');
$this->cache
->expects($this->at(2))
->method('get')
->with('https://myhost.com')
->willReturn('{"webdav":"\/public.php\/webdav","share":"\/ocs\/v1.php\/cloud\/shares"}');
$this->assertSame('/public.php/webdav', $this->discoveryManager->getWebDavEndpoint('https://myhost.com'));
$this->assertSame('/ocs/v1.php/cloud/shares', $this->discoveryManager->getShareEndpoint('https://myhost.com'));
}
}
...@@ -25,10 +25,10 @@ namespace OCA\FederatedFileSharing\Tests; ...@@ -25,10 +25,10 @@ namespace OCA\FederatedFileSharing\Tests;
use OCA\FederatedFileSharing\AddressHandler; use OCA\FederatedFileSharing\AddressHandler;
use OCA\FederatedFileSharing\DiscoveryManager;
use OCA\FederatedFileSharing\Notifications; use OCA\FederatedFileSharing\Notifications;
use OCP\BackgroundJob\IJobList; use OCP\BackgroundJob\IJobList;
use OCP\Http\Client\IClientService; use OCP\Http\Client\IClientService;
use OCP\OCS\IDiscoveryService;
class NotificationsTest extends \Test\TestCase { class NotificationsTest extends \Test\TestCase {
...@@ -38,8 +38,8 @@ class NotificationsTest extends \Test\TestCase { ...@@ -38,8 +38,8 @@ class NotificationsTest extends \Test\TestCase {
/** @var IClientService | \PHPUnit_Framework_MockObject_MockObject*/ /** @var IClientService | \PHPUnit_Framework_MockObject_MockObject*/
private $httpClientService; private $httpClientService;
/** @var DiscoveryManager | \PHPUnit_Framework_MockObject_MockObject */ /** @var IDiscoveryService | \PHPUnit_Framework_MockObject_MockObject */
private $discoveryManager; private $discoveryService;
/** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */ /** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */
private $jobList; private $jobList;
...@@ -48,8 +48,7 @@ class NotificationsTest extends \Test\TestCase { ...@@ -48,8 +48,7 @@ class NotificationsTest extends \Test\TestCase {
parent::setUp(); parent::setUp();
$this->jobList = $this->getMockBuilder('OCP\BackgroundJob\IJobList')->getMock(); $this->jobList = $this->getMockBuilder('OCP\BackgroundJob\IJobList')->getMock();
$this->discoveryManager = $this->getMockBuilder('OCA\FederatedFileSharing\DiscoveryManager') $this->discoveryService = $this->getMockBuilder(IDiscoveryService::class)->getMock();
->disableOriginalConstructor()->getMock();
$this->httpClientService = $this->getMockBuilder('OCP\Http\Client\IClientService')->getMock(); $this->httpClientService = $this->getMockBuilder('OCP\Http\Client\IClientService')->getMock();
$this->addressHandler = $this->getMockBuilder('OCA\FederatedFileSharing\AddressHandler') $this->addressHandler = $this->getMockBuilder('OCA\FederatedFileSharing\AddressHandler')
->disableOriginalConstructor()->getMock(); ->disableOriginalConstructor()->getMock();
...@@ -67,7 +66,7 @@ class NotificationsTest extends \Test\TestCase { ...@@ -67,7 +66,7 @@ class NotificationsTest extends \Test\TestCase {
$instance = new Notifications( $instance = new Notifications(
$this->addressHandler, $this->addressHandler,
$this->httpClientService, $this->httpClientService,
$this->discoveryManager, $this->discoveryService,
$this->jobList $this->jobList
); );
} else { } else {
...@@ -76,7 +75,7 @@ class NotificationsTest extends \Test\TestCase { ...@@ -76,7 +75,7 @@ class NotificationsTest extends \Test\TestCase {
[ [
$this->addressHandler, $this->addressHandler,
$this->httpClientService, $this->httpClientService,
$this->discoveryManager, $this->discoveryService,
$this->jobList $this->jobList
] ]
)->setMethods($mockedMethods)->getMock(); )->setMethods($mockedMethods)->getMock();
......
...@@ -45,12 +45,12 @@ $application->registerRoutes( ...@@ -45,12 +45,12 @@ $application->registerRoutes(
'ocs' => [ 'ocs' => [
// old endpoints, only used by Nextcloud and ownCloud // old endpoints, only used by Nextcloud and ownCloud
[ [
'name' => 'OCSAuthAPI#getSharedSecret', 'name' => 'OCSAuthAPI#getSharedSecretLegacy',
'url' => '/api/v1/shared-secret', 'url' => '/api/v1/shared-secret',
'verb' => 'GET', 'verb' => 'GET',
], ],
[ [
'name' => 'OCSAuthAPI#requestSharedSecret', 'name' => 'OCSAuthAPI#requestSharedSecretLegacy',
'url' => '/api/v1/request-shared-secret', 'url' => '/api/v1/request-shared-secret',
'verb' => 'POST', 'verb' => 'POST',
], ],
......
...@@ -135,7 +135,8 @@ class Application extends \OCP\AppFramework\App { ...@@ -135,7 +135,8 @@ class Application extends \OCP\AppFramework\App {
public function getSyncService() { public function getSyncService() {
$syncService = \OC::$server->query('CardDAVSyncService'); $syncService = \OC::$server->query('CardDAVSyncService');
$dbHandler = $this->getContainer()->query('DbHandler'); $dbHandler = $this->getContainer()->query('DbHandler');
return new SyncFederationAddressBooks($dbHandler, $syncService); $discoveryService = \OC::$server->query(\OCP\OCS\IDiscoveryService::class);
return new SyncFederationAddressBooks($dbHandler, $syncService, $discoveryService);
} }
} }
...@@ -37,6 +37,7 @@ use OCP\Http\Client\IClient; ...@@ -37,6 +37,7 @@ use OCP\Http\Client\IClient;
use OCP\Http\Client\IResponse; use OCP\Http\Client\IResponse;
use OCP\ILogger; use OCP\ILogger;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\OCS\IDiscoveryService;
/** /**
* Class GetSharedSecret * Class GetSharedSecret
...@@ -62,13 +63,18 @@ class GetSharedSecret extends Job{ ...@@ -62,13 +63,18 @@ class GetSharedSecret extends Job{
/** @var DbHandler */ /** @var DbHandler */
private $dbHandler; private $dbHandler;
/** @var IDiscoveryService */
private $ocsDiscoveryService;
/** @var ILogger */ /** @var ILogger */
private $logger; private $logger;
/** @var bool */ /** @var bool */
protected $retainJob = false; protected $retainJob = false;
private $endPoint = '/ocs/v2.php/apps/federation/api/v1/shared-secret?format=json'; private $format = '?format=json';
private $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/shared-secret';
/** /**
* RequestSharedSecret constructor. * RequestSharedSecret constructor.
...@@ -79,6 +85,7 @@ class GetSharedSecret extends Job{ ...@@ -79,6 +85,7 @@ class GetSharedSecret extends Job{
* @param TrustedServers $trustedServers * @param TrustedServers $trustedServers
* @param ILogger $logger * @param ILogger $logger
* @param DbHandler $dbHandler * @param DbHandler $dbHandler
* @param IDiscoveryService $ocsDiscoveryService
*/ */
public function __construct( public function __construct(
IClient $httpClient = null, IClient $httpClient = null,
...@@ -86,13 +93,15 @@ class GetSharedSecret extends Job{ ...@@ -86,13 +93,15 @@ class GetSharedSecret extends Job{
IJobList $jobList = null, IJobList $jobList = null,
TrustedServers $trustedServers = null, TrustedServers $trustedServers = null,
ILogger $logger = null, ILogger $logger = null,
DbHandler $dbHandler = null DbHandler $dbHandler = null,
IDiscoveryService $ocsDiscoveryService = null
) { ) {
$this->logger = $logger ? $logger : \OC::$server->getLogger(); $this->logger = $logger ? $logger : \OC::$server->getLogger();
$this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient(); $this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient();
$this->jobList = $jobList ? $jobList : \OC::$server->getJobList(); $this->jobList = $jobList ? $jobList : \OC::$server->getJobList();
$this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator(); $this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator();
$this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation')); $this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation'));
$this->ocsDiscoveryService = $ocsDiscoveryService ? $ocsDiscoveryService : \OC::$server->query(\OCP\OCS\IDiscoveryService::class);
if ($trustedServers) { if ($trustedServers) {
$this->trustedServers = $trustedServers; $this->trustedServers = $trustedServers;
} else { } else {
...@@ -142,10 +151,16 @@ class GetSharedSecret extends Job{ ...@@ -142,10 +151,16 @@ class GetSharedSecret extends Job{
$source = rtrim($source, '/'); $source = rtrim($source, '/');
$token = $argument['token']; $token = $argument['token'];
$endPoints = $this->ocsDiscoveryService->discover($target, 'FEDERATED_SHARING');
$endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
// make sure that we have a well formated url
$url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
$result = null; $result = null;
try { try {
$result = $this->httpClient->get( $result = $this->httpClient->get(
$target . $this->endPoint, $url,
[ [
'query' => 'query' =>
[ [
......
...@@ -37,6 +37,7 @@ use OCP\BackgroundJob\IJobList; ...@@ -37,6 +37,7 @@ use OCP\BackgroundJob\IJobList;
use OCP\Http\Client\IClient; use OCP\Http\Client\IClient;
use OCP\ILogger; use OCP\ILogger;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\OCS\IDiscoveryService;
/** /**
* Class RequestSharedSecret * Class RequestSharedSecret
...@@ -62,7 +63,8 @@ class RequestSharedSecret extends Job { ...@@ -62,7 +63,8 @@ class RequestSharedSecret extends Job {
/** @var TrustedServers */ /** @var TrustedServers */
private $trustedServers; private $trustedServers;
private $endPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret?format=json'; /** @var IDiscoveryService */
private $ocsDiscoveryService;
/** @var ILogger */ /** @var ILogger */
private $logger; private $logger;
...@@ -70,6 +72,10 @@ class RequestSharedSecret extends Job { ...@@ -70,6 +72,10 @@ class RequestSharedSecret extends Job {
/** @var bool */ /** @var bool */
protected $retainJob = false; protected $retainJob = false;
private $format = '?format=json';
private $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret';
/** /**
* RequestSharedSecret constructor. * RequestSharedSecret constructor.
* *
...@@ -78,19 +84,22 @@ class RequestSharedSecret extends Job { ...@@ -78,19 +84,22 @@ class RequestSharedSecret extends Job {
* @param IJobList $jobList * @param IJobList $jobList
* @param TrustedServers $trustedServers * @param TrustedServers $trustedServers
* @param DbHandler $dbHandler * @param DbHandler $dbHandler
* @param IDiscoveryService $ocsDiscoveryService
*/ */
public function __construct( public function __construct(
IClient $httpClient = null, IClient $httpClient = null,
IURLGenerator $urlGenerator = null, IURLGenerator $urlGenerator = null,
IJobList $jobList = null, IJobList $jobList = null,
TrustedServers $trustedServers = null, TrustedServers $trustedServers = null,
DbHandler $dbHandler = null DbHandler $dbHandler = null,
IDiscoveryService $ocsDiscoveryService = null
) { ) {
$this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient(); $this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient();
$this->jobList = $jobList ? $jobList : \OC::$server->getJobList(); $this->jobList = $jobList ? $jobList : \OC::$server->getJobList();
$this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator(); $this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator();
$this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation')); $this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation'));
$this->logger = \OC::$server->getLogger(); $this->logger = \OC::$server->getLogger();
$this->ocsDiscoveryService = $ocsDiscoveryService ? $ocsDiscoveryService : \OC::$server->query(\OCP\OCS\IDiscoveryService::class);
if ($trustedServers) { if ($trustedServers) {
$this->trustedServers = $trustedServers; $this->trustedServers = $trustedServers;
} else { } else {
...@@ -142,9 +151,15 @@ class RequestSharedSecret extends Job { ...@@ -142,9 +151,15 @@ class RequestSharedSecret extends Job {
$source = rtrim($source, '/'); $source = rtrim($source, '/');
$token = $argument['token']; $token = $argument['token'];
$endPoints = $this->ocsDiscoveryService->discover($target, 'FEDERATED_SHARING');
$endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
// make sure that we have a well formated url
$url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
try { try {
$result = $this->httpClient->post( $result = $this->httpClient->post(
$target . $this->endPoint, $url,
[ [
'body' => [ 'body' => [
'url' => $source, 'url' => $source,
......
...@@ -90,6 +90,37 @@ class OCSAuthAPIController extends OCSController{ ...@@ -90,6 +90,37 @@ class OCSAuthAPIController extends OCSController{
$this->logger = $logger; $this->logger = $logger;
} }
/**
* @NoCSRFRequired
* @PublicPage
*
* request received to ask remote server for a shared secret, for legacy end-points
*
* @param string $url
* @param string $token
* @return Http\DataResponse
* @throws OCSForbiddenException
*/
public function requestSharedSecretLegacy($url, $token) {
return $this->requestSharedSecret($url, $token);
}
/**
* @NoCSRFRequired
* @PublicPage
*
* create shared secret and return it, for legacy end-points
*
* @param string $url
* @param string $token
* @return Http\DataResponse
* @throws OCSForbiddenException
*/
public function getSharedSecretLegacy($url, $token) {
return $this->getSharedSecret($url, $token);
}
/** /**
* @NoCSRFRequired * @NoCSRFRequired
* @PublicPage * @PublicPage
......
...@@ -23,12 +23,10 @@ ...@@ -23,12 +23,10 @@
*/ */
namespace OCA\Federation; namespace OCA\Federation;
use OC\OCS\DiscoveryService;
use OCA\DAV\CardDAV\SyncService; use OCA\DAV\CardDAV\SyncService;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use Symfony\Component\Console\Command\Command; use OCP\OCS\IDiscoveryService;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class SyncFederationAddressBooks { class SyncFederationAddressBooks {
...@@ -38,13 +36,21 @@ class SyncFederationAddressBooks { ...@@ -38,13 +36,21 @@ class SyncFederationAddressBooks {
/** @var SyncService */ /** @var SyncService */
private $syncService; private $syncService;
/** @var DiscoveryService */
private $ocsDiscoveryService;
/** /**
* @param DbHandler $dbHandler * @param DbHandler $dbHandler
* @param SyncService $syncService * @param SyncService $syncService
* @param IDiscoveryService $ocsDiscoveryService
*/ */
function __construct(DbHandler $dbHandler, SyncService $syncService) { public function __construct(DbHandler $dbHandler,
SyncService $syncService,
IDiscoveryService $ocsDiscoveryService
) {
$this->syncService = $syncService; $this->syncService = $syncService;
$this->dbHandler = $dbHandler; $this->dbHandler = $dbHandler;
$this->ocsDiscoveryService = $ocsDiscoveryService;
} }
/** /**
...@@ -59,6 +65,10 @@ class SyncFederationAddressBooks { ...@@ -59,6 +65,10 @@ class SyncFederationAddressBooks {
$sharedSecret = $trustedServer['shared_secret']; $sharedSecret = $trustedServer['shared_secret'];
$syncToken = $trustedServer['sync_token']; $syncToken = $trustedServer['sync_token'];
$endPoints = $this->ocsDiscoveryService->discover($url, 'FEDERATED_SHARING');
$cardDavUser = isset($endPoints['carddav-user']) ? $endPoints['carddav-user'] : 'system';
$addressBookUrl = isset($endPoints['system-address-book']) ? trim($endPoints['system-address-book'], '/') : 'remote.php/dav/addressbooks/system/system/system';
if (is_null($sharedSecret)) { if (is_null($sharedSecret)) {
continue; continue;
} }
...@@ -68,7 +78,7 @@ class SyncFederationAddressBooks { ...@@ -68,7 +78,7 @@ class SyncFederationAddressBooks {
'{DAV:}displayname' => $url '{DAV:}displayname' => $url
]; ];
try { try {
$newToken = $this->syncService->syncRemoteAddressBook($url, 'system', $sharedSecret, $syncToken, $targetBookId, $targetPrincipal, $targetBookProperties); $newToken = $this->syncService->syncRemoteAddressBook($url, $cardDavUser, $addressBookUrl, $sharedSecret, $syncToken, $targetBookId, $targetPrincipal, $targetBookProperties);
if ($newToken !== $syncToken) { if ($newToken !== $syncToken) {
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken); $this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
} }
......
...@@ -36,6 +36,7 @@ use OCP\Http\Client\IClient; ...@@ -36,6 +36,7 @@ use OCP\Http\Client\IClient;
use OCP\Http\Client\IResponse; use OCP\Http\Client\IResponse;
use OCP\ILogger; use OCP\ILogger;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\OCS\IDiscoveryService;
/** /**
* Class GetSharedSecretTest * Class GetSharedSecretTest
...@@ -67,6 +68,9 @@ class GetSharedSecretTest extends TestCase { ...@@ -67,6 +68,9 @@ class GetSharedSecretTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */ /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */
private $response; private $response;
/** @var \PHPUnit_Framework_MockObject_MockObject | IDiscoveryService */
private $discoverService;
/** @var GetSharedSecret */ /** @var GetSharedSecret */
private $getSharedSecret; private $getSharedSecret;
...@@ -82,6 +86,9 @@ class GetSharedSecretTest extends TestCase { ...@@ -82,6 +86,9 @@ class GetSharedSecretTest extends TestCase {
->disableOriginalConstructor()->getMock(); ->disableOriginalConstructor()->getMock();
$this->logger = $this->getMockBuilder(ILogger::class)->getMock(); $this->logger = $this->getMockBuilder(ILogger::class)->getMock();
$this->response = $this->getMockBuilder(IResponse::class)->getMock(); $this->response = $this->getMockBuilder(IResponse::class)->getMock();
$this->discoverService = $this->getMockBuilder(IDiscoveryService::class)->getMock();
$this->discoverService->expects($this->any())->method('discover')->willReturn([]);
$this->getSharedSecret = new GetSharedSecret( $this->getSharedSecret = new GetSharedSecret(
$this->httpClient, $this->httpClient,
...@@ -89,7 +96,8 @@ class GetSharedSecretTest extends TestCase { ...@@ -89,7 +96,8 @@ class GetSharedSecretTest extends TestCase {
$this->jobList, $this->jobList,
$this->trustedServers, $this->trustedServers,
$this->logger, $this->logger,
$this->dbHandler $this->dbHandler,
$this->discoverService
); );
} }
...@@ -109,7 +117,8 @@ class GetSharedSecretTest extends TestCase { ...@@ -109,7 +117,8 @@ class GetSharedSecretTest extends TestCase {
$this->jobList, $this->jobList,
$this->trustedServers, $this->trustedServers,
$this->logger, $this->logger,
$this->dbHandler $this->dbHandler,
$this->discoverService
] ]
)->setMethods(['parentExecute'])->getMock(); )->setMethods(['parentExecute'])->getMock();
$this->invokePrivate($getSharedSecret, 'argument', [['url' => 'url']]); $this->invokePrivate($getSharedSecret, 'argument', [['url' => 'url']]);
......
...@@ -33,6 +33,7 @@ use OCP\BackgroundJob\IJobList; ...@@ -33,6 +33,7 @@ use OCP\BackgroundJob\IJobList;
use OCP\Http\Client\IClient; use OCP\Http\Client\IClient;
use OCP\Http\Client\IResponse; use OCP\Http\Client\IResponse;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\OCS\IDiscoveryService;
use Test\TestCase; use Test\TestCase;
class RequestSharedSecretTest extends TestCase { class RequestSharedSecretTest extends TestCase {
...@@ -55,6 +56,9 @@ class RequestSharedSecretTest extends TestCase { ...@@ -55,6 +56,9 @@ class RequestSharedSecretTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */ /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */
private $response; private $response;
/** @var \PHPUnit_Framework_MockObject_MockObject | IDiscoveryService */
private $discoveryService;
/** @var RequestSharedSecret */ /** @var RequestSharedSecret */
private $requestSharedSecret; private $requestSharedSecret;
...@@ -69,13 +73,17 @@ class RequestSharedSecretTest extends TestCase { ...@@ -69,13 +73,17 @@ class RequestSharedSecretTest extends TestCase {
$this->dbHandler = $this->getMockBuilder(DbHandler::class) $this->dbHandler = $this->getMockBuilder(DbHandler::class)
->disableOriginalConstructor()->getMock(); ->disableOriginalConstructor()->getMock();
$this->response = $this->getMockBuilder(IResponse::class)->getMock(); $this->response = $this->getMockBuilder(IResponse::class)->getMock();
$this->discoveryService = $this->getMockBuilder(IDiscoveryService::class)->getMock();
$this->discoveryService->expects($this->any())->method('discover')->willReturn([]);
$this->requestSharedSecret = new RequestSharedSecret( $this->requestSharedSecret = new RequestSharedSecret(
$this->httpClient, $this->httpClient,
$this->urlGenerator, $this->urlGenerator,
$this->jobList, $this->jobList,
$this->trustedServers, $this->trustedServers,
$this->dbHandler $this->dbHandler,
$this->discoveryService
); );
} }
...@@ -94,7 +102,8 @@ class RequestSharedSecretTest extends TestCase { ...@@ -94,7 +102,8 @@ class RequestSharedSecretTest extends TestCase {
$this->urlGenerator, $this->urlGenerator,
$this->jobList, $this->jobList,
$this->trustedServers, $this->trustedServers,
$this->dbHandler $this->dbHandler,
$this->discoveryService
] ]
)->setMethods(['parentExecute'])->getMock(); )->setMethods(['parentExecute'])->getMock();
$this->invokePrivate($requestSharedSecret, 'argument', [['url' => 'url']]); $this->invokePrivate($requestSharedSecret, 'argument', [['url' => 'url']]);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
*/ */
namespace OCA\Federation\Tests; namespace OCA\Federation\Tests;
use OC\OCS\DiscoveryService;
use OCA\Federation\DbHandler; use OCA\Federation\DbHandler;
use OCA\Federation\SyncFederationAddressBooks; use OCA\Federation\SyncFederationAddressBooks;
...@@ -32,7 +33,18 @@ class SyncFederationAddressbooksTest extends \Test\TestCase { ...@@ -32,7 +33,18 @@ class SyncFederationAddressbooksTest extends \Test\TestCase {
/** @var array */ /** @var array */
private $callBacks = []; private $callBacks = [];
function testSync() { /** @var \PHPUnit_Framework_MockObject_MockObject | DiscoveryService */
private $discoveryService;
public function setUp() {
parent::setUp();
$this->discoveryService = $this->getMockBuilder(DiscoveryService::class)
->disableOriginalConstructor()->getMock();
$this->discoveryService->expects($this->any())->method('discover')->willReturn([]);
}
public function testSync() {
/** @var DbHandler | \PHPUnit_Framework_MockObject_MockObject $dbHandler */ /** @var DbHandler | \PHPUnit_Framework_MockObject_MockObject $dbHandler */
$dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')-> $dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')->
disableOriginalConstructor()-> disableOriginalConstructor()->
...@@ -55,14 +67,14 @@ class SyncFederationAddressbooksTest extends \Test\TestCase { ...@@ -55,14 +67,14 @@ class SyncFederationAddressbooksTest extends \Test\TestCase {
->willReturn(1); ->willReturn(1);
/** @var \OCA\DAV\CardDAV\SyncService $syncService */ /** @var \OCA\DAV\CardDAV\SyncService $syncService */
$s = new SyncFederationAddressBooks($dbHandler, $syncService); $s = new SyncFederationAddressBooks($dbHandler, $syncService, $this->discoveryService);
$s->syncThemAll(function($url, $ex) { $s->syncThemAll(function($url, $ex) {
$this->callBacks[] = [$url, $ex]; $this->callBacks[] = [$url, $ex];
}); });
$this->assertEquals(1, count($this->callBacks)); $this->assertEquals(1, count($this->callBacks));
} }
function testException() { public function testException() {
/** @var DbHandler | \PHPUnit_Framework_MockObject_MockObject $dbHandler */ /** @var DbHandler | \PHPUnit_Framework_MockObject_MockObject $dbHandler */
$dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')-> $dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')->
disableOriginalConstructor()-> disableOriginalConstructor()->
...@@ -83,7 +95,7 @@ class SyncFederationAddressbooksTest extends \Test\TestCase { ...@@ -83,7 +95,7 @@ class SyncFederationAddressbooksTest extends \Test\TestCase {
->willThrowException(new \Exception('something did not work out')); ->willThrowException(new \Exception('something did not work out'));
/** @var \OCA\DAV\CardDAV\SyncService $syncService */ /** @var \OCA\DAV\CardDAV\SyncService $syncService */
$s = new SyncFederationAddressBooks($dbHandler, $syncService); $s = new SyncFederationAddressBooks($dbHandler, $syncService, $this->discoveryService);
$s->syncThemAll(function($url, $ex) { $s->syncThemAll(function($url, $ex) {
$this->callBacks[] = [$url, $ex]; $this->callBacks[] = [$url, $ex];
}); });
......
...@@ -92,17 +92,13 @@ class Application extends App { ...@@ -92,17 +92,13 @@ class Application extends App {
$container->registerService('ExternalManager', function (SimpleContainer $c) use ($server) { $container->registerService('ExternalManager', function (SimpleContainer $c) use ($server) {
$user = $server->getUserSession()->getUser(); $user = $server->getUserSession()->getUser();
$uid = $user ? $user->getUID() : null; $uid = $user ? $user->getUID() : null;
$discoveryManager = new DiscoveryManager(
\OC::$server->getMemCacheFactory(),
\OC::$server->getHTTPClientService()
);
return new \OCA\Files_Sharing\External\Manager( return new \OCA\Files_Sharing\External\Manager(
$server->getDatabaseConnection(), $server->getDatabaseConnection(),
\OC\Files\Filesystem::getMountManager(), \OC\Files\Filesystem::getMountManager(),
\OC\Files\Filesystem::getLoader(), \OC\Files\Filesystem::getLoader(),
$server->getHTTPClientService(), $server->getHTTPClientService(),
$server->getNotificationManager(), $server->getNotificationManager(),
$discoveryManager, $server->query(\OCP\OCS\IDiscoveryService::class),
$uid $uid
); );
}); });
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment