You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.2 KiB

  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  5. * SPDX-License-Identifier: AGPL-3.0-or-later
  6. */
  7. namespace OC\Core\Controller;
  8. use Exception;
  9. use OC\OCM\OCMDiscoveryService;
  10. use OCP\AppFramework\Controller;
  11. use OCP\AppFramework\Http;
  12. use OCP\AppFramework\Http\Attribute\FrontpageRoute;
  13. use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
  14. use OCP\AppFramework\Http\Attribute\OpenAPI;
  15. use OCP\AppFramework\Http\Attribute\PublicPage;
  16. use OCP\AppFramework\Http\DataResponse;
  17. use OCP\IAppConfig;
  18. use OCP\IRequest;
  19. use OCP\Server;
  20. use Psr\Log\LoggerInterface;
  21. /**
  22. * Controller about the endpoint /ocm-provider/
  23. *
  24. * @since 28.0.0
  25. */
  26. class OCMController extends Controller {
  27. public function __construct(
  28. IRequest $request,
  29. private readonly IAppConfig $appConfig,
  30. private readonly OCMDiscoveryService $ocmDiscoveryService,
  31. private LoggerInterface $logger,
  32. ) {
  33. parent::__construct('core', $request);
  34. }
  35. /**
  36. * generate a OCMProvider with local data and send it as DataResponse.
  37. * This replaces the old PHP file ocm-provider/index.php
  38. *
  39. * @psalm-suppress MoreSpecificReturnType
  40. * @psalm-suppress LessSpecificReturnStatement
  41. * @return DataResponse<Http::STATUS_OK, array{enabled: bool, apiVersion: string, endPoint: string, resourceTypes: list<array{name: string, shareTypes: list<string>, protocols: array{webdav: string}}>}, array{X-NEXTCLOUD-OCM-PROVIDERS: true, Content-Type: 'application/json'}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, array{message: string}, array{}>
  42. *
  43. * 200: OCM Provider details returned
  44. * 500: OCM not supported
  45. */
  46. #[PublicPage]
  47. #[NoCSRFRequired]
  48. #[FrontpageRoute(verb: 'GET', url: '/ocm-provider/')]
  49. #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)]
  50. public function discovery(): DataResponse {
  51. try {
  52. return new DataResponse(
  53. $this->ocmDiscoveryService->getLocalOCMProvider()->jsonSerialize(),
  54. Http::STATUS_OK,
  55. [
  56. 'X-NEXTCLOUD-OCM-PROVIDERS' => true,
  57. 'Content-Type' => 'application/json'
  58. ]
  59. );
  60. } catch (Exception $e) {
  61. $this->logger->error('issue during OCM discovery request', ['exception' => $e]);
  62. return new DataResponse(
  63. ['message' => '/ocm-provider/ not supported'],
  64. Http::STATUS_INTERNAL_SERVER_ERROR
  65. );
  66. }
  67. }
  68. }