Browse Source

start implementing federated sharing 2.0

Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
Bjoern Schiessle 6 years ago
parent
commit
5cfe20675d
25 changed files with 1461 additions and 3 deletions
  1. 1 0
      apps/federatedfilesharing/composer/composer/autoload_classmap.php
  2. 1 0
      apps/federatedfilesharing/composer/composer/autoload_static.php
  3. 8 0
      apps/federatedfilesharing/lib/AppInfo/Application.php
  4. 9 1
      apps/federatedfilesharing/lib/FederatedShareProvider.php
  5. 83 0
      apps/federatedfilesharing/lib/ocm/CloudFederationProvider.php
  6. 28 0
      core/routes.php
  7. 13 0
      lib/composer/composer/autoload_classmap.php
  8. 13 0
      lib/composer/composer/autoload_static.php
  9. 63 0
      lib/private/Federation/CloudFederationFactory.php
  10. 52 0
      lib/private/Federation/CloudFederationNotification.php
  11. 108 0
      lib/private/Federation/CloudFederationProviderManager.php
  12. 336 0
      lib/private/Federation/CloudFederationShare.php
  13. 38 0
      lib/private/Server.php
  14. 2 2
      lib/private/Share20/ProviderFactory.php
  15. 41 0
      lib/public/Federation/Exceptions/ProviderAlreadyExistsException.php
  16. 28 0
      lib/public/Federation/Exceptions/ProviderCouldNotAddShareException.php
  17. 40 0
      lib/public/Federation/Exceptions/ProviderDoesNotExistsException.php
  18. 29 0
      lib/public/Federation/Exceptions/ShareNotFoundException.php
  19. 55 0
      lib/public/Federation/ICloudFederationFactory.php
  20. 44 0
      lib/public/Federation/ICloudFederationNotification.php
  21. 81 0
      lib/public/Federation/ICloudFederationProvider.php
  22. 97 0
      lib/public/Federation/ICloudFederationProviderManager.php
  23. 233 0
      lib/public/Federation/ICloudFederationShare.php
  24. 19 0
      lib/public/IServerContainer.php
  25. 39 0
      ocm-provider/index.php

+ 1 - 0
apps/federatedfilesharing/composer/composer/autoload_classmap.php

