diff --git a/apps/federation/appinfo/app.php b/apps/federation/appinfo/app.php index 9ed00f2386..8cc77885d6 100644 --- a/apps/federation/appinfo/app.php +++ b/apps/federation/appinfo/app.php @@ -23,3 +23,4 @@ namespace OCA\Federation\AppInfo; $app = new Application(); $app->registerSettings(); +$app->registerHooks(); diff --git a/apps/federation/appinfo/application.php b/apps/federation/appinfo/application.php index 350b140b4d..5be2325320 100644 --- a/apps/federation/appinfo/application.php +++ b/apps/federation/appinfo/application.php @@ -25,11 +25,13 @@ 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 +129,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' + ); + } + } diff --git a/apps/federation/lib/hooks.php b/apps/federation/lib/hooks.php new file mode 100644 index 0000000000..4bf5be4e5b --- /dev/null +++ b/apps/federation/lib/hooks.php @@ -0,0 +1,50 @@ + + * + * @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 + * + */ + + +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']); + } + } + +} diff --git a/apps/federation/tests/lib/hookstest.php b/apps/federation/tests/lib/hookstest.php new file mode 100644 index 0000000000..5b19c16745 --- /dev/null +++ b/apps/federation/tests/lib/hookstest.php @@ -0,0 +1,79 @@ + + * + * @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 + * + */ + + +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], + ]; + } +} diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php index 93e2cdb540..020f55c515 100644 --- a/apps/files_sharing/lib/external/manager.php +++ b/apps/files_sharing/lib/external/manager.php @@ -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; } diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 6aac0d6264..1308c99f80 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -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; + } }