From 964fa1fce3bc7734b6f7435f730e3b7394fc1cbf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= <bjoern@schiessle.org>
Date: Mon, 23 Nov 2015 17:01:53 +0100
Subject: [PATCH] use hooks to auto add server to the list of trusted servers
 once a federated share was created

---
 apps/federation/appinfo/app.php             |  1 +
 apps/federation/appinfo/application.php     | 19 +++++
 apps/federation/lib/hooks.php               | 50 +++++++++++++
 apps/federation/tests/lib/hookstest.php     | 79 +++++++++++++++++++++
 apps/files_sharing/lib/external/manager.php |  2 +
 lib/private/share/share.php                 |  5 +-
 6 files changed, 155 insertions(+), 1 deletion(-)
 create mode 100644 apps/federation/lib/hooks.php
 create mode 100644 apps/federation/tests/lib/hookstest.php

diff --git a/apps/federation/appinfo/app.php b/apps/federation/appinfo/app.php
index 9ed00f23866..8cc77885d6f 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 350b140b4dd..5be23253209 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 00000000000..4bf5be4e5b6
--- /dev/null
+++ b/apps/federation/lib/hooks.php
@@ -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']);
+		}
+	}
+
+}
diff --git a/apps/federation/tests/lib/hookstest.php b/apps/federation/tests/lib/hookstest.php
new file mode 100644
index 00000000000..5b19c167456
--- /dev/null
+++ b/apps/federation/tests/lib/hookstest.php
@@ -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],
+		];
+	}
+}
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 93e2cdb540b..020f55c5157 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 6aac0d6264d..1308c99f804 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;
+			}
 
 		}
 
-- 
GitLab