diff options
Diffstat (limited to 'apps/federation')
-rw-r--r-- | apps/federation/appinfo/routes.php | 15 | ||||
-rw-r--r-- | apps/federation/composer/composer/autoload_classmap.php | 1 | ||||
-rw-r--r-- | apps/federation/composer/composer/autoload_static.php | 1 | ||||
-rw-r--r-- | apps/federation/js/settings-admin.js | 9 | ||||
-rw-r--r-- | apps/federation/lib/AppInfo/Application.php | 3 | ||||
-rw-r--r-- | apps/federation/lib/Controller/SettingsController.php | 91 | ||||
-rw-r--r-- | apps/federation/lib/Middleware/AddServerMiddleware.php | 55 | ||||
-rw-r--r-- | apps/federation/lib/TrustedServers.php | 23 | ||||
-rw-r--r-- | apps/federation/openapi-administration.json | 349 | ||||
-rw-r--r-- | apps/federation/openapi-full.json | 324 | ||||
-rw-r--r-- | apps/federation/tests/BackgroundJob/GetSharedSecretTest.php | 42 | ||||
-rw-r--r-- | apps/federation/tests/Controller/SettingsControllerTest.php | 53 | ||||
-rw-r--r-- | apps/federation/tests/Middleware/AddServerMiddlewareTest.php | 81 |
13 files changed, 472 insertions, 575 deletions
diff --git a/apps/federation/appinfo/routes.php b/apps/federation/appinfo/routes.php index 0fc6e5a16ae..343870614b3 100644 --- a/apps/federation/appinfo/routes.php +++ b/apps/federation/appinfo/routes.php @@ -31,20 +31,5 @@ return [ 'url' => '/shared-secret', 'verb' => 'POST', ], - [ - 'name' => 'Settings#getServers', - 'url' => '/trusted-servers', - 'verb' => 'GET' - ], - [ - 'name' => 'Settings#addServer', - 'url' => '/trusted-servers', - 'verb' => 'POST' - ], - [ - 'name' => 'Settings#removeServer', - 'url' => '/trusted-servers/{id}', - 'verb' => 'DELETE' - ], ], ]; diff --git a/apps/federation/composer/composer/autoload_classmap.php b/apps/federation/composer/composer/autoload_classmap.php index 1be343a65d1..d648b643c46 100644 --- a/apps/federation/composer/composer/autoload_classmap.php +++ b/apps/federation/composer/composer/autoload_classmap.php @@ -16,7 +16,6 @@ return array( 'OCA\\Federation\\DAV\\FedAuth' => $baseDir . '/../lib/DAV/FedAuth.php', 'OCA\\Federation\\DbHandler' => $baseDir . '/../lib/DbHandler.php', 'OCA\\Federation\\Listener\\SabrePluginAuthInitListener' => $baseDir . '/../lib/Listener/SabrePluginAuthInitListener.php', - 'OCA\\Federation\\Middleware\\AddServerMiddleware' => $baseDir . '/../lib/Middleware/AddServerMiddleware.php', 'OCA\\Federation\\Migration\\Version1010Date20200630191302' => $baseDir . '/../lib/Migration/Version1010Date20200630191302.php', 'OCA\\Federation\\Settings\\Admin' => $baseDir . '/../lib/Settings/Admin.php', 'OCA\\Federation\\SyncFederationAddressBooks' => $baseDir . '/../lib/SyncFederationAddressBooks.php', diff --git a/apps/federation/composer/composer/autoload_static.php b/apps/federation/composer/composer/autoload_static.php index 927aca66949..29932e1dffc 100644 --- a/apps/federation/composer/composer/autoload_static.php +++ b/apps/federation/composer/composer/autoload_static.php @@ -31,7 +31,6 @@ class ComposerStaticInitFederation 'OCA\\Federation\\DAV\\FedAuth' => __DIR__ . '/..' . '/../lib/DAV/FedAuth.php', 'OCA\\Federation\\DbHandler' => __DIR__ . '/..' . '/../lib/DbHandler.php', 'OCA\\Federation\\Listener\\SabrePluginAuthInitListener' => __DIR__ . '/..' . '/../lib/Listener/SabrePluginAuthInitListener.php', - 'OCA\\Federation\\Middleware\\AddServerMiddleware' => __DIR__ . '/..' . '/../lib/Middleware/AddServerMiddleware.php', 'OCA\\Federation\\Migration\\Version1010Date20200630191302' => __DIR__ . '/..' . '/../lib/Migration/Version1010Date20200630191302.php', 'OCA\\Federation\\Settings\\Admin' => __DIR__ . '/..' . '/../lib/Settings/Admin.php', 'OCA\\Federation\\SyncFederationAddressBooks' => __DIR__ . '/..' . '/../lib/SyncFederationAddressBooks.php', diff --git a/apps/federation/js/settings-admin.js b/apps/federation/js/settings-admin.js index c2b9e206ad8..aa672e53e94 100644 --- a/apps/federation/js/settings-admin.js +++ b/apps/federation/js/settings-admin.js @@ -79,8 +79,11 @@ OC.getRootPath() + '/ocs/v2.php/apps/federation/trusted-servers', { url: url - } - ).done(function({data}) { + }, + null, + 'json' + ).done(function({ ocs }) { + var data = ocs.data; $("#serverUrl").attr('value', ''); $("#listOfTrustedServers").prepend( $('<li>') @@ -92,7 +95,7 @@ OC.msg.finishedSuccess('#ocFederationAddServer .msg', data.message); }) .fail(function (jqXHR) { - OC.msg.finishedError('#ocFederationAddServer .msg', JSON.parse(jqXHR.responseText).data.message); + OC.msg.finishedError('#ocFederationAddServer .msg', JSON.parse(jqXHR.responseText).ocs.meta.message); }); }; diff --git a/apps/federation/lib/AppInfo/Application.php b/apps/federation/lib/AppInfo/Application.php index c7503921164..358e3f68d50 100644 --- a/apps/federation/lib/AppInfo/Application.php +++ b/apps/federation/lib/AppInfo/Application.php @@ -9,7 +9,6 @@ namespace OCA\Federation\AppInfo; use OCA\DAV\Events\SabrePluginAuthInitEvent; use OCA\Federation\Listener\SabrePluginAuthInitListener; -use OCA\Federation\Middleware\AddServerMiddleware; use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; @@ -25,8 +24,6 @@ class Application extends App implements IBootstrap { } public function register(IRegistrationContext $context): void { - $context->registerMiddleware(AddServerMiddleware::class); - $context->registerEventListener(SabrePluginAuthInitEvent::class, SabrePluginAuthInitListener::class); } diff --git a/apps/federation/lib/Controller/SettingsController.php b/apps/federation/lib/Controller/SettingsController.php index 5b2ee257e14..27341eba815 100644 --- a/apps/federation/lib/Controller/SettingsController.php +++ b/apps/federation/lib/Controller/SettingsController.php @@ -10,11 +10,15 @@ namespace OCA\Federation\Controller; use OCA\Federation\Settings\Admin; use OCA\Federation\TrustedServers; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\ApiRoute; use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; -use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCS\OCSException; +use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; use OCP\IL10N; use OCP\IRequest; +use Psr\Log\LoggerInterface; class SettingsController extends OCSController { public function __construct( @@ -22,6 +26,7 @@ class SettingsController extends OCSController { IRequest $request, private IL10N $l, private TrustedServers $trustedServers, + private LoggerInterface $logger, ) { parent::__construct($AppName, $request); } @@ -31,28 +36,23 @@ class SettingsController extends OCSController { * Add server to the list of trusted Nextcloud servers * * @param string $url The URL of the server to add - * @return JSONResponse<Http::STATUS_OK, array{data: array{id: int, message: string, url: string}, status: 'ok'}, array{}>|JSONResponse<Http::STATUS_NOT_FOUND|Http::STATUS_CONFLICT, array{data: array{hint: string, message: string}, status: 'error'}, array{}> + * @return DataResponse<Http::STATUS_OK, array{id: int, message: string, url: string}, array{}>|DataResponse<Http::STATUS_NOT_FOUND|Http::STATUS_CONFLICT, array{message: string}, array{}> * * 200: Server added successfully * 404: Server not found at the given URL * 409: Server is already in the list of trusted servers */ #[AuthorizedAdminSetting(settings: Admin::class)] - public function addServer(string $url): JSONResponse { - $check = $this->checkServer(trim($url)); - if ($check instanceof JSONResponse) { - return $check; - } + #[ApiRoute(verb: 'POST', url: '/trusted-servers')] + public function addServer(string $url): DataResponse { + $this->checkServer(trim($url)); // Add the server to the list of trusted servers, all is well $id = $this->trustedServers->addServer(trim($url)); - return new JSONResponse([ - 'status' => 'ok', - 'data' => [ - 'url' => $url, - 'id' => $id, - 'message' => $this->l->t('Added to the list of trusted servers') - ], + return new DataResponse([ + 'url' => $url, + 'id' => $id, + 'message' => $this->l->t('Added to the list of trusted servers') ]); } @@ -60,38 +60,39 @@ class SettingsController extends OCSController { * Add server to the list of trusted Nextcloud servers * * @param int $id The ID of the trusted server to remove - * @return JSONResponse<Http::STATUS_OK, array{data: array{id: int}, status: 'ok'}, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, array{data: array{message: string}, status: 'error'}, array{}> + * @return DataResponse<Http::STATUS_OK, array{id: int}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, array{message: string}, array{}> * * 200: Server removed successfully * 404: Server not found at the given ID */ #[AuthorizedAdminSetting(settings: Admin::class)] - public function removeServer(int $id): JSONResponse { + #[ApiRoute(verb: 'DELETE', url: '/trusted-servers/{id}', requirements: ['id' => '\d+'])] + public function removeServer(int $id): DataResponse { + try { + $this->trustedServers->getServer($id); + } catch (\Exception $e) { + throw new OCSNotFoundException($this->l->t('No server found with ID: %s', [$id])); + } + try { $this->trustedServers->removeServer($id); - return new JSONResponse([ - 'status' => 'ok', - 'data' => ['id' => $id], - ]); + return new DataResponse(['id' => $id]); } catch (\Exception $e) { - return new JSONResponse([ - 'status' => 'error', - 'data' => [ - 'message' => $e->getMessage(), - ], - ], Http::STATUS_NOT_FOUND); + $this->logger->error($e->getMessage(), ['e' => $e]); + throw new OCSException($this->l->t('Could not remove server'), Http::STATUS_INTERNAL_SERVER_ERROR); } } /** * List all trusted servers * - * @return JSONResponse<Http::STATUS_OK, array{data: list<array{id: int, status: int, url: string}>, status: 'ok'}, array{}> + * @return DataResponse<Http::STATUS_OK, list<array{id: int, status: int, url: string}>, array{}> * * 200: List of trusted servers */ #[AuthorizedAdminSetting(settings: Admin::class)] - public function getServers(): JSONResponse { + #[ApiRoute(verb: 'GET', url: '/trusted-servers')] + public function getServers(): DataResponse { $servers = $this->trustedServers->getServers(); // obfuscate the shared secret @@ -104,47 +105,21 @@ class SettingsController extends OCSController { }, $servers); // return the list of trusted servers - return new JSONResponse([ - 'status' => 'ok', - 'data' => $servers, - ]); + return new DataResponse($servers); } /** * Check if the server should be added to the list of trusted servers or not. - * - * @return JSONResponse<Http::STATUS_NOT_FOUND|Http::STATUS_CONFLICT, array{data: array{hint: string, message: string}, status: 'error'}, array{}>|null - * - * 404: Server not found at the given URL - * 409: Server is already in the list of trusted servers */ #[AuthorizedAdminSetting(settings: Admin::class)] - protected function checkServer(string $url): ?JSONResponse { + protected function checkServer(string $url): void { if ($this->trustedServers->isTrustedServer($url) === true) { - $message = 'Server is already in the list of trusted servers.'; - $hint = $this->l->t('Server is already in the list of trusted servers.'); - return new JSONResponse([ - 'status' => 'error', - 'data' => [ - 'message' => $message, - 'hint' => $hint, - ], - ], Http::STATUS_CONFLICT); + throw new OCSException($this->l->t('Server is already in the list of trusted servers.'), Http::STATUS_CONFLICT); } if ($this->trustedServers->isNextcloudServer($url) === false) { - $message = 'No server to federate with found'; - $hint = $this->l->t('No server to federate with found'); - return new JSONResponse([ - 'status' => 'error', - 'data' => [ - 'message' => $message, - 'hint' => $hint, - ], - ], Http::STATUS_NOT_FOUND); + throw new OCSNotFoundException($this->l->t('No server to federate with found')); } - - return null; } } diff --git a/apps/federation/lib/Middleware/AddServerMiddleware.php b/apps/federation/lib/Middleware/AddServerMiddleware.php deleted file mode 100644 index 0e38dd8e700..00000000000 --- a/apps/federation/lib/Middleware/AddServerMiddleware.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -/** - * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-only - */ -namespace OCA\Federation\Middleware; - -use OCA\Federation\Controller\SettingsController; -use OCP\AppFramework\Controller; -use OCP\AppFramework\Http; -use OCP\AppFramework\Http\JSONResponse; -use OCP\AppFramework\Middleware; -use OCP\HintException; -use OCP\IL10N; -use Psr\Log\LoggerInterface; - -class AddServerMiddleware extends Middleware { - public function __construct( - protected string $appName, - protected IL10N $l, - protected LoggerInterface $logger, - ) { - } - - /** - * Log error message and return a response which can be displayed to the user - * - * @param Controller $controller - * @param string $methodName - * @param \Exception $exception - * @return JSONResponse - * @throws \Exception - */ - public function afterException($controller, $methodName, \Exception $exception) { - if (($controller instanceof SettingsController) === false) { - throw $exception; - } - $this->logger->error($exception->getMessage(), [ - 'app' => $this->appName, - 'exception' => $exception, - ]); - if ($exception instanceof HintException) { - $message = $exception->getHint(); - } else { - $message = $exception->getMessage(); - } - - return new JSONResponse( - ['message' => $message], - Http::STATUS_BAD_REQUEST - ); - } -} diff --git a/apps/federation/lib/TrustedServers.php b/apps/federation/lib/TrustedServers.php index 231b892fc3e..a62ddfa1275 100644 --- a/apps/federation/lib/TrustedServers.php +++ b/apps/federation/lib/TrustedServers.php @@ -96,9 +96,9 @@ class TrustedServers { * Get all trusted servers * * @return list<array{id: int, url: string, url_hash: string, shared_secret: ?string, status: int, sync_token: ?string}> - * @throws Exception + * @throws \Exception */ - public function getServers() { + public function getServers(): ?array { if ($this->trustedServersCache === null) { $this->trustedServersCache = $this->dbHandler->getAllServer(); } @@ -106,6 +106,25 @@ class TrustedServers { } /** + * Get a trusted server + * + * @return array{id: int, url: string, url_hash: string, shared_secret: ?string, status: int, sync_token: ?string} + * @throws Exception + */ + public function getServer(int $id): ?array { + if ($this->trustedServersCache === null) { + $this->trustedServersCache = $this->dbHandler->getAllServer(); + } + + $server = array_filter($this->trustedServersCache, fn ($server) => $server['id'] === $id); + if (empty($server)) { + throw new \Exception('No server found with ID: ' . $id); + } + + return $server[0]; + } + + /** * Check if given server is a trusted Nextcloud server */ public function isTrustedServer(string $url): bool { diff --git a/apps/federation/openapi-administration.json b/apps/federation/openapi-administration.json index f1ecd62f3d8..58f9293e0ee 100644 --- a/apps/federation/openapi-administration.json +++ b/apps/federation/openapi-administration.json @@ -19,86 +19,35 @@ "scheme": "bearer" } }, - "schemas": {} - }, - "paths": { - "/ocs/v2.php/apps/federation/trusted-servers": { - "get": { - "operationId": "settings-get-servers", - "summary": "List all trusted servers", - "description": "This endpoint requires admin access", - "tags": [ - "settings" + "schemas": { + "OCSMeta": { + "type": "object", + "required": [ + "status", + "statuscode" ], - "security": [ - { - "bearer_auth": [] + "properties": { + "status": { + "type": "string" }, - { - "basic_auth": [] - } - ], - "parameters": [ - { - "name": "OCS-APIRequest", - "in": "header", - "description": "Required to be true for the API request to pass", - "required": true, - "schema": { - "type": "boolean", - "default": true - } - } - ], - "responses": { - "200": { - "description": "List of trusted servers", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "data", - "status" - ], - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "status", - "url" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "status": { - "type": "integer", - "format": "int64" - }, - "url": { - "type": "string" - } - } - } - }, - "status": { - "type": "string", - "enum": [ - "ok" - ] - } - } - } - } - } + "statuscode": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "totalitems": { + "type": "string" + }, + "itemsperpage": { + "type": "string" } } - }, + } + } + }, + "paths": { + "/ocs/v2.php/apps/federation/trusted-servers": { "post": { "operationId": "settings-add-server", "summary": "Add server to the list of trusted Nextcloud servers", @@ -153,35 +102,40 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "id", - "message", - "url" + "meta", + "data" ], "properties": { - "id": { - "type": "integer", - "format": "int64" + "meta": { + "$ref": "#/components/schemas/OCSMeta" }, - "message": { - "type": "string" - }, - "url": { - "type": "string" + "data": { + "type": "object", + "required": [ + "id", + "message", + "url" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "ok" - ] } } } @@ -195,30 +149,31 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "hint", - "message" + "meta", + "data" ], "properties": { - "hint": { - "type": "string" + "meta": { + "$ref": "#/components/schemas/OCSMeta" }, - "message": { - "type": "string" + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "error" - ] } } } @@ -232,30 +187,112 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "hint", - "message" + "meta", + "data" ], "properties": { - "hint": { - "type": "string" + "meta": { + "$ref": "#/components/schemas/OCSMeta" }, - "message": { - "type": "string" + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + }, + "get": { + "operationId": "settings-get-servers", + "summary": "List all trusted servers", + "description": "This endpoint requires admin access", + "tags": [ + "settings" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "List of trusted servers", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "status", + "url" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "status": { + "type": "integer", + "format": "int64" + }, + "url": { + "type": "string" + } + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "error" - ] } } } @@ -311,27 +348,32 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "id" + "meta", + "data" ], "properties": { - "id": { - "type": "integer", - "format": "int64" + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "ok" - ] } } } @@ -345,26 +387,31 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "message" + "meta", + "data" ], "properties": { - "message": { - "type": "string" + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "error" - ] } } } diff --git a/apps/federation/openapi-full.json b/apps/federation/openapi-full.json index 63f22be74e2..3b95b3656e8 100644 --- a/apps/federation/openapi-full.json +++ b/apps/federation/openapi-full.json @@ -502,82 +502,6 @@ } }, "/ocs/v2.php/apps/federation/trusted-servers": { - "get": { - "operationId": "settings-get-servers", - "summary": "List all trusted servers", - "description": "This endpoint requires admin access", - "tags": [ - "settings" - ], - "security": [ - { - "bearer_auth": [] - }, - { - "basic_auth": [] - } - ], - "parameters": [ - { - "name": "OCS-APIRequest", - "in": "header", - "description": "Required to be true for the API request to pass", - "required": true, - "schema": { - "type": "boolean", - "default": true - } - } - ], - "responses": { - "200": { - "description": "List of trusted servers", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "data", - "status" - ], - "properties": { - "data": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "status", - "url" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "status": { - "type": "integer", - "format": "int64" - }, - "url": { - "type": "string" - } - } - } - }, - "status": { - "type": "string", - "enum": [ - "ok" - ] - } - } - } - } - } - } - } - }, "post": { "operationId": "settings-add-server", "summary": "Add server to the list of trusted Nextcloud servers", @@ -632,35 +556,40 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "id", - "message", - "url" + "meta", + "data" ], "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "message": { - "type": "string" + "meta": { + "$ref": "#/components/schemas/OCSMeta" }, - "url": { - "type": "string" + "data": { + "type": "object", + "required": [ + "id", + "message", + "url" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "ok" - ] } } } @@ -674,30 +603,31 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "hint", - "message" + "meta", + "data" ], "properties": { - "hint": { - "type": "string" + "meta": { + "$ref": "#/components/schemas/OCSMeta" }, - "message": { - "type": "string" + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "error" - ] } } } @@ -711,30 +641,112 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + }, + "get": { + "operationId": "settings-get-servers", + "summary": "List all trusted servers", + "description": "This endpoint requires admin access", + "tags": [ + "settings" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "List of trusted servers", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "hint", - "message" + "meta", + "data" ], "properties": { - "hint": { - "type": "string" + "meta": { + "$ref": "#/components/schemas/OCSMeta" }, - "message": { - "type": "string" + "data": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "status", + "url" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "status": { + "type": "integer", + "format": "int64" + }, + "url": { + "type": "string" + } + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "error" - ] } } } @@ -790,27 +802,32 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "id" + "meta", + "data" ], "properties": { - "id": { - "type": "integer", - "format": "int64" + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "ok" - ] } } } @@ -824,26 +841,31 @@ "schema": { "type": "object", "required": [ - "data", - "status" + "ocs" ], "properties": { - "data": { + "ocs": { "type": "object", "required": [ - "message" + "meta", + "data" ], "properties": { - "message": { - "type": "string" + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string" + } + } } } - }, - "status": { - "type": "string", - "enum": [ - "error" - ] } } } diff --git a/apps/federation/tests/BackgroundJob/GetSharedSecretTest.php b/apps/federation/tests/BackgroundJob/GetSharedSecretTest.php index 021c8646cc7..3da2e2e15e4 100644 --- a/apps/federation/tests/BackgroundJob/GetSharedSecretTest.php +++ b/apps/federation/tests/BackgroundJob/GetSharedSecretTest.php @@ -20,6 +20,7 @@ use OCP\Http\Client\IResponse; use OCP\IConfig; use OCP\IURLGenerator; use OCP\OCS\IDiscoveryService; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; /** @@ -31,35 +32,16 @@ use Psr\Log\LoggerInterface; */ class GetSharedSecretTest extends TestCase { - /** @var \PHPUnit\Framework\MockObject\MockObject|IClient */ - private $httpClient; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IClientService */ - private $httpClientService; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IJobList */ - private $jobList; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IURLGenerator */ - private $urlGenerator; - - /** @var \PHPUnit\Framework\MockObject\MockObject|TrustedServers */ - private $trustedServers; - - /** @var \PHPUnit\Framework\MockObject\MockObject|LoggerInterface */ - private $logger; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IResponse */ - private $response; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IDiscoveryService */ - private $discoverService; - - /** @var \PHPUnit\Framework\MockObject\MockObject|ITimeFactory */ - private $timeFactory; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IConfig */ - private $config; + private MockObject&IClient $httpClient; + private MockObject&IClientService $httpClientService; + private MockObject&IJobList $jobList; + private MockObject&IURLGenerator $urlGenerator; + private MockObject&TrustedServers $trustedServers; + private MockObject&LoggerInterface $logger; + private MockObject&IResponse $response; + private MockObject&IDiscoveryService $discoverService; + private MockObject&ITimeFactory $timeFactory; + private MockObject&IConfig $config; private GetSharedSecret $getSharedSecret; @@ -89,7 +71,7 @@ class GetSharedSecretTest extends TestCase { $this->logger, $this->discoverService, $this->timeFactory, - $this->config + $this->config, ); } diff --git a/apps/federation/tests/Controller/SettingsControllerTest.php b/apps/federation/tests/Controller/SettingsControllerTest.php index 5652e2c055e..c3e83945e9a 100644 --- a/apps/federation/tests/Controller/SettingsControllerTest.php +++ b/apps/federation/tests/Controller/SettingsControllerTest.php @@ -1,5 +1,4 @@ <?php - /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -9,22 +8,22 @@ namespace OCA\Federation\Tests\Controller; use OCA\Federation\Controller\SettingsController; use OCA\Federation\TrustedServers; -use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCS\OCSException; +use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\IL10N; use OCP\IRequest; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; class SettingsControllerTest extends TestCase { private SettingsController $controller; - /** @var \PHPUnit\Framework\MockObject\MockObject|IRequest */ - private $request; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IL10N */ - private $l10n; - - /** @var \PHPUnit\Framework\MockObject\MockObject|TrustedServers */ - private $trustedServers; + private MockObject&IRequest $request; + private MockObject&IL10N $l10n; + private MockObject&TrustedServers $trustedServers; + private MockObject&LoggerInterface $logger; protected function setUp(): void { parent::setUp(); @@ -33,12 +32,14 @@ class SettingsControllerTest extends TestCase { $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); $this->trustedServers = $this->getMockBuilder(TrustedServers::class) ->disableOriginalConstructor()->getMock(); + $this->logger = $this->getMockBuilder(LoggerInterface::class)->getMock(); $this->controller = new SettingsController( 'SettingsControllerTest', $this->request, $this->l10n, - $this->trustedServers + $this->trustedServers, + $this->logger, ); } @@ -55,12 +56,12 @@ class SettingsControllerTest extends TestCase { ->willReturn(true); $result = $this->controller->addServer('url'); - $this->assertTrue($result instanceof JSONResponse); + $this->assertTrue($result instanceof DataResponse); $data = $result->getData(); $this->assertSame(200, $result->getStatus()); - $this->assertSame('url', $data['data']['url']); - $this->assertArrayHasKey('id', $data['data']); + $this->assertSame('url', $data['url']); + $this->assertArrayHasKey('id', $data); } /** @@ -78,15 +79,13 @@ class SettingsControllerTest extends TestCase { ->with('url') ->willReturn($isNextcloud); - $result = $this->controller->addServer('url'); - $this->assertTrue($result instanceof JSONResponse); if ($isTrustedServer) { - $this->assertSame(409, $result->getStatus()); + $this->expectException(OCSException::class); + } else { + $this->expectException(OCSNotFoundException::class); } - if (!$isNextcloud) { - $this->assertSame(404, $result->getStatus()); - } + $this->controller->addServer('url'); } public function testRemoveServer(): void { @@ -94,7 +93,7 @@ class SettingsControllerTest extends TestCase { ->method('removeServer') ->with(1); $result = $this->controller->removeServer(1); - $this->assertTrue($result instanceof JSONResponse); + $this->assertTrue($result instanceof DataResponse); $this->assertSame(200, $result->getStatus()); } @@ -110,8 +109,8 @@ class SettingsControllerTest extends TestCase { ->with('url') ->willReturn(true); - $this->assertTrue( - $this->invokePrivate($this->controller, 'checkServer', ['url']) === null + $this->assertNull( + $this->invokePrivate($this->controller, 'checkServer', ['url']) ); } @@ -130,8 +129,14 @@ class SettingsControllerTest extends TestCase { ->with('url') ->willReturn($isNextcloud); + if ($isTrustedServer) { + $this->expectException(OCSException::class); + } else { + $this->expectException(OCSNotFoundException::class); + } + $this->assertTrue( - $this->invokePrivate($this->controller, 'checkServer', ['url']) instanceof JSONResponse + $this->invokePrivate($this->controller, 'checkServer', ['url']) ); } diff --git a/apps/federation/tests/Middleware/AddServerMiddlewareTest.php b/apps/federation/tests/Middleware/AddServerMiddlewareTest.php deleted file mode 100644 index 0ad619f8114..00000000000 --- a/apps/federation/tests/Middleware/AddServerMiddlewareTest.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-only - */ -namespace OCA\Federation\Tests\Middleware; - -use OCA\Federation\Controller\SettingsController; -use OCA\Federation\Middleware\AddServerMiddleware; -use OCP\AppFramework\Http; -use OCP\HintException; -use OCP\IL10N; -use Psr\Log\LoggerInterface; -use Test\TestCase; - -class AddServerMiddlewareTest extends TestCase { - - /** @var \PHPUnit\Framework\MockObject\MockObject | LoggerInterface */ - private $logger; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IL10N */ - private $l10n; - - private AddServerMiddleware $middleware; - - /** @var \PHPUnit\Framework\MockObject\MockObject | SettingsController */ - private $controller; - - protected function setUp(): void { - parent::setUp(); - - $this->logger = $this->getMockBuilder(LoggerInterface::class)->getMock(); - $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); - $this->controller = $this->getMockBuilder(SettingsController::class) - ->disableOriginalConstructor()->getMock(); - - $this->middleware = new AddServerMiddleware( - 'AddServerMiddlewareTest', - $this->l10n, - $this->logger - ); - } - - /** - * @dataProvider dataTestAfterException - * - * @param \Exception $exception - * @param string $hint - */ - public function testAfterException($exception, $hint): void { - $this->logger->expects($this->once())->method('error'); - - $this->l10n->expects($this->any())->method('t') - ->willReturnCallback( - function (string $message): string { - return $message; - } - ); - - $result = $this->middleware->afterException($this->controller, 'method', $exception); - - $this->assertSame(Http::STATUS_BAD_REQUEST, - $result->getStatus() - ); - - $data = $result->getData(); - - $this->assertSame($hint, - $data['message'] - ); - } - - public function dataTestAfterException() { - return [ - [new HintException('message', 'hint'), 'hint'], - [new \Exception('message'), 'message'], - ]; - } -} |