Merge pull request #20692 from owncloud/federation_auto_add_servers
auto-add ownClouds to the list of trusted servers
This commit is contained in:
commit
4bb346a1e6
|
@ -23,3 +23,4 @@ namespace OCA\Federation\AppInfo;
|
|||
|
||||
$app = new Application();
|
||||
$app->registerSettings();
|
||||
$app->registerHooks();
|
||||
|
|
|
@ -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'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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');
|
||||
|
|
|
@ -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],
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue