diff options
author | Côme Chilliet <91878298+come-nc@users.noreply.github.com> | 2024-09-12 14:34:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-12 14:34:07 +0200 |
commit | b6c286640f3fe4ab9eef8817e093a0403189f40c (patch) | |
tree | e3b1c31da302ef36d7a80805db6b038a0586f101 | |
parent | a2ac1d8be05a482aa649d902b47b4ed688f21f8d (diff) | |
parent | 90a948506bad93c4ebdbf4dfdbdd97a91a847c12 (diff) | |
download | nextcloud-server-b6c286640f3fe4ab9eef8817e093a0403189f40c.tar.gz nextcloud-server-b6c286640f3fe4ab9eef8817e093a0403189f40c.zip |
Merge pull request #47685 from nextcloud/fix/move-apihelper-to-oc-namespace
fix: Move OC_API into \OC\ApiHelper in standard namespace
-rw-r--r-- | lib/composer/composer/autoload_classmap.php | 4 | ||||
-rw-r--r-- | lib/composer/composer/autoload_static.php | 4 | ||||
-rw-r--r-- | lib/private/OCS/ApiHelper.php | 80 | ||||
-rw-r--r-- | lib/private/OCS/Exception.php | 19 | ||||
-rw-r--r-- | lib/private/OCS/Result.php | 137 | ||||
-rw-r--r-- | lib/private/legacy/OC_API.php | 162 | ||||
-rw-r--r-- | ocs/v1.php | 42 | ||||
-rw-r--r-- | tests/lib/APITest.php | 84 | ||||
-rw-r--r-- | tests/lib/AppFramework/OCS/BaseResponseTest.php | 2 | ||||
-rw-r--r-- | tests/lib/AppFramework/OCS/V2ResponseTest.php | 38 | ||||
-rw-r--r-- | tests/lib/OCS/ApiHelperTest.php | 54 | ||||
-rw-r--r-- | tests/lib/OCS/MapStatusCodeTest.php | 29 |
12 files changed, 195 insertions, 460 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 4bd8f96454e..6d0cb11791c 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1714,11 +1714,10 @@ return array( 'OC\\OCM\\Model\\OCMProvider' => $baseDir . '/lib/private/OCM/Model/OCMProvider.php', 'OC\\OCM\\Model\\OCMResource' => $baseDir . '/lib/private/OCM/Model/OCMResource.php', 'OC\\OCM\\OCMDiscoveryService' => $baseDir . '/lib/private/OCM/OCMDiscoveryService.php', + 'OC\\OCS\\ApiHelper' => $baseDir . '/lib/private/OCS/ApiHelper.php', 'OC\\OCS\\CoreCapabilities' => $baseDir . '/lib/private/OCS/CoreCapabilities.php', 'OC\\OCS\\DiscoveryService' => $baseDir . '/lib/private/OCS/DiscoveryService.php', - 'OC\\OCS\\Exception' => $baseDir . '/lib/private/OCS/Exception.php', 'OC\\OCS\\Provider' => $baseDir . '/lib/private/OCS/Provider.php', - 'OC\\OCS\\Result' => $baseDir . '/lib/private/OCS/Result.php', 'OC\\PhoneNumberUtil' => $baseDir . '/lib/private/PhoneNumberUtil.php', 'OC\\PreviewManager' => $baseDir . '/lib/private/PreviewManager.php', 'OC\\PreviewNotAvailableException' => $baseDir . '/lib/private/PreviewNotAvailableException.php', @@ -2000,7 +1999,6 @@ return array( 'OC\\User\\OutOfOfficeData' => $baseDir . '/lib/private/User/OutOfOfficeData.php', 'OC\\User\\Session' => $baseDir . '/lib/private/User/Session.php', 'OC\\User\\User' => $baseDir . '/lib/private/User/User.php', - 'OC_API' => $baseDir . '/lib/private/legacy/OC_API.php', 'OC_App' => $baseDir . '/lib/private/legacy/OC_App.php', 'OC_Defaults' => $baseDir . '/lib/private/legacy/OC_Defaults.php', 'OC_Files' => $baseDir . '/lib/private/legacy/OC_Files.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index a9737d27c83..2328d36106d 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1747,11 +1747,10 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\OCM\\Model\\OCMProvider' => __DIR__ . '/../../..' . '/lib/private/OCM/Model/OCMProvider.php', 'OC\\OCM\\Model\\OCMResource' => __DIR__ . '/../../..' . '/lib/private/OCM/Model/OCMResource.php', 'OC\\OCM\\OCMDiscoveryService' => __DIR__ . '/../../..' . '/lib/private/OCM/OCMDiscoveryService.php', + 'OC\\OCS\\ApiHelper' => __DIR__ . '/../../..' . '/lib/private/OCS/ApiHelper.php', 'OC\\OCS\\CoreCapabilities' => __DIR__ . '/../../..' . '/lib/private/OCS/CoreCapabilities.php', 'OC\\OCS\\DiscoveryService' => __DIR__ . '/../../..' . '/lib/private/OCS/DiscoveryService.php', - 'OC\\OCS\\Exception' => __DIR__ . '/../../..' . '/lib/private/OCS/Exception.php', 'OC\\OCS\\Provider' => __DIR__ . '/../../..' . '/lib/private/OCS/Provider.php', - 'OC\\OCS\\Result' => __DIR__ . '/../../..' . '/lib/private/OCS/Result.php', 'OC\\PhoneNumberUtil' => __DIR__ . '/../../..' . '/lib/private/PhoneNumberUtil.php', 'OC\\PreviewManager' => __DIR__ . '/../../..' . '/lib/private/PreviewManager.php', 'OC\\PreviewNotAvailableException' => __DIR__ . '/../../..' . '/lib/private/PreviewNotAvailableException.php', @@ -2033,7 +2032,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\User\\OutOfOfficeData' => __DIR__ . '/../../..' . '/lib/private/User/OutOfOfficeData.php', 'OC\\User\\Session' => __DIR__ . '/../../..' . '/lib/private/User/Session.php', 'OC\\User\\User' => __DIR__ . '/../../..' . '/lib/private/User/User.php', - 'OC_API' => __DIR__ . '/../../..' . '/lib/private/legacy/OC_API.php', 'OC_App' => __DIR__ . '/../../..' . '/lib/private/legacy/OC_App.php', 'OC_Defaults' => __DIR__ . '/../../..' . '/lib/private/legacy/OC_Defaults.php', 'OC_Files' => __DIR__ . '/../../..' . '/lib/private/legacy/OC_Files.php', diff --git a/lib/private/OCS/ApiHelper.php b/lib/private/OCS/ApiHelper.php new file mode 100644 index 00000000000..f69b540eafa --- /dev/null +++ b/lib/private/OCS/ApiHelper.php @@ -0,0 +1,80 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ + +namespace OC\OCS; + +use OC\AppFramework\OCS\V1Response; +use OC\AppFramework\OCS\V2Response; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCSController; +use OCP\IRequest; +use OCP\Server; + +class ApiHelper { + /** + * Respond to a call + * @psalm-taint-escape html + * @param int $overrideHttpStatusCode force the HTTP status code, only used for the special case of maintenance mode which return 503 even for v1 + */ + public static function respond(int $statusCode, string $statusMessage, array $headers = [], ?int $overrideHttpStatusCode = null): void { + $request = Server::get(IRequest::class); + $format = $request->getParam('format', 'xml'); + if (self::isV2($request)) { + $response = new V2Response(new DataResponse([], $statusCode, $headers), $format, $statusMessage); + } else { + $response = new V1Response(new DataResponse([], $statusCode, $headers), $format, $statusMessage); + } + + // Send 401 headers if unauthorised + if ($response->getOCSStatus() === OCSController::RESPOND_UNAUTHORISED) { + // If request comes from JS return dummy auth request + if ($request->getHeader('X-Requested-With') === 'XMLHttpRequest') { + header('WWW-Authenticate: DummyBasic realm="Authorisation Required"'); + } else { + header('WWW-Authenticate: Basic realm="Authorisation Required"'); + } + http_response_code(401); + } + + foreach ($response->getHeaders() as $name => $value) { + header($name . ': ' . $value); + } + + http_response_code($overrideHttpStatusCode ?? $response->getStatus()); + + self::setContentType($format); + $body = $response->render(); + echo $body; + } + + /** + * Based on the requested format the response content type is set + */ + public static function setContentType(?string $format = null): void { + $format ??= Server::get(IRequest::class)->getParam('format', 'xml'); + if ($format === 'xml') { + header('Content-type: text/xml; charset=UTF-8'); + return; + } + + if ($format === 'json') { + header('Content-Type: application/json; charset=utf-8'); + return; + } + + header('Content-Type: application/octet-stream; charset=utf-8'); + } + + protected static function isV2(IRequest $request): bool { + $script = $request->getScriptName(); + + return str_ends_with($script, '/ocs/v2.php'); + } +} diff --git a/lib/private/OCS/Exception.php b/lib/private/OCS/Exception.php deleted file mode 100644 index eca8ec26df0..00000000000 --- a/lib/private/OCS/Exception.php +++ /dev/null @@ -1,19 +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 OC\OCS; - -class Exception extends \Exception { - public function __construct( - private Result $result, - ) { - parent::__construct(); - } - - public function getResult(): Result { - return $this->result; - } -} diff --git a/lib/private/OCS/Result.php b/lib/private/OCS/Result.php deleted file mode 100644 index 5460a8b275c..00000000000 --- a/lib/private/OCS/Result.php +++ /dev/null @@ -1,137 +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 OC\OCS; - -class Result { - protected array $data; - - /** @var null|string */ - protected ?string $message; - - /** @var int */ - protected int $statusCode; - - /** @var integer */ - protected $items; - - /** @var integer */ - protected $perPage; - - /** @var array */ - private array $headers = []; - - /** - * create the OCS_Result object - * - * @param mixed|null $data the data to return - * @param int $code - * @param string|null $message - * @param array $headers - */ - public function __construct(mixed $data = null, int $code = 100, ?string $message = null, array $headers = []) { - if ($data === null) { - $this->data = []; - } elseif (!is_array($data)) { - $this->data = [$this->data]; - } else { - $this->data = $data; - } - $this->statusCode = $code; - $this->message = $message; - $this->headers = $headers; - } - - /** - * optionally set the total number of items available - * - * @param int $items - */ - public function setTotalItems(int $items): void { - $this->items = $items; - } - - /** - * optionally set the number of items per page - * - * @param int $items - */ - public function setItemsPerPage(int $items): void { - $this->perPage = $items; - } - - /** - * get the status code - * @return int - */ - public function getStatusCode(): int { - return $this->statusCode; - } - - /** - * get the meta data for the result - * @return array - */ - public function getMeta(): array { - $meta = []; - $meta['status'] = $this->succeeded() ? 'ok' : 'failure'; - $meta['statuscode'] = $this->statusCode; - $meta['message'] = $this->message; - if ($this->items !== null) { - $meta['totalitems'] = $this->items; - } - if ($this->perPage !== null) { - $meta['itemsperpage'] = $this->perPage; - } - return $meta; - } - - /** - * get the result data - * @return array - */ - public function getData(): array { - return $this->data; - } - - /** - * return bool Whether the method succeeded - * @return bool - */ - public function succeeded(): bool { - return ($this->statusCode == 100); - } - - /** - * Adds a new header to the response - * - * @param string $name The name of the HTTP header - * @param string $value The value, null will delete it - * @return $this - */ - public function addHeader(string $name, ?string $value): static { - $name = trim($name); // always remove leading and trailing whitespace - // to be able to reliably check for security - // headers - - if (is_null($value)) { - unset($this->headers[$name]); - } else { - $this->headers[$name] = $value; - } - - return $this; - } - - /** - * Returns the set headers - * @return array the headers - */ - public function getHeaders(): array { - return $this->headers; - } -} diff --git a/lib/private/legacy/OC_API.php b/lib/private/legacy/OC_API.php deleted file mode 100644 index bb2376d4ea0..00000000000 --- a/lib/private/legacy/OC_API.php +++ /dev/null @@ -1,162 +0,0 @@ -<?php - -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-only - */ -use OCP\API; -use OCP\AppFramework\Http; - -class OC_API { - /** - * api actions - */ - protected static $actions = []; - - /** - * respond to a call - * @param \OC\OCS\Result $result - * @param string $format the format xml|json - * @psalm-taint-escape html - */ - public static function respond($result, $format = 'xml') { - $request = \OC::$server->getRequest(); - - // Send 401 headers if unauthorised - if ($result->getStatusCode() === \OCP\AppFramework\OCSController::RESPOND_UNAUTHORISED) { - // If request comes from JS return dummy auth request - if ($request->getHeader('X-Requested-With') === 'XMLHttpRequest') { - header('WWW-Authenticate: DummyBasic realm="Authorisation Required"'); - } else { - header('WWW-Authenticate: Basic realm="Authorisation Required"'); - } - http_response_code(401); - } - - foreach ($result->getHeaders() as $name => $value) { - header($name . ': ' . $value); - } - - $meta = $result->getMeta(); - $data = $result->getData(); - if (self::isV2($request)) { - $statusCode = self::mapStatusCodes($result->getStatusCode()); - if (!is_null($statusCode)) { - $meta['statuscode'] = $statusCode; - http_response_code($statusCode); - } - } - - self::setContentType($format); - $body = self::renderResult($format, $meta, $data); - echo $body; - } - - /** - * @param XMLWriter $writer - */ - private static function toXML($array, $writer) { - foreach ($array as $k => $v) { - if ($k[0] === '@') { - $writer->writeAttribute(substr($k, 1), $v); - continue; - } elseif (is_numeric($k)) { - $k = 'element'; - } - if (is_array($v)) { - $writer->startElement($k); - self::toXML($v, $writer); - $writer->endElement(); - } else { - $writer->writeElement($k, $v); - } - } - } - - public static function requestedFormat(): string { - $formats = ['json', 'xml']; - - $format = (isset($_GET['format']) && is_string($_GET['format']) && in_array($_GET['format'], $formats)) ? $_GET['format'] : 'xml'; - return $format; - } - - /** - * Based on the requested format the response content type is set - * @param string $format - */ - public static function setContentType($format = null) { - $format = is_null($format) ? self::requestedFormat() : $format; - if ($format === 'xml') { - header('Content-type: text/xml; charset=UTF-8'); - return; - } - - if ($format === 'json') { - header('Content-Type: application/json; charset=utf-8'); - return; - } - - header('Content-Type: application/octet-stream; charset=utf-8'); - } - - /** - * @param \OCP\IRequest $request - * @return bool - */ - protected static function isV2(\OCP\IRequest $request) { - $script = $request->getScriptName(); - - return str_ends_with($script, '/ocs/v2.php'); - } - - /** - * @param integer $sc - * @return int - */ - public static function mapStatusCodes($sc) { - switch ($sc) { - case \OCP\AppFramework\OCSController::RESPOND_NOT_FOUND: - return Http::STATUS_NOT_FOUND; - case \OCP\AppFramework\OCSController::RESPOND_SERVER_ERROR: - return Http::STATUS_INTERNAL_SERVER_ERROR; - case \OCP\AppFramework\OCSController::RESPOND_UNKNOWN_ERROR: - return Http::STATUS_INTERNAL_SERVER_ERROR; - case \OCP\AppFramework\OCSController::RESPOND_UNAUTHORISED: - // already handled for v1 - return null; - case 100: - return Http::STATUS_OK; - } - // any 2xx, 4xx and 5xx will be used as is - if ($sc >= 200 && $sc < 600) { - return $sc; - } - - return Http::STATUS_BAD_REQUEST; - } - - /** - * @param string $format - * @return string - */ - public static function renderResult($format, $meta, $data) { - $response = [ - 'ocs' => [ - 'meta' => $meta, - 'data' => $data, - ], - ]; - if ($format == 'json') { - return json_encode($response, JSON_HEX_TAG); - } - - $writer = new XMLWriter(); - $writer->openMemory(); - $writer->setIndent(true); - $writer->startDocument(); - self::toXML($response, $writer); - $writer->endDocument(); - return $writer->outputMemory(true); - } -} diff --git a/ocs/v1.php b/ocs/v1.php index 91f52a66943..90d7971c549 100644 --- a/ocs/v1.php +++ b/ocs/v1.php @@ -1,27 +1,33 @@ <?php + +declare(strict_types=1); + /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. * SPDX-License-Identifier: AGPL-3.0-only */ + require_once __DIR__ . '/../lib/versioncheck.php'; require_once __DIR__ . '/../lib/base.php'; -if (\OCP\Util::needUpgrade() +use OC\OCS\ApiHelper; +use OCP\AppFramework\Http; +use OCP\AppFramework\OCSController; +use OCP\Security\Bruteforce\MaxDelayReached; +use OCP\Util; +use Psr\Log\LoggerInterface; +use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; + +if (Util::needUpgrade() || \OC::$server->getConfig()->getSystemValueBool('maintenance')) { // since the behavior of apps or remotes are unpredictable during // an upgrade, return a 503 directly - http_response_code(503); - header('X-Nextcloud-Maintenance-Mode: 1'); - $response = new \OC\OCS\Result(null, 503, 'Service unavailable'); - OC_API::respond($response, OC_API::requestedFormat()); + ApiHelper::respond(503, 'Service unavailable', ['X-Nextcloud-Maintenance-Mode' => '1'], 503); exit; } -use OCP\Security\Bruteforce\MaxDelayReached; -use Psr\Log\LoggerInterface; -use Symfony\Component\Routing\Exception\MethodNotAllowedException; -use Symfony\Component\Routing\Exception\ResourceNotFoundException; /* * Try the appframework routes @@ -42,27 +48,19 @@ try { OC::$server->get(\OC\Route\Router::class)->match('/ocsapp'.\OC::$server->getRequest()->getRawPathInfo()); } catch (MaxDelayReached $ex) { - $format = \OC::$server->getRequest()->getParam('format', 'xml'); - OC_API::respond(new \OC\OCS\Result(null, OCP\AppFramework\Http::STATUS_TOO_MANY_REQUESTS, $ex->getMessage()), $format); + ApiHelper::respond(Http::STATUS_TOO_MANY_REQUESTS, $ex->getMessage()); } catch (ResourceNotFoundException $e) { - OC_API::setContentType(); - - $format = \OC::$server->getRequest()->getParam('format', 'xml'); $txt = 'Invalid query, please check the syntax. API specifications are here:' .' http://www.freedesktop.org/wiki/Specifications/open-collaboration-services.'."\n"; - OC_API::respond(new \OC\OCS\Result(null, \OCP\AppFramework\OCSController::RESPOND_NOT_FOUND, $txt), $format); + ApiHelper::respond(OCSController::RESPOND_NOT_FOUND, $txt); } catch (MethodNotAllowedException $e) { - OC_API::setContentType(); + ApiHelper::setContentType(); http_response_code(405); -} catch (\OC\OCS\Exception $ex) { - OC_API::respond($ex->getResult(), OC_API::requestedFormat()); } catch (\OC\User\LoginException $e) { - OC_API::respond(new \OC\OCS\Result(null, \OCP\AppFramework\OCSController::RESPOND_UNAUTHORISED, 'Unauthorised')); + ApiHelper::respond(OCSController::RESPOND_UNAUTHORISED, 'Unauthorised'); } catch (\Exception $e) { \OCP\Server::get(LoggerInterface::class)->error($e->getMessage(), ['exception' => $e]); - OC_API::setContentType(); - $format = \OC::$server->getRequest()->getParam('format', 'xml'); $txt = 'Internal Server Error'."\n"; try { if (\OC::$server->getSystemConfig()->getValue('debug', false)) { @@ -71,5 +69,5 @@ try { } catch (\Throwable $e) { // Just to be save } - OC_API::respond(new \OC\OCS\Result(null, \OCP\AppFramework\OCSController::RESPOND_SERVER_ERROR, $txt), $format); + ApiHelper::respond(OCSController::RESPOND_SERVER_ERROR, $txt); } diff --git a/tests/lib/APITest.php b/tests/lib/APITest.php deleted file mode 100644 index cc255b929ad..00000000000 --- a/tests/lib/APITest.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -namespace Test; - -use OCP\IRequest; - -class APITest extends \Test\TestCase { - // Helps build a response variable - - /** - * @param string $message - */ - public function buildResponse($shipped, $data, $code, $message = null) { - $resp = new \OC\OCS\Result($data, $code, $message); - $resp->addHeader('KEY', 'VALUE'); - return [ - 'shipped' => $shipped, - 'response' => $resp, - 'app' => $this->getUniqueID('testapp_'), - ]; - } - - // Validate details of the result - - /** - * @param \OC\OCS\Result $result - */ - public function checkResult($result, $success) { - // Check response is of correct type - $this->assertInstanceOf(\OC\OCS\Result::class, $result); - // Check if it succeeded - /** @var \OC\OCS\Result $result */ - $this->assertEquals($success, $result->succeeded()); - } - - /** - * @return array - */ - public function versionDataScriptNameProvider() { - return [ - // Valid script name - [ - '/master/ocs/v2.php', - true, - ], - - // Invalid script names - [ - '/master/ocs/v2.php/someInvalidPathName', - false, - ], - [ - '/master/ocs/v1.php', - false, - ], - [ - '', - false, - ], - ]; - } - - /** - * @dataProvider versionDataScriptNameProvider - * @param string $scriptName - * @param bool $expected - */ - public function testIsV2($scriptName, $expected) { - $request = $this->getMockBuilder(IRequest::class) - ->disableOriginalConstructor() - ->getMock(); - $request - ->expects($this->once()) - ->method('getScriptName') - ->willReturn($scriptName); - - $this->assertEquals($expected, $this->invokePrivate(new \OC_API, 'isV2', [$request])); - } -} diff --git a/tests/lib/AppFramework/OCS/BaseResponseTest.php b/tests/lib/AppFramework/OCS/BaseResponseTest.php index aaa107ef013..159459a4aec 100644 --- a/tests/lib/AppFramework/OCS/BaseResponseTest.php +++ b/tests/lib/AppFramework/OCS/BaseResponseTest.php @@ -7,7 +7,7 @@ declare(strict_types=1); * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace Test\AppFramework\Middleware; +namespace Test\AppFramework\OCS; use OC\AppFramework\OCS\BaseResponse; diff --git a/tests/lib/AppFramework/OCS/V2ResponseTest.php b/tests/lib/AppFramework/OCS/V2ResponseTest.php new file mode 100644 index 00000000000..97a227418f3 --- /dev/null +++ b/tests/lib/AppFramework/OCS/V2ResponseTest.php @@ -0,0 +1,38 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace Test\AppFramework\OCS; + +use OC\AppFramework\OCS\V2Response; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCSController; + +class V2ResponseTest extends \Test\TestCase { + /** + * @dataProvider providesStatusCodes + */ + public function testStatusCodeMapper(int $expected, int $sc): void { + $response = new V2Response(new DataResponse([], $sc)); + $this->assertEquals($expected, $response->getStatus()); + } + + public function providesStatusCodes(): array { + return [ + [Http::STATUS_OK, 200], + [Http::STATUS_BAD_REQUEST, 104], + [Http::STATUS_BAD_REQUEST, 1000], + [201, 201], + [Http::STATUS_UNAUTHORIZED, OCSController::RESPOND_UNAUTHORISED], + [Http::STATUS_INTERNAL_SERVER_ERROR, OCSController::RESPOND_SERVER_ERROR], + [Http::STATUS_NOT_FOUND, OCSController::RESPOND_NOT_FOUND], + [Http::STATUS_INTERNAL_SERVER_ERROR, OCSController::RESPOND_UNKNOWN_ERROR], + ]; + } +} diff --git a/tests/lib/OCS/ApiHelperTest.php b/tests/lib/OCS/ApiHelperTest.php new file mode 100644 index 00000000000..fdbc1f4c538 --- /dev/null +++ b/tests/lib/OCS/ApiHelperTest.php @@ -0,0 +1,54 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace Test\OCS; + +use OC\OCS\ApiHelper; +use OCP\IRequest; + +class ApiHelperTest extends \Test\TestCase { + /** + * @return array + */ + public function versionDataScriptNameProvider(): array { + return [ + // Valid script name + [ + '/master/ocs/v2.php', true, + ], + + // Invalid script names + [ + '/master/ocs/v2.php/someInvalidPathName', false, + ], + [ + '/master/ocs/v1.php', false, + ], + [ + '', false, + ], + ]; + } + + /** + * @dataProvider versionDataScriptNameProvider + */ + public function testIsV2(string $scriptName, bool $expected): void { + $request = $this->getMockBuilder(IRequest::class) + ->disableOriginalConstructor() + ->getMock(); + $request + ->expects($this->once()) + ->method('getScriptName') + ->willReturn($scriptName); + + $this->assertEquals($expected, $this->invokePrivate(new ApiHelper, 'isV2', [$request])); + } +} diff --git a/tests/lib/OCS/MapStatusCodeTest.php b/tests/lib/OCS/MapStatusCodeTest.php deleted file mode 100644 index c6d6d5edd06..00000000000 --- a/tests/lib/OCS/MapStatusCodeTest.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -/** - * SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-only - */ - -namespace Test\OCS; - -use OCP\AppFramework\Http; - -class MapStatusCodeTest extends \Test\TestCase { - /** - * @dataProvider providesStatusCodes - */ - public function testStatusCodeMapper($expected, $sc) { - $result = \OC_API::mapStatusCodes($sc); - $this->assertEquals($expected, $result); - } - - public function providesStatusCodes() { - return [ - [Http::STATUS_OK, 100], - [Http::STATUS_BAD_REQUEST, 104], - [Http::STATUS_BAD_REQUEST, 1000], - [201, 201], - ]; - } -} |