Merge pull request #21856 from owncloud/sync-federated-cloud-users-in-cron
Sync federated clouds using a cron job
This commit is contained in:
commit
c264f9362d
|
@ -25,7 +25,6 @@ $app = new Application();
|
|||
$app->registerHooks();
|
||||
|
||||
\OC::$server->registerService('CardDAVSyncService', function() use ($app) {
|
||||
|
||||
return $app->getSyncService();
|
||||
});
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
*/
|
||||
namespace OCA\Dav\AppInfo;
|
||||
|
||||
use OCA\DAV\CardDAV\CardDavBackend;
|
||||
use OCA\DAV\CardDAV\ContactsManager;
|
||||
use OCA\DAV\CardDAV\SyncJob;
|
||||
use OCA\DAV\CardDAV\SyncService;
|
||||
|
|
|
@ -28,6 +28,8 @@ use OCA\Federation\DAV\FedAuth;
|
|||
use OCA\Federation\DbHandler;
|
||||
use OCA\Federation\Hooks;
|
||||
use OCA\Federation\Middleware\AddServerMiddleware;
|
||||
use OCA\Federation\SyncFederationAddressBooks;
|
||||
use OCA\Federation\SyncJob;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use OCP\API;
|
||||
use OCP\App;
|
||||
|
@ -163,4 +165,18 @@ class Application extends \OCP\AppFramework\App {
|
|||
});
|
||||
}
|
||||
|
||||
public function setupCron() {
|
||||
$jl = $this->getContainer()->getServer()->getJobList();
|
||||
$jl->add(new SyncJob());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return SyncFederationAddressBooks
|
||||
*/
|
||||
public function getSyncService() {
|
||||
$syncService = \OC::$server->query('CardDAVSyncService');
|
||||
$dbHandler = $this->getContainer()->query('DbHandler');
|
||||
return new SyncFederationAddressBooks($dbHandler, $syncService);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<description>ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing.</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>Bjoern Schiessle</author>
|
||||
<version>0.0.2</version>
|
||||
<version>0.0.3</version>
|
||||
<namespace>Federation</namespace>
|
||||
<category>other</category>
|
||||
<dependencies>
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, 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/>
|
||||
*
|
||||
*/
|
||||
|
||||
$app = new \OCA\Federation\AppInfo\Application();
|
||||
$app->setupCron();
|
|
@ -1,8 +1,7 @@
|
|||
<?php
|
||||
|
||||
$dbConnection = \OC::$server->getDatabaseConnection();
|
||||
$l10n = \OC::$server->getL10N('federation');
|
||||
$dbHandler = new \OCA\Federation\DbHandler($dbConnection, $l10n);
|
||||
$app = new \OCA\Federation\AppInfo\Application();
|
||||
$syncService = $app->getSyncService();
|
||||
|
||||
/** @var Symfony\Component\Console\Application $application */
|
||||
$application->add(new \OCA\Federation\Command\SyncFederationAddressBooks($dbHandler));
|
||||
$application->add(new \OCA\Federation\Command\SyncFederationAddressBooks($syncService));
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, 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/>
|
||||
*
|
||||
*/
|
||||
|
||||
$app = new \OCA\Federation\AppInfo\Application();
|
||||
$app->setupCron();
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
namespace OCA\Federation\Command;
|
||||
|
||||
use OCA\DAV\CardDAV\SyncService;
|
||||
use OCA\Federation\DbHandler;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Helper\ProgressBar;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
|
@ -12,20 +10,16 @@ use Symfony\Component\Console\Output\OutputInterface;
|
|||
|
||||
class SyncFederationAddressBooks extends Command {
|
||||
|
||||
/** @var DbHandler */
|
||||
protected $dbHandler;
|
||||
|
||||
/** @var SyncService */
|
||||
/** @var \OCA\Federation\SyncFederationAddressBooks */
|
||||
private $syncService;
|
||||
|
||||
/**
|
||||
* @param DbHandler $dbHandler
|
||||
* @param \OCA\Federation\SyncFederationAddressBooks $syncService
|
||||
*/
|
||||
function __construct(DbHandler $dbHandler) {
|
||||
function __construct(\OCA\Federation\SyncFederationAddressBooks $syncService) {
|
||||
parent::__construct();
|
||||
|
||||
$this->syncService = \OC::$server->query('CardDAVSyncService');
|
||||
$this->dbHandler = $dbHandler;
|
||||
$this->syncService = $syncService;
|
||||
}
|
||||
|
||||
protected function configure() {
|
||||
|
@ -37,36 +31,23 @@ class SyncFederationAddressBooks extends Command {
|
|||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
||||
|
||||
$progress = new ProgressBar($output);
|
||||
$progress->start();
|
||||
$trustedServers = $this->dbHandler->getAllServer();
|
||||
foreach ($trustedServers as $trustedServer) {
|
||||
$progress->advance();
|
||||
$url = $trustedServer['url'];
|
||||
$sharedSecret = $trustedServer['shared_secret'];
|
||||
$syncToken = $trustedServer['sync_token'];
|
||||
|
||||
if (is_null($sharedSecret)) {
|
||||
continue;
|
||||
}
|
||||
$targetBookId = sha1($url);
|
||||
$targetPrincipal = "principals/system/system";
|
||||
$targetBookProperties = [
|
||||
'{DAV:}displayname' => $url
|
||||
];
|
||||
try {
|
||||
$newToken = $this->syncService->syncRemoteAddressBook($url, 'system', $sharedSecret, $syncToken, $targetPrincipal, $targetBookId, $targetBookProperties);
|
||||
if ($newToken !== $syncToken) {
|
||||
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
|
||||
}
|
||||
} catch (\Exception $ex) {
|
||||
$this->syncService->syncThemAll(function($url, $ex) use ($progress, $output) {
|
||||
if ($ex instanceof \Exception) {
|
||||
$output->writeln("Error while syncing $url : " . $ex->getMessage());
|
||||
} else {
|
||||
$progress->advance();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$progress->finish();
|
||||
$output->writeln('');
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
|
||||
namespace OCA\Federation;
|
||||
|
||||
use OCA\DAV\CardDAV\SyncService;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Helper\ProgressBar;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class SyncFederationAddressBooks {
|
||||
|
||||
/** @var DbHandler */
|
||||
protected $dbHandler;
|
||||
|
||||
/** @var SyncService */
|
||||
private $syncService;
|
||||
|
||||
/**
|
||||
* @param DbHandler $dbHandler
|
||||
* @param SyncService $syncService
|
||||
*/
|
||||
function __construct(DbHandler $dbHandler, SyncService $syncService) {
|
||||
$this->syncService = $syncService;
|
||||
$this->dbHandler = $dbHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Closure $callback
|
||||
*/
|
||||
public function syncThemAll(\Closure $callback) {
|
||||
|
||||
$trustedServers = $this->dbHandler->getAllServer();
|
||||
foreach ($trustedServers as $trustedServer) {
|
||||
$url = $trustedServer['url'];
|
||||
$callback($url, null);
|
||||
$sharedSecret = $trustedServer['shared_secret'];
|
||||
$syncToken = $trustedServer['sync_token'];
|
||||
|
||||
if (is_null($sharedSecret)) {
|
||||
continue;
|
||||
}
|
||||
$targetBookId = sha1($url);
|
||||
$targetPrincipal = "principals/system/system";
|
||||
$targetBookProperties = [
|
||||
'{DAV:}displayname' => $url
|
||||
];
|
||||
try {
|
||||
$newToken = $this->syncService->syncRemoteAddressBook($url, 'system', $sharedSecret, $syncToken, $targetPrincipal, $targetBookId, $targetBookProperties);
|
||||
if ($newToken !== $syncToken) {
|
||||
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
|
||||
}
|
||||
} catch (\Exception $ex) {
|
||||
$callback($url, $ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, 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\Federation;
|
||||
|
||||
use OC\BackgroundJob\TimedJob;
|
||||
use OCA\Federation\AppInfo\Application;
|
||||
|
||||
class SyncJob extends TimedJob {
|
||||
|
||||
public function __construct() {
|
||||
// Run once a day
|
||||
$this->setInterval(24 * 60 * 60);
|
||||
}
|
||||
|
||||
protected function run($argument) {
|
||||
$app = new Application();
|
||||
$ss = $app->getSyncService();
|
||||
$ss->syncThemAll(function($url, $ex) {
|
||||
if ($ex instanceof \Exception) {
|
||||
\OC::$server->getLogger()->error("Error while syncing $url : " . $ex->getMessage(), ['app' => 'fed-sync']);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
|
||||
namespace OCA\Federation\Tests\lib;
|
||||
|
||||
use OCA\Federation\DbHandler;
|
||||
use OCA\Federation\SyncFederationAddressBooks;
|
||||
|
||||
class SyncFederationAddressbooksTest extends \Test\TestCase {
|
||||
|
||||
/** @var array */
|
||||
private $callBacks = [];
|
||||
|
||||
function testSync() {
|
||||
/** @var DbHandler | \PHPUnit_Framework_MockObject_MockObject $dbHandler */
|
||||
$dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')->
|
||||
disableOriginalConstructor()->
|
||||
getMock();
|
||||
$dbHandler->method('getAllServer')->
|
||||
willReturn([
|
||||
[
|
||||
'url' => 'https://cloud.drop.box',
|
||||
'shared_secret' => 'iloveowncloud',
|
||||
'sync_token' => '0'
|
||||
]
|
||||
]);
|
||||
$dbHandler->expects($this->once())->method('setServerStatus')->
|
||||
with('https://cloud.drop.box', 1, '1');
|
||||
$syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$syncService->expects($this->once())->method('syncRemoteAddressBook')
|
||||
->willReturn(1);
|
||||
|
||||
$s = new SyncFederationAddressBooks($dbHandler, $syncService);
|
||||
$s->syncThemAll(function($url, $ex) {
|
||||
$this->callBacks[] = [$url, $ex];
|
||||
});
|
||||
$this->assertEquals(1, count($this->callBacks));
|
||||
}
|
||||
|
||||
function testException() {
|
||||
/** @var DbHandler | \PHPUnit_Framework_MockObject_MockObject $dbHandler */
|
||||
$dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')->
|
||||
disableOriginalConstructor()->
|
||||
getMock();
|
||||
$dbHandler->method('getAllServer')->
|
||||
willReturn([
|
||||
[
|
||||
'url' => 'https://cloud.drop.box',
|
||||
'shared_secret' => 'iloveowncloud',
|
||||
'sync_token' => '0'
|
||||
]
|
||||
]);
|
||||
$syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$syncService->expects($this->once())->method('syncRemoteAddressBook')
|
||||
->willThrowException(new \Exception('something did not work out'));
|
||||
|
||||
$s = new SyncFederationAddressBooks($dbHandler, $syncService);
|
||||
$s->syncThemAll(function($url, $ex) {
|
||||
$this->callBacks[] = [$url, $ex];
|
||||
});
|
||||
$this->assertEquals(2, count($this->callBacks));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue