aboutsummaryrefslogtreecommitdiffstats
path: root/apps/cloud_federation_api/lib/Capabilities.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/cloud_federation_api/lib/Capabilities.php')
-rw-r--r--apps/cloud_federation_api/lib/Capabilities.php101
1 files changed, 57 insertions, 44 deletions
diff --git a/apps/cloud_federation_api/lib/Capabilities.php b/apps/cloud_federation_api/lib/Capabilities.php
index cd1ce5dd359..599733123b3 100644
--- a/apps/cloud_federation_api/lib/Capabilities.php
+++ b/apps/cloud_federation_api/lib/Capabilities.php
@@ -1,65 +1,78 @@
<?php
+
+declare(strict_types=1);
+
/**
- * @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
- *
- * @author 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/>.
- *
+ * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\CloudFederationAPI;
+use NCU\Security\Signature\Exceptions\IdentityNotFoundException;
+use NCU\Security\Signature\Exceptions\SignatoryException;
+use OC\OCM\OCMSignatoryManager;
use OCP\Capabilities\ICapability;
+use OCP\Capabilities\IInitialStateExcludedCapability;
+use OCP\IAppConfig;
use OCP\IURLGenerator;
+use OCP\OCM\Exceptions\OCMArgumentException;
+use OCP\OCM\ICapabilityAwareOCMProvider;
+use Psr\Log\LoggerInterface;
-class Capabilities implements ICapability {
+class Capabilities implements ICapability, IInitialStateExcludedCapability {
+ public const API_VERSION = '1.1.0';
- /** @var IURLGenerator */
- private $urlGenerator;
-
- public function __construct(IURLGenerator $urlGenerator) {
- $this->urlGenerator = $urlGenerator;
+ public function __construct(
+ private IURLGenerator $urlGenerator,
+ private IAppConfig $appConfig,
+ private ICapabilityAwareOCMProvider $provider,
+ private readonly OCMSignatoryManager $ocmSignatoryManager,
+ private readonly LoggerInterface $logger,
+ ) {
}
/**
* Function an app uses to return the capabilities
*
- * @return array Array containing the apps capabilities
- * @since 8.2.0
+ * @return array<string, array<string, mixed>>
+ * @throws OCMArgumentException
*/
public function getCapabilities() {
$url = $this->urlGenerator->linkToRouteAbsolute('cloud_federation_api.requesthandlercontroller.addShare');
- $capabilities = ['ocm' =>
- [
- 'enabled' => true,
- 'apiVersion' => '1.0-proposal1',
- 'endPoint' => substr($url, 0, strrpos($url, '/')),
- 'resourceTypes' => [
- [
- 'name' => 'file',
- 'shareTypes' => ['user', 'group'],
- 'protocols' => [
- 'webdav' => '/public.php/webdav/',
- ]
- ],
- ]
- ]
- ];
+ $pos = strrpos($url, '/');
+ if ($pos === false) {
+ throw new OCMArgumentException('generated route should contain a slash character');
+ }
+
+ $this->provider->setEnabled(true);
+ $this->provider->setApiVersion(self::API_VERSION);
+ $this->provider->setCapabilities(['/invite-accepted', '/notifications', '/shares']);
+
+ $this->provider->setEndPoint(substr($url, 0, $pos));
+
+ $resource = $this->provider->createNewResourceType();
+ $resource->setName('file')
+ ->setShareTypes(['user', 'group'])
+ ->setProtocols(['webdav' => '/public.php/webdav/']);
+
+ $this->provider->addResourceType($resource);
+
+ // Adding a public key to the ocm discovery
+ try {
+ if (!$this->appConfig->getValueBool('core', OCMSignatoryManager::APPCONFIG_SIGN_DISABLED, lazy: true)) {
+ /**
+ * @experimental 31.0.0
+ * @psalm-suppress UndefinedInterfaceMethod
+ */
+ $this->provider->setSignatory($this->ocmSignatoryManager->getLocalSignatory());
+ } else {
+ $this->logger->debug('ocm public key feature disabled');
+ }
+ } catch (SignatoryException|IdentityNotFoundException $e) {
+ $this->logger->warning('cannot generate local signatory', ['exception' => $e]);
+ }
- return $capabilities;
+ return ['ocm' => $this->provider->jsonSerialize()];
}
}