@@ -14,6 +14,7 @@ return array(
     'OCA\\FederatedFileSharing\\FederatedShareProvider' => $baseDir . '/../lib/FederatedShareProvider.php',
     'OCA\\FederatedFileSharing\\Notifications' => $baseDir . '/../lib/Notifications.php',
     'OCA\\FederatedFileSharing\\Notifier' => $baseDir . '/../lib/Notifier.php',
+    'OCA\\FederatedFileSharing\\OCM\\CloudFederationProviderFiles' => $baseDir . '/../lib/ocm/CloudFederationProviderFiles.php',
     'OCA\\FederatedFileSharing\\Settings\\Admin' => $baseDir . '/../lib/Settings/Admin.php',
     'OCA\\FederatedFileSharing\\Settings\\Personal' => $baseDir . '/../lib/Settings/Personal.php',
     'OCA\\FederatedFileSharing\\Settings\\PersonalSection' => $baseDir . '/../lib/Settings/PersonalSection.php',

+ 1 - 0
apps/federatedfilesharing/composer/composer/autoload_static.php

@@ -29,6 +29,7 @@ class ComposerStaticInitFederatedFileSharing
         'OCA\\FederatedFileSharing\\FederatedShareProvider' => __DIR__ . '/..' . '/../lib/FederatedShareProvider.php',
         'OCA\\FederatedFileSharing\\Notifications' => __DIR__ . '/..' . '/../lib/Notifications.php',
         'OCA\\FederatedFileSharing\\Notifier' => __DIR__ . '/..' . '/../lib/Notifier.php',
+        'OCA\\FederatedFileSharing\\OCM\\CloudFederationProviderFiles' => __DIR__ . '/..' . '/../lib/ocm/CloudFederationProviderFiles.php',
         'OCA\\FederatedFileSharing\\Settings\\Admin' => __DIR__ . '/..' . '/../lib/Settings/Admin.php',
         'OCA\\FederatedFileSharing\\Settings\\Personal' => __DIR__ . '/..' . '/../lib/Settings/Personal.php',
         'OCA\\FederatedFileSharing\\Settings\\PersonalSection' => __DIR__ . '/..' . '/../lib/Settings/PersonalSection.php',

+ 8 - 0
apps/federatedfilesharing/lib/AppInfo/Application.php

@@ -32,6 +32,7 @@ use OCA\FederatedFileSharing\AddressHandler;
 use OCA\FederatedFileSharing\Controller\RequestHandlerController;
 use OCA\FederatedFileSharing\FederatedShareProvider;
 use OCA\FederatedFileSharing\Notifications;
+use OCA\FederatedFileSharing\OCM\CloudFederationProvider;
 use OCP\AppFramework\App;
 use OCP\GlobalScale\IConfig;
 
@@ -46,6 +47,13 @@ class Application extends App {
 		$container = $this->getContainer();
 		$server = $container->getServer();
 
+		$cloudFederationManager = $server->getCloudFederationProviderManager();
+		$cloudFederationManager->addCloudFederationProvider('file',
+			'Federated Files Sharing',
+			function() use ($container) {
+				return new CloudFederationProvider('file');
+			});
+
 		$container->registerService('RequestHandlerController', function(SimpleContainer $c) use ($server) {
 			$addressHandler = new AddressHandler(
 				$server->getURLGenerator(),

+ 9 - 1
apps/federatedfilesharing/lib/FederatedShareProvider.php

@@ -30,6 +30,7 @@
 namespace OCA\FederatedFileSharing;
 
 use OC\Share20\Share;
+use OCA\FederatedFileSharing\OCM\CloudFederationProvider;
 use OCP\Federation\ICloudIdManager;
 use OCP\DB\QueryBuilder\IQueryBuilder;
 use OCP\Files\Folder;
@@ -91,6 +92,9 @@ class FederatedShareProvider implements IShareProvider {
 	/** @var \OCP\GlobalScale\IConfig */
 	private $gsConfig;
 
+	/** @var CloudFederationProvider */
+	private $cloudFederationProvider;
+
 	/**
 	 * DefaultShareProvider constructor.
 	 *
@@ -105,6 +109,7 @@ class FederatedShareProvider implements IShareProvider {
 	 * @param IUserManager $userManager
 	 * @param ICloudIdManager $cloudIdManager
 	 * @param \OCP\GlobalScale\IConfig $globalScaleConfig
+	 * @param CloudFederationProvider $cloudFederationProvider
 	 */
 	public function __construct(
 			IDBConnection $connection,
@@ -117,7 +122,8 @@ class FederatedShareProvider implements IShareProvider {
 			IConfig $config,
 			IUserManager $userManager,
 			ICloudIdManager $cloudIdManager,
-			\OCP\GlobalScale\IConfig $globalScaleConfig
+			\OCP\GlobalScale\IConfig $globalScaleConfig,
+			CloudFederationProvider $cloudFederationProvider
 	) {
 		$this->dbConnection = $connection;
 		$this->addressHandler = $addressHandler;
@@ -130,6 +136,8 @@ class FederatedShareProvider implements IShareProvider {
 		$this->userManager = $userManager;
 		$this->cloudIdManager = $cloudIdManager;
 		$this->gsConfig = $globalScaleConfig;
+		$this->cloudFederationProvider = $cloudFederationProvider;
+
 	}
 
 	/**

+ 83 - 0
apps/federatedfilesharing/lib/ocm/CloudFederationProvider.php

@@ -0,0 +1,83 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\FederatedFileSharing\OCM;
+
+use OCP\Federation\ICloudFederationFactory;
+use OCP\Federation\ICloudFederationProvider;
+use OCP\Federation\ICloudFederationShare;
+
+class CloudFederationProvider implements ICloudFederationProvider {
+
+	/** @var string */
+	private $shareType;
+
+	/**
+	 * CloudFederationProvider constructor.
+	 *
+	 * @param string $shareType
+	 */
+	public function __construct($shareType) {
+		$this->shareType = $shareType;
+	}
+
+	/**
+	 * @return string
+	 */
+	public function getShareType() {
+		return $this->shareType;
+	}
+
+	/**
+	 * send new share to another server
+	 *
+	 * @since 14.0.0
+	 */
+	public function sendShare() {
+		// TODO: Implement sendShare() method.
+	}
+
+	/**
+	 * share received from another server
+	 *
+	 * @param ICloudFederationShare $share
+	 * @return string provider specific unique ID of the share
+	 *
+	 * @since 14.0.0
+	 */
+	public function shareReceived(ICloudFederationShare $share) {
+		// TODO: Implement shareReceived() method.
+	}
+
+	/**
+	 * notification received from another server
+	 *
+	 * @param string $id unique ID of a already existing share
+	 * @param array $notification provider specific notification
+	 *
+	 * @throws \OCP\Federation\Exceptions\ShareNotFoundException
+	 *
+	 * @since 14.0.0
+	 */
+	public function notificationReceived($id, $notification) {
+		// TODO: Implement notificationReceived() method.
+	}
+}

+ 28 - 0
core/routes.php

@@ -107,6 +107,34 @@ $this->create('spreed.pagecontroller.showCall', '/call/{token}')->action(functio
 	}
 });
 
+// OCM routes
+/**
+ * @suppress PhanUndeclaredClassConstant
+ * @suppress PhanUndeclaredClassMethod
+ */
+$this->create('cloud_federation_api.requesthandlercontroller.addShare', '/ocm/shares')->post()->action(function($urlParams) {
+	if (class_exists(\OCA\CloudFederationAPI\AppInfo\Application::class, false)) {
+		$app = new \OCA\CloudFederationAPI\AppInfo\Application($urlParams);
+		$app->dispatch('RequestHandlerController', 'addShare');
+	} else {
+		throw new \OC\HintException('Cloud Federation API not enabled');
+	}
+});
+
+/**
+ * @suppress PhanUndeclaredClassConstant
+ * @suppress PhanUndeclaredClassMethod
+ */
+$this->create('cloud_federation_api.requesthandlercontroller.receiveNotification', '/ocm/notifications')->post()->action(function($urlParams) {
+	if (class_exists(\OCA\CloudFederationAPI\AppInfo\Application::class, false)) {
+		$app = new \OCA\CloudFederationAPI\AppInfo\Application($urlParams);
+		$app->dispatch('RequestHandlerController', 'receiveNotification');
+	} else {
+		throw new \OC\HintException('Cloud Federation API not enabled');
+	}
+});
+
+
 // Sharing routes
 $this->create('files_sharing.sharecontroller.showShare', '/s/{token}')->action(function($urlParams) {
 	if (class_exists(\OCA\Files_Sharing\AppInfo\Application::class, false)) {

+ 13 - 0
lib/composer/composer/autoload_classmap.php

@@ -132,6 +132,15 @@ return array(
     'OCP\\Encryption\\IFile' => $baseDir . '/lib/public/Encryption/IFile.php',
     'OCP\\Encryption\\IManager' => $baseDir . '/lib/public/Encryption/IManager.php',
     'OCP\\Encryption\\Keys\\IStorage' => $baseDir . '/lib/public/Encryption/Keys/IStorage.php',
+    'OCP\\Federation\\Exceptions\\ProviderAlreadyExistsException' => $baseDir . '/lib/public/Federation/Exceptions/ProviderAlreadyExistsException.php',
+    'OCP\\Federation\\Exceptions\\ProviderCouldNotAddShareException' => $baseDir . '/lib/public/Federation/Exceptions/ProviderCouldNotAddShareException.php',
+    'OCP\\Federation\\Exceptions\\ProviderDoesNotExistsException' => $baseDir . '/lib/public/Federation/Exceptions/ProviderDoesNotExistsException.php',
+    'OCP\\Federation\\Exceptions\\ShareNotFoundException' => $baseDir . '/lib/public/Federation/Exceptions/ShareNotFoundException.php',
+    'OCP\\Federation\\ICloudFederationFactory' => $baseDir . '/lib/public/Federation/ICloudFederationFactory.php',
+    'OCP\\Federation\\ICloudFederationNotification' => $baseDir . '/lib/public/Federation/ICloudFederationNotification.php',
+    'OCP\\Federation\\ICloudFederationProvider' => $baseDir . '/lib/public/Federation/ICloudFederationProvider.php',
+    'OCP\\Federation\\ICloudFederationProviderManager' => $baseDir . '/lib/public/Federation/ICloudFederationProviderManager.php',
+    'OCP\\Federation\\ICloudFederationShare' => $baseDir . '/lib/public/Federation/ICloudFederationShare.php',
     'OCP\\Federation\\ICloudId' => $baseDir . '/lib/public/Federation/ICloudId.php',
     'OCP\\Federation\\ICloudIdManager' => $baseDir . '/lib/public/Federation/ICloudIdManager.php',
     'OCP\\Files' => $baseDir . '/lib/public/Files.php',
@@ -660,6 +669,10 @@ return array(
     'OC\\Encryption\\Manager' => $baseDir . '/lib/private/Encryption/Manager.php',
     'OC\\Encryption\\Update' => $baseDir . '/lib/private/Encryption/Update.php',
     'OC\\Encryption\\Util' => $baseDir . '/lib/private/Encryption/Util.php',
+    'OC\\Federation\\CloudFederationFactory' => $baseDir . '/lib/private/Federation/CloudFederationFactory.php',
+    'OC\\Federation\\CloudFederationNotification' => $baseDir . '/lib/private/Federation/CloudFederationNotification.php',
+    'OC\\Federation\\CloudFederationProviderManager' => $baseDir . '/lib/private/Federation/CloudFederationProviderManager.php',
+    'OC\\Federation\\CloudFederationShare' => $baseDir . '/lib/private/Federation/CloudFederationShare.php',
     'OC\\Federation\\CloudId' => $baseDir . '/lib/private/Federation/CloudId.php',
     'OC\\Federation\\CloudIdManager' => $baseDir . '/lib/private/Federation/CloudIdManager.php',
     'OC\\Files\\AppData\\AppData' => $baseDir . '/lib/private/Files/AppData/AppData.php',

+ 13 - 0
lib/composer/composer/autoload_static.php

@@ -162,6 +162,15 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OCP\\Encryption\\IFile' => __DIR__ . '/../../..' . '/lib/public/Encryption/IFile.php',
         'OCP\\Encryption\\IManager' => __DIR__ . '/../../..' . '/lib/public/Encryption/IManager.php',
         'OCP\\Encryption\\Keys\\IStorage' => __DIR__ . '/../../..' . '/lib/public/Encryption/Keys/IStorage.php',
+        'OCP\\Federation\\Exceptions\\ProviderAlreadyExistsException' => __DIR__ . '/../../..' . '/lib/public/Federation/Exceptions/ProviderAlreadyExistsException.php',
+        'OCP\\Federation\\Exceptions\\ProviderCouldNotAddShareException' => __DIR__ . '/../../..' . '/lib/public/Federation/Exceptions/ProviderCouldNotAddShareException.php',
+        'OCP\\Federation\\Exceptions\\ProviderDoesNotExistsException' => __DIR__ . '/../../..' . '/lib/public/Federation/Exceptions/ProviderDoesNotExistsException.php',
+        'OCP\\Federation\\Exceptions\\ShareNotFoundException' => __DIR__ . '/../../..' . '/lib/public/Federation/Exceptions/ShareNotFoundException.php',
+        'OCP\\Federation\\ICloudFederationFactory' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudFederationFactory.php',
+        'OCP\\Federation\\ICloudFederationNotification' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudFederationNotification.php',
+        'OCP\\Federation\\ICloudFederationProvider' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudFederationProvider.php',
+        'OCP\\Federation\\ICloudFederationProviderManager' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudFederationProviderManager.php',
+        'OCP\\Federation\\ICloudFederationShare' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudFederationShare.php',
         'OCP\\Federation\\ICloudId' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudId.php',
         'OCP\\Federation\\ICloudIdManager' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudIdManager.php',
         'OCP\\Files' => __DIR__ . '/../../..' . '/lib/public/Files.php',
@@ -690,6 +699,10 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\Encryption\\Manager' => __DIR__ . '/../../..' . '/lib/private/Encryption/Manager.php',
         'OC\\Encryption\\Update' => __DIR__ . '/../../..' . '/lib/private/Encryption/Update.php',
         'OC\\Encryption\\Util' => __DIR__ . '/../../..' . '/lib/private/Encryption/Util.php',
+        'OC\\Federation\\CloudFederationFactory' => __DIR__ . '/../../..' . '/lib/private/Federation/CloudFederationFactory.php',
+        'OC\\Federation\\CloudFederationNotification' => __DIR__ . '/../../..' . '/lib/private/Federation/CloudFederationNotification.php',
+        'OC\\Federation\\CloudFederationProviderManager' => __DIR__ . '/../../..' . '/lib/private/Federation/CloudFederationProviderManager.php',
+        'OC\\Federation\\CloudFederationShare' => __DIR__ . '/../../..' . '/lib/private/Federation/CloudFederationShare.php',
         'OC\\Federation\\CloudId' => __DIR__ . '/../../..' . '/lib/private/Federation/CloudId.php',
         'OC\\Federation\\CloudIdManager' => __DIR__ . '/../../..' . '/lib/private/Federation/CloudIdManager.php',
         'OC\\Files\\AppData\\AppData' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/AppData.php',

+ 63 - 0
lib/private/Federation/CloudFederationFactory.php

@@ -0,0 +1,63 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Federation;
+
+use OCP\Federation\ICloudFederationFactory;
+use OCP\Federation\ICloudFederationNotification;
+use OCP\Federation\ICloudFederationShare;
+
+class CloudFederationFactory implements ICloudFederationFactory {
+
+	/**
+	 * get a CloudFederationShare Object to prepare a share you want to send
+	 *
+	 * @param string $shareWith
+	 * @param string $name resource name (e.g. document.odt)
+	 * @param string $description share description (optional)
+	 * @param string $providerId resource UID on the provider side
+	 * @param string $owner provider specific UID of the user who owns the resource
+	 * @param string $ownerDisplayName display name of the user who shared the item
+	 * @param string $sharedBy provider specific UID of the user who shared the resource
+	 * @param $sharedByDisplayName display name of the user who shared the resource
+	 * @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]])
+	 * @param string $shareType ('group' or 'user' share)
+	 * @param $resourceType ('file', 'calendar',...)
+	 * @return ICloudFederationShare
+	 *
+	 * @since 14.0.0
+	 */
+	public function getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType) {
+		return new CloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType);
+	}
+
+	/**
+	 * get a Cloud FederationNotification object to prepare a notification you
+	 * want to send
+	 *
+	 * @return ICloudFederationNotification
+	 *
+	 * @since 14.0.0
+	 */
+	public function getCloudFederationNotification() {
+		return new CloudFederationNotification();
+	}
+}

+ 52 - 0
lib/private/Federation/CloudFederationNotification.php

@@ -0,0 +1,52 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Federation;
+
+use OCP\Federation\ICloudFederationNotification;
+
+class CloudFederationNotification implements ICloudFederationNotification {
+
+	private $message = [];
+
+	/**
+	 * add a message to the notification
+	 *
+	 * @param string $identifier
+	 * @param string $message
+	 *
+	 * @since 14.0.0
+	 */
+	public function setMessage($identifier, $message) {
+		$this->message[$identifier] = $message;
+	}
+
+	/**
+	 * get JSON encoded Message, ready to send out
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getMessage() {
+		return json_encode($this->message);
+	}
+}

+ 108 - 0
lib/private/Federation/CloudFederationProviderManager.php

@@ -0,0 +1,108 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\Federation;
+
+use OCP\Federation\Exceptions\ProviderAlreadyExistsException;
+use OCP\Federation\Exceptions\ProviderDoesNotExistsException;
+use OCP\Federation\ICloudFederationNotification;
+use OCP\Federation\ICloudFederationProvider;
+use OCP\Federation\ICloudFederationProviderManager;
+use OCP\Federation\ICloudFederationShare;
+
+/**
+ * Class Manager
+ *
+ * Manage Cloud Federation Providers
+ *
+ * @package OC\Federation
+ */
+class CloudFederationProviderManager implements ICloudFederationProviderManager {
+
+	/** @var array list of available cloud federation providers */
+	private $cloudFederationProvider;
+
+	public function __construct() {
+		$this->cloudFederationProvider= [];
+	}
+
+
+	/**
+	 * Registers an callback function which must return an cloud federation provider
+	 *
+	 * @param string $shareType which share type does the provider handles
+	 * @param string $displayName user facing name of the federated share provider
+	 * @param callable $callback
+	 */
+	public function addCloudFederationProvider($shareType, $displayName, callable $callback) {
+		\OC::$server->getRemoteApiFactory();
+
+		$this->cloudFederationProvider[$shareType] = [
+			'shareType' => $shareType,
+			'displayName' => $displayName,
+			'callback' => $callback,
+		];
+
+	}
+
+	/**
+	 * remove cloud federation provider
+	 *
+	 * @param string $providerId
+	 */
+	public function removeCloudFederationProvider($providerId) {
+		unset($this->cloudFederationProvider[$providerId]);
+	}
+
+	/**
+	 * get a list of all cloudFederationProviders
+	 *
+	 * @return array [id => ['id' => $id, 'displayName' => $displayName, 'callback' => callback]]
+	 */
+	public function getAllCloudFederationProviders() {
+		return $this->cloudFederationProvider;
+	}
+
+	/**
+	 * get a specific cloud federation provider
+	 *
+	 * @param string $shareType
+	 * @return ICloudFederationProvider
+	 * @throws ProviderDoesNotExistsException
+	 */
+	public function getCloudFederationProvider($shareType) {
+		if (isset($this->cloudFederationProvider[$shareType])) {
+			return call_user_func($this->cloudFederationProvider[$shareType]['callback']);
+		} else {
+			throw new ProviderDoesNotExistsException($shareType);
+		}
+	}
+
+	public function sendShare(ICloudFederationShare $share) {
+		// TODO: Implement sendShare() method.
+	}
+
+	public function sendNotification(ICloudFederationNotification $notification) {
+		// TODO: Implement sendNotification() method.
+	}
+
+}

+ 336 - 0
lib/private/Federation/CloudFederationShare.php

@@ -0,0 +1,336 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Federation;
+
+use OCP\Federation\ICloudFederationShare;
+
+class CloudFederationShare implements ICloudFederationShare {
+
+	private $share = [
+		'shareWith' => '',
+		'shareType' => '',
+		'name' => '',
+		'resourceType' => '',
+		'description' => '',
+		'providerId' => '',
+		'owner' => '',
+		'ownerDisplayName' => '',
+		'sharedBy' => '',
+		'sharedByDisplayName' => '',
+		'protocol' => []
+	];
+
+	/**
+	 * get a CloudFederationShare Object to prepare a share you want to send
+	 *
+	 * @param string $shareWith
+	 * @param string $name resource name (e.g. document.odt)
+	 * @param string $description share description (optional)
+	 * @param string $providerId resource UID on the provider side
+	 * @param string $owner provider specific UID of the user who owns the resource
+	 * @param string $ownerDisplayName display name of the user who shared the item
+	 * @param string $sharedBy provider specific UID of the user who shared the resource
+	 * @param string $sharedByDisplayName display name of the user who shared the resource
+	 * @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]])
+	 * @param string $shareType ('group' or 'user' share)
+	 * @param $resourceType ('file', 'calendar',...)
+	 *
+	 */
+	public function __construct($shareWith = '',
+								$name = '',
+								$description = '',
+								$providerId = '',
+								$owner = '',
+								$ownerDisplayName = '',
+								$sharedBy = '',
+								$sharedByDisplayName = '',
+								$protocol = [],
+								$shareType = '',
+								$resourceType = ''
+	) {
+		$this->setShareWith($shareWith);
+		$this->setResourceName($name);
+		$this->setDescription($description);
+		$this->setProviderId($providerId);
+		$this->setOwner($owner);
+		$this->setOwnerDisplayName($ownerDisplayName);
+		$this->setSharedBy($sharedBy);
+		$this->setSharedByDisplayName($sharedByDisplayName);
+		$this->setProtocol($protocol);
+		$this->setShareType($shareType);
+		$this->setResourceType($resourceType);
+
+	}
+
+	/**
+	 * set uid of the recipient
+	 *
+	 * @param string $user
+	 *
+	 * @since 14.0.0
+	 */
+	public function setShareWith($user) {
+		$this->share['shareWith'] = $user;
+	}
+
+	/**
+	 * set resource name (e.g. document.odt)
+	 *
+	 * @param string $name
+	 *
+	 * @since 14.0.0
+	 */
+	public function setResourceName($name) {
+		$this->share['name'] = $name;
+	}
+
+	/**
+	 * set resource type (e.g. file, calendar, contact,...)
+	 *
+	 * @param string $resourceType
+	 *
+	 * @since 14.0.0
+	 */
+	public function setResourceType($resourceType) {
+		$this->share['resourceType'] = $resourceType;
+	}
+
+	/**
+	 * set resource description (optional)
+	 *
+	 * @param string $description
+	 *
+	 * @since 14.0.0
+	 */
+	public function setDescription($description) {
+		$this->share['description'] = $description;
+	}
+
+	/**
+	 * set provider ID (e.g. file ID)
+	 *
+	 * @param string $providerId
+	 *
+	 * @since 14.0.0
+	 */
+	public function setProviderId($providerId) {
+		$this->share['providerId'] = $providerId;
+	}
+
+	/**
+	 * set owner UID
+	 *
+	 * @param string $owner
+	 *
+	 * @since 14.0.0
+	 */
+	public function setOwner($owner) {
+		$this->share['owner'] = $owner;
+	}
+
+	/**
+	 * set owner display name
+	 *
+	 * @param string $ownerDisplayName
+	 *
+	 * @since 14.0.0
+	 */
+	public function setOwnerDisplayName($ownerDisplayName) {
+		$this->share['ownerDisplayName'] = $ownerDisplayName;
+	}
+
+	/**
+	 * set UID of the user who sends the share
+	 *
+	 * @param string $sharedBy
+	 *
+	 * @since 14.0.0
+	 */
+	public function setSharedBy($sharedBy) {
+		$this->share['sharedBy'] = $sharedBy;
+	}
+
+	/**
+	 * set display name of the user who sends the share
+	 *
+	 * @param $sharedByDisplayName
+	 *
+	 * @since 14.0.0
+	 */
+	public function setSharedByDisplayName($sharedByDisplayName) {
+		$this->share['sharedByDisplayName'] = $sharedByDisplayName;
+	}
+
+	/**
+	 * set protocol specification
+	 *
+	 * @param array $protocol
+	 *
+	 * @since 14.0.0
+	 */
+	public function setProtocol(array $protocol) {
+		$this->share['protocol'] = $protocol;
+	}
+
+	/**
+	 * share type (group or user)
+	 *
+	 * @param string $shareType
+	 *
+	 * @since 14.0.0
+	 */
+	public function setShareType($shareType) {
+		$this->share['shareType'] = $shareType;
+	}
+
+	/**
+	 * get JSON encoded share, ready to send out
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getShare() {
+		return json_encode($this->share);
+	}
+
+	/**
+	 * get uid of the recipient
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getShareWith() {
+		return $this->share['shareWith'];
+	}
+
+	/**
+	 * get resource name (e.g. file, calendar, contact,...)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getResourceName() {
+		return $this->share['name'];
+	}
+
+	/**
+	 * get resource type (e.g. file, calendar, contact,...)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getResourceType() {
+		return $this->share['resourceType'];
+	}
+
+	/**
+	 * get resource description (optional)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getDescription() {
+		return $this->share['description'];
+	}
+
+	/**
+	 * get provider ID (e.g. file ID)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getProviderId() {
+		return $this->share['providerId'];
+	}
+
+	/**
+	 * get owner UID
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getOwner() {
+		return $this->share['owner'];
+	}
+
+	/**
+	 * get owner display name
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getOwnerDisplayName() {
+		return $this->share['ownerDisplayName'];
+	}
+
+	/**
+	 * get UID of the user who sends the share
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getSharedBy() {
+		return $this->share['sharedBy'];
+	}
+
+	/**
+	 * get display name of the user who sends the share
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getSharedByDisplayName() {
+		return $this->share['sharedByDisplayName'];
+	}
+
+	/**
+	 * get share type (group or user)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getShareType() {
+		return $this->share['shareType'];
+	}
+
+	/**
+	 * get protocol specification
+	 *
+	 * @return array
+	 *
+	 * @since 14.0.0
+	 */
+	public function getProtocol() {
+		return $this->share['protocol'];
+	}
+}

+ 38 - 0
lib/private/Server.php

@@ -68,6 +68,8 @@ use OC\Contacts\ContactsMenu\ActionFactory;
 use OC\Contacts\ContactsMenu\ContactsStore;
 use OC\Diagnostics\EventLogger;
 use OC\Diagnostics\QueryLogger;
+use OC\Federation\CloudFederationFactory;
+use OC\Federation\CloudFederationProviderManager;
 use OC\Federation\CloudIdManager;
 use OC\Files\Config\UserMountCache;
 use OC\Files\Config\UserMountCacheListener;
@@ -124,9 +126,12 @@ use OCP\Collaboration\AutoComplete\IManager;
 use OCP\Contacts\ContactsMenu\IContactsStore;
 use OCP\Defaults;
 use OCA\Theming\Util;
+use OCP\Federation\ICloudFederationFactory;
+use OCP\Federation\ICloudFederationProviderManager;
 use OCP\Federation\ICloudIdManager;
 use OCP\Authentication\LoginCredentials\IStore;
 use OCP\Files\NotFoundException;
+use OCP\GlobalScale\IConfig;
 use OCP\ICacheFactory;
 use OCP\IDBConnection;
 use OCP\IL10N;
@@ -1107,6 +1112,18 @@ class Server extends ServerContainer implements IServerContainer {
 			return new CloudIdManager();
 		});
 
+		$this->registerService(IConfig::class, function (Server $c) {
+			return new GlobalScale\Config($c->getConfig());
+		});
+
+		$this->registerService(ICloudFederationProviderManager::class, function (Server $c) {
+			return new CloudFederationProviderManager();
+		});
+
+		$this->registerService(ICloudFederationFactory::class, function (Server $c) {
+			return new CloudFederationFactory();
+		});
+
 		$this->registerAlias(\OCP\AppFramework\Utility\IControllerMethodReflector::class, \OC\AppFramework\Utility\ControllerMethodReflector::class);
 		$this->registerAlias('ControllerMethodReflector', \OCP\AppFramework\Utility\IControllerMethodReflector::class);
 
@@ -1973,6 +1990,20 @@ class Server extends ServerContainer implements IServerContainer {
 		return $this->query(ICloudIdManager::class);
 	}
 
+	/**
+	 * @return \OCP\GlobalScale\IConfig
+	 */
+	public function getGlobalScaleConfig() {
+		return $this->query(IConfig::class);
+	}
+
+	/**
+	 * @return \OCP\Federation\ICloudFederationProviderManager
+	 */
+	public function getCloudFederationProviderManager() {
+		return $this->query(ICloudFederationProviderManager::class);
+	}
+
 	/**
 	 * @return \OCP\Remote\Api\IApiFactory
 	 */
@@ -1980,6 +2011,13 @@ class Server extends ServerContainer implements IServerContainer {
 		return $this->query(IApiFactory::class);
 	}
 
+	/**
+	 * @return \OCP\Federation\ICloudFederationFactory
+	 */
+	public function getCloudFederationFactory() {
+		return $this->query(ICloudFederationFactory::class);
+	}
+
 	/**
 	 * @return \OCP\Remote\IInstanceFactory
 	 */

+ 2 - 2
lib/private/Share20/ProviderFactory.php

@@ -29,10 +29,10 @@
 namespace OC\Share20;
 
 use OC\CapabilitiesManager;
-use OC\GlobalScale\Config;
 use OCA\FederatedFileSharing\AddressHandler;
 use OCA\FederatedFileSharing\FederatedShareProvider;
 use OCA\FederatedFileSharing\Notifications;
+use OCA\FederatedFileSharing\OCM\CloudFederationProvider;
 use OCA\FederatedFileSharing\TokenHandler;
 use OCA\ShareByMail\Settings\SettingsManager;
 use OCA\ShareByMail\ShareByMailProvider;
@@ -133,7 +133,7 @@ class ProviderFactory implements IProviderFactory {
 				$this->serverContainer->getConfig(),
 				$this->serverContainer->getUserManager(),
 				$this->serverContainer->getCloudIdManager(),
-				$this->serverContainer->query(Config::class)
+				$this->serverContainer->getGlobalScaleConfig()
 			);
 		}
 

+ 41 - 0
lib/public/Federation/Exceptions/ProviderAlreadyExistsException.php

@@ -0,0 +1,41 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation\Exceptions;
+
+use OC\HintException;
+
+class ProviderAlreadyExistsException extends HintException {
+
+	/**
+	 * ProviderAlreadyExistsException constructor.
+	 *
+	 * @param string $newProviderId cloud federation provider ID of the new provider
+	 * @param string $existingProviderName name of cloud federation provider which already use the same ID
+	 */
+	public function __construct($newProviderId, $existingProviderName) {
+		$l = \OC::$server->getL10N('federation');
+		$message = 'Id "' . $newProviderId . '" already used by cloud federation provider "' . $existingProviderName . '"';
+		$hint = $l->t('Id "%s" already used by cloud federation provider "%s"', [$newProviderId, $existingProviderName]);
+		parent::__construct($message, $hint);
+	}
+
+}

+ 28 - 0
lib/public/Federation/Exceptions/ProviderCouldNotAddShareException.php

@@ -0,0 +1,28 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation\Exceptions;
+
+use OC\HintException;
+
+class ProviderCouldNotAddShareException extends HintException {
+
+}

+ 40 - 0
lib/public/Federation/Exceptions/ProviderDoesNotExistsException.php

@@ -0,0 +1,40 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation\Exceptions;
+
+use OC\HintException;
+
+class ProviderDoesNotExistsException extends HintException {
+
+	/**
+	 * ProviderDoesNotExistsException constructor.
+	 *
+	 * @param string $providerId cloud federation provider ID
+	 */
+	public function __construct($providerId) {
+		$l = \OC::$server->getL10N('federation');
+		$message = 'Cloud Federation Provider with ID: "' . $providerId . '" does not exist.';
+		$hint = $l->t('Cloud Federation Provider with ID: "%s" does not exist.', [$providerId]);
+		parent::__construct($message, $hint);
+	}
+
+}

+ 29 - 0
lib/public/Federation/Exceptions/ShareNotFoundException.php

@@ -0,0 +1,29 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation\Exceptions;
+
+
+use OC\HintException;
+
+class ShareNotFoundException extends HintException {
+
+}

+ 55 - 0
lib/public/Federation/ICloudFederationFactory.php

@@ -0,0 +1,55 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation;
+
+interface ICloudFederationFactory {
+
+	/**
+	 * get a CloudFederationShare Object to prepare a share you want to send
+	 *
+	 * @param string $shareWith
+	 * @param string $name resource name (e.g. document.odt)
+	 * @param string $description share description (optional)
+	 * @param string $providerId resource UID on the provider side
+	 * @param string $owner provider specific UID of the user who owns the resource
+	 * @param string $ownerDisplayName display name of the user who shared the item
+	 * @param string $sharedBy provider specific UID of the user who shared the resource
+	 * @param $sharedByDisplayName display name of the user who shared the resource
+	 * @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]])
+	 * @param string $shareType ('group' or 'user' share)
+	 * @param $resourceType ('file', 'calendar',...)
+	 * @return ICloudFederationShare
+	 *
+	 * @since 14.0.0
+	 */
+	public function getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType);
+
+	/**
+	 * get a Cloud FederationNotification object to prepare a notification you
+	 * want to send
+	 *
+	 * @return ICloudFederationNotification
+	 *
+	 * @since 14.0.0
+	 */
+	public function getCloudFederationNotification();
+}

+ 44 - 0
lib/public/Federation/ICloudFederationNotification.php

@@ -0,0 +1,44 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation;
+
+interface ICloudFederationNotification {
+
+	/**
+	 * add a message to the notification
+	 *
+	 * @param string $identifier
+	 * @param string $message
+	 *
+	 * @since 14.0.0
+	 */
+	public function setMessage($identifier, $message);
+
+	/**
+	 * get JSON encoded Message, ready to send out
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getMessage();
+}

+ 81 - 0
lib/public/Federation/ICloudFederationProvider.php

@@ -0,0 +1,81 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation;
+
+use OCP\Federation\Exceptions\ShareNotFoundException;
+
+/**
+ * Interface ICloudFederationProvider
+ *
+ * Enable apps to create their own cloud federation provider
+ *
+ * @since 14.0.0
+ *
+ * @package OCP\Federation
+ */
+
+interface ICloudFederationProvider {
+
+	/**
+	 * ICloudFederationProvider constructor.
+	 *
+	 * @param $shareType define the share type, handled by this provider
+	 */
+	public function __construct($shareType);
+
+	/**
+	 * get the name of the share type, handled by this provider
+	 *
+	 * @return string
+	 */
+	public function getShareType();
+
+	/**
+	 * send new share to another server
+	 *
+	 * @since 14.0.0
+	 */
+	public function sendShare();
+
+	/**
+	 * share received from another server
+	 *
+	 * @param ICloudFederationShare $share
+	 * @return string provider specific unique ID of the share
+	 *
+	 * @since 14.0.0
+	 */
+	public function shareReceived(ICloudFederationShare $share);
+
+	/**
+	 * notification received from another server
+	 *
+	 * @param string $id unique ID of a already existing share
+	 * @param array $notification provider specific notification
+	 *
+	 * @throws ShareNotFoundException
+	 *
+	 * @since 14.0.0
+	 */
+	public function notificationReceived($id, $notification);
+
+}

+ 97 - 0
lib/public/Federation/ICloudFederationProviderManager.php

@@ -0,0 +1,97 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation;
+
+/**
+ * Class ICloudFederationProviderManager
+ *
+ * Manage cloud federation providers
+ *
+ * @since 14.0.0
+ *
+ * @package OCP\Federation
+ */
+interface ICloudFederationProviderManager {
+
+	/**
+	 * Registers an callback function which must return an cloud federation provider
+	 *
+	 * @param string $shareType which share type does the provider handles
+	 * @param string $displayName user facing name of the federated share provider
+	 * @param callable $callback
+	 * @throws Exceptions\ProviderAlreadyExistsException
+	 *
+	 * @since 14.0.0
+	 */
+	public function addCloudFederationProvider($shareType, $displayName, callable $callback);
+
+	/**
+	 * remove cloud federation provider
+	 *
+	 * @param string $shareType
+	 *
+	 * @since 14.0.0
+	 */
+	public function removeCloudFederationProvider($shareType);
+
+	/**
+	 * get a list of all cloudFederationProviders
+	 *
+	 * @return array [id => ['id' => $id, 'displayName' => $displayName, 'callback' => callback]]
+	 *
+	 * @since 14.0.0
+	 */
+	public function getAllCloudFederationProviders();
+
+	/**
+	 * get a specific cloud federation provider
+	 *
+	 * @param string $shareType
+	 * @return ICloudFederationProvider
+	 * @throws Exceptions\ProviderDoesNotExistsException;
+	 *
+	 * @since 14.0.0
+	 */
+	public function getCloudFederationProvider($shareType);
+
+	/**
+	 * send federated share
+	 *
+	 * @param ICloudFederationShare $share
+	 * @return mixed
+	 *
+	 * @since 14.0.0
+	 */
+	public function sendShare(ICloudFederationShare $share);
+
+	/**
+	 * send notification about existing share
+	 *
+	 * @param ICloudFederationNotification $notification
+	 * @return mixed
+	 *
+	 * @since 14.0.0
+	 */
+	public function sendNotification(ICloudFederationNotification $notification);
+
+
+}

+ 233 - 0
lib/public/Federation/ICloudFederationShare.php

@@ -0,0 +1,233 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Federation;
+
+interface ICloudFederationShare {
+
+	/**
+	 * set uid of the recipient
+	 *
+	 * @param string $user
+	 *
+	 * @since 14.0.0
+	 */
+	public function setShareWith($user);
+
+	/**
+	 * set resource name (e.g. file, calendar, contact,...)
+	 *
+	 * @param string $name
+	 *
+	 * @since 14.0.0
+	 */
+	public function setResourceName($name);
+
+	/**
+	 * set resource type (e.g. file, calendar, contact,...)
+	 *
+	 * @param string $resourceType
+	 *
+	 * @since 14.0.0
+	 */
+	public function setResourceType($resourceType);
+
+	/**
+	 * set resource description (optional)
+	 *
+	 * @param string $description
+	 *
+	 * @since 14.0.0
+	 */
+	public function setDescription($description);
+
+	/**
+	 * set provider ID (e.g. file ID)
+	 *
+	 * @param string $providerId
+	 *
+	 * @since 14.0.0
+	 */
+	public function setProviderId($providerId);
+
+	/**
+	 * set owner UID
+	 *
+	 * @param string $owner
+	 *
+	 * @since 14.0.0
+	 */
+	public function setOwner($owner);
+
+	/**
+	 * set owner display name
+	 *
+	 * @param string $ownerDisplayName
+	 *
+	 * @since 14.0.0
+	 */
+	public function setOwnerDisplayName($ownerDisplayName);
+
+	/**
+	 * set UID of the user who sends the share
+	 *
+	 * @param string $sharedBy
+	 *
+	 * @since 14.0.0
+	 */
+	public function setSharedBy($sharedBy);
+
+	/**
+	 * set display name of the user who sends the share
+	 *
+	 * @param $sharedByDisplayName
+	 *
+	 * @since 14.0.0
+	 */
+	public function setSharedByDisplayName($sharedByDisplayName);
+
+	/**
+	 * set protocol specification
+	 *
+	 * @param array $protocol
+	 *
+	 * @since 14.0.0
+	 */
+	public function setProtocol(array $protocol);
+
+	/**
+	 * share type (group or user)
+	 *
+	 * @param string $shareType
+	 *
+	 * @since 14.0.0
+	 */
+	public function setShareType($shareType);
+
+	/**
+	 * get JSON encoded share, ready to send out
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getShare();
+
+	/**
+	 * get uid of the recipient
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getShareWith();
+
+	/**
+	 * get resource name (e.g. file, calendar, contact,...)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getResourceName();
+
+	/**
+	 * get resource type (e.g. file, calendar, contact,...)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getResourceType();
+
+	/**
+	 * get resource description (optional)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getDescription();
+
+	/**
+	 * get provider ID (e.g. file ID)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getProviderId();
+
+	/**
+	 * get owner UID
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getOwner();
+
+	/**
+	 * get owner display name
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getOwnerDisplayName();
+
+	/**
+	 * get UID of the user who sends the share
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getSharedBy();
+
+	/**
+	 * get display name of the user who sends the share
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getSharedByDisplayName();
+
+	/**
+	 * get share type (group or user)
+	 *
+	 * @return string
+	 *
+	 * @since 14.0.0
+	 */
+	public function getShareType();
+
+	/**
+	 * get protocol specification
+	 *
+	 * @return array
+	 *
+	 * @since 14.0.0
+	 */
+	public function getProtocol();
+
+}

+ 19 - 0
lib/public/IServerContainer.php

@@ -45,6 +45,8 @@
 // This means that they should be used by apps instead of the internal ownCloud classes
 namespace OCP;
 use OCP\Log\ILogFactory;
+use OCP\Federation\ICloudFederationFactory;
+use OCP\Federation\ICloudFederationProviderManager;
 use OCP\Security\IContentSecurityPolicyManager;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
@@ -553,6 +555,23 @@ interface IServerContainer extends IContainer {
 	 */
 	public function getCloudIdManager();
 
+	/**
+	 * @return \OCP\GlobalScale\IConfig
+	 */
+	public function getGlobalScaleConfig();
+
+	/**
+	 * @return ICloudFederationFactory
+	 * @since 14.0.0
+	 */
+	public function getCloudFederationFactory();
+
+	/**
+	 * @return ICloudFederationProviderManager
+	 * @since 14.0.0
+	 */
+	public function getCloudFederationProviderManager();
+
 	/**
 	 * @return \OCP\Remote\Api\IApiFactory
 	 * @since 13.0.0

+ 39 - 0
ocm-provider/index.php

@@ -0,0 +1,39 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+require_once __DIR__ . '/../lib/base.php';
+
+header('Content-Type: application/json');
+
+$server = \OC::$server;
+
+$isEnabled = $server->getAppManager()->isEnabledForUser('cloud_federation_api');
+
+if ($isEnabled) {
+	$capabilities = new OCA\CloudFederationAPI\Capabilities($server->getURLGenerator());
+	header('Content-Type: application/json');
+	echo json_encode($capabilities->getCapabilities()['ocm']);
+} else {
+	header($_SERVER["SERVER_PROTOCOL"]." 501 Not Implemented", true, 501);
+	exit("501 Not Implemented");
+}
+