Merge pull request #20692 from owncloud/federation_auto_add_servers

auto-add ownClouds to the list of trusted servers
This commit is contained in:
Thomas Müller 2015-11-24 16:19:39 +01:00
commit 4bb346a1e6
8 changed files with 175 additions and 5 deletions

View File

@ -23,3 +23,4 @@ namespace OCA\Federation\AppInfo;
$app = new Application();
$app->registerSettings();
$app->registerHooks();

View File

@ -22,14 +22,15 @@
namespace OCA\Federation\AppInfo;
use OCA\Federation\API\OCSAuthAPI;
use OCA\Federation\Controller\AuthController;
use OCA\Federation\Controller\SettingsController;
use OCA\Federation\DbHandler;
use OCA\Federation\Hooks;
use OCA\Federation\Middleware\AddServerMiddleware;
use OCA\Federation\TrustedServers;
use OCP\API;
use OCP\App;
use OCP\AppFramework\IAppContainer;
use OCP\Util;
class Application extends \OCP\AppFramework\App {
@ -127,4 +128,21 @@ class Application extends \OCP\AppFramework\App {
}
/**
* listen to federated_share_added hooks to auto-add new servers to the
* list of trusted servers.
*/
public function registerHooks() {
$container = $this->getContainer();
$hooksManager = new Hooks($container->query('TrustedServers'));
Util::connectHook(
'OCP\Share',
'federated_share_added',
$hooksManager,
'addServerHook'
);
}
}

View File

@ -68,6 +68,7 @@ class DbHandler {
*/
public function addServer($url) {
$hash = $this->hash($url);
$url = rtrim($url, '/');
$query = $this->connection->getQueryBuilder();
$query->insert($this->dbTable)
->values(

View File

@ -0,0 +1,50 @@
<?php
/**
* @author Björn Schießle <schiessle@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\Federation;
class Hooks {
/** @var TrustedServers */
private $trustedServers;
public function __construct(TrustedServers $trustedServers) {
$this->trustedServers = $trustedServers;
}
/**
* add servers to the list of trusted servers once a federated share was established
*
* @param array $params
*/
public function addServerHook($params) {
if (
$this->trustedServers->getAutoAddServers() === true &&
$this->trustedServers->isTrustedServer($params['server']) === false
) {
$this->trustedServers->addServer($params['server']);
}
}
}

View File

@ -67,17 +67,33 @@ class DbHandlerTest extends TestCase {
$query->execute();
}
public function testAddServer() {
$id = $this->dbHandler->addServer('server1');
/**
* @dataProvider dataTestAddServer
*
* @param string $url passed to the method
* @param string $expectedUrl the url we expect to be written to the db
* @param string $expectedHash the hash value we expect to be written to the db
*/
public function testAddServer($url, $expectedUrl, $expectedHash) {
$id = $this->dbHandler->addServer($url);
$query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable);
$result = $query->execute()->fetchAll();
$this->assertSame(1, count($result));
$this->assertSame('server1', $result[0]['url']);
$this->assertSame($expectedUrl, $result[0]['url']);
$this->assertSame($id, (int)$result[0]['id']);
$this->assertSame($expectedHash, $result[0]['url_hash']);
$this->assertSame(TrustedServers::STATUS_PENDING, (int)$result[0]['status']);
}
public function dataTestAddServer() {
return [
['http://owncloud.org', 'http://owncloud.org', md5('owncloud.org')],
['https://owncloud.org', 'https://owncloud.org', md5('owncloud.org')],
['http://owncloud.org/', 'http://owncloud.org', md5('owncloud.org')],
];
}
public function testRemove() {
$id1 = $this->dbHandler->addServer('server1');
$id2 = $this->dbHandler->addServer('server2');

View File

@ -0,0 +1,79 @@
<?php
/**
* @author Björn Schießle <schiessle@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\Federation\Tests\lib;
use OCA\Federation\Hooks;
use OCA\Federation\TrustedServers;
use Test\TestCase;
class HooksTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */
private $trustedServers;
/** @var Hooks */
private $hooks;
public function setUp() {
parent::setUp();
$this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers')
->disableOriginalConstructor()->getMock();
$this->hooks = new Hooks($this->trustedServers);
}
/**
* @dataProvider dataTestAddServerHook
*
* @param bool $autoAddEnabled is auto-add enabled
* @param bool $isTrustedServer is the server already in the list of trusted servers
* @param bool $addServer should the server be added
*/
public function testAddServerHook($autoAddEnabled, $isTrustedServer, $addServer) {
$this->trustedServers->expects($this->any())->method('getAutoAddServers')
->willReturn($autoAddEnabled);
$this->trustedServers->expects($this->any())->method('isTrustedServer')
->with('url')->willReturn($isTrustedServer);
if ($addServer) {
$this->trustedServers->expects($this->once())->method('addServer')
->with('url');
} else {
$this->trustedServers->expects($this->never())->method('addServer');
}
$this->hooks->addServerHook(['server' => 'url']);
}
public function dataTestAddServerHook() {
return [
[true, true, false],
[false, true, false],
[true, false, true],
[false, false, false],
];
}
}

View File

@ -192,6 +192,8 @@ class Manager {
$acceptShare->execute(array(1, $mountPoint, $hash, $id, $this->uid));
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'accept');
\OC_Hook::emit('OCP\Share', 'federated_share_added', ['server' => $share['remote']]);
//FIXME $this->scrapNotification($share['remote_id']);
return true;
}

View File

@ -2566,7 +2566,10 @@ class Share extends Constants {
$result = self::tryHttpPost($url, $fields);
$status = json_decode($result['result'], true);
return ($result['success'] && $status['ocs']['meta']['statuscode'] === 100);
if ($result['success'] && $status['ocs']['meta']['statuscode'] === 100) {
\OC_Hook::emit('OCP\Share', 'federated_share_added', ['server' => $remote]);
return true;
}
}