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();
|
$app->registerHooks();
|
||||||
|
|
||||||
\OC::$server->registerService('CardDAVSyncService', function() use ($app) {
|
\OC::$server->registerService('CardDAVSyncService', function() use ($app) {
|
||||||
|
|
||||||
return $app->getSyncService();
|
return $app->getSyncService();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
*/
|
*/
|
||||||
namespace OCA\Dav\AppInfo;
|
namespace OCA\Dav\AppInfo;
|
||||||
|
|
||||||
use OCA\DAV\CardDAV\CardDavBackend;
|
|
||||||
use OCA\DAV\CardDAV\ContactsManager;
|
use OCA\DAV\CardDAV\ContactsManager;
|
||||||
use OCA\DAV\CardDAV\SyncJob;
|
use OCA\DAV\CardDAV\SyncJob;
|
||||||
use OCA\DAV\CardDAV\SyncService;
|
use OCA\DAV\CardDAV\SyncService;
|
||||||
|
|
|
@ -28,6 +28,8 @@ use OCA\Federation\DAV\FedAuth;
|
||||||
use OCA\Federation\DbHandler;
|
use OCA\Federation\DbHandler;
|
||||||
use OCA\Federation\Hooks;
|
use OCA\Federation\Hooks;
|
||||||
use OCA\Federation\Middleware\AddServerMiddleware;
|
use OCA\Federation\Middleware\AddServerMiddleware;
|
||||||
|
use OCA\Federation\SyncFederationAddressBooks;
|
||||||
|
use OCA\Federation\SyncJob;
|
||||||
use OCA\Federation\TrustedServers;
|
use OCA\Federation\TrustedServers;
|
||||||
use OCP\API;
|
use OCP\API;
|
||||||
use OCP\App;
|
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>
|
<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>
|
<licence>AGPL</licence>
|
||||||
<author>Bjoern Schiessle</author>
|
<author>Bjoern Schiessle</author>
|
||||||
<version>0.0.2</version>
|
<version>0.0.3</version>
|
||||||
<namespace>Federation</namespace>
|
<namespace>Federation</namespace>
|
||||||
<category>other</category>
|
<category>other</category>
|
||||||
<dependencies>
|
<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
|
<?php
|
||||||
|
|
||||||
$dbConnection = \OC::$server->getDatabaseConnection();
|
$app = new \OCA\Federation\AppInfo\Application();
|
||||||
$l10n = \OC::$server->getL10N('federation');
|
$syncService = $app->getSyncService();
|
||||||
$dbHandler = new \OCA\Federation\DbHandler($dbConnection, $l10n);
|
|
||||||
|
|
||||||
/** @var Symfony\Component\Console\Application $application */
|
/** @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;
|
namespace OCA\Federation\Command;
|
||||||
|
|
||||||
use OCA\DAV\CardDAV\SyncService;
|
|
||||||
use OCA\Federation\DbHandler;
|
use OCA\Federation\DbHandler;
|
||||||
use OCA\Federation\TrustedServers;
|
|
||||||
use Symfony\Component\Console\Command\Command;
|
use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Helper\ProgressBar;
|
use Symfony\Component\Console\Helper\ProgressBar;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
@ -12,20 +10,16 @@ use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
class SyncFederationAddressBooks extends Command {
|
class SyncFederationAddressBooks extends Command {
|
||||||
|
|
||||||
/** @var DbHandler */
|
/** @var \OCA\Federation\SyncFederationAddressBooks */
|
||||||
protected $dbHandler;
|
|
||||||
|
|
||||||
/** @var SyncService */
|
|
||||||
private $syncService;
|
private $syncService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param DbHandler $dbHandler
|
* @param \OCA\Federation\SyncFederationAddressBooks $syncService
|
||||||
*/
|
*/
|
||||||
function __construct(DbHandler $dbHandler) {
|
function __construct(\OCA\Federation\SyncFederationAddressBooks $syncService) {
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
|
|
||||||
$this->syncService = \OC::$server->query('CardDAVSyncService');
|
$this->syncService = $syncService;
|
||||||
$this->dbHandler = $dbHandler;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function configure() {
|
protected function configure() {
|
||||||
|
@ -37,36 +31,23 @@ class SyncFederationAddressBooks extends Command {
|
||||||
/**
|
/**
|
||||||
* @param InputInterface $input
|
* @param InputInterface $input
|
||||||
* @param OutputInterface $output
|
* @param OutputInterface $output
|
||||||
|
* @return int
|
||||||
*/
|
*/
|
||||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
protected function execute(InputInterface $input, OutputInterface $output) {
|
||||||
|
|
||||||
$progress = new ProgressBar($output);
|
$progress = new ProgressBar($output);
|
||||||
$progress->start();
|
$progress->start();
|
||||||
$trustedServers = $this->dbHandler->getAllServer();
|
$this->syncService->syncThemAll(function($url, $ex) use ($progress, $output) {
|
||||||
foreach ($trustedServers as $trustedServer) {
|
if ($ex instanceof \Exception) {
|
||||||
$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) {
|
|
||||||
$output->writeln("Error while syncing $url : " . $ex->getMessage());
|
$output->writeln("Error while syncing $url : " . $ex->getMessage());
|
||||||
|
} else {
|
||||||
|
$progress->advance();
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
$progress->finish();
|
$progress->finish();
|
||||||
$output->writeln('');
|
$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