aboutsummaryrefslogtreecommitdiffstats
path: root/apps/provisioning_api/lib/Controller/AppsController.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/provisioning_api/lib/Controller/AppsController.php')
-rw-r--r--apps/provisioning_api/lib/Controller/AppsController.php117
1 files changed, 75 insertions, 42 deletions
diff --git a/apps/provisioning_api/lib/Controller/AppsController.php b/apps/provisioning_api/lib/Controller/AppsController.php
index fa0f2597e7f..3f6cff7442a 100644
--- a/apps/provisioning_api/lib/Controller/AppsController.php
+++ b/apps/provisioning_api/lib/Controller/AppsController.php
@@ -1,62 +1,60 @@
<?php
declare(strict_types=1);
-
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Tom Needham <tom@owncloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Provisioning_API\Controller;
+use OC\App\AppStore\AppNotFoundException;
+use OC\Installer;
use OC_App;
use OCP\App\AppPathNotFoundException;
use OCP\App\IAppManager;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSException;
use OCP\AppFramework\OCSController;
+use OCP\IAppConfig;
use OCP\IRequest;
class AppsController extends OCSController {
- /** @var IAppManager */
- private $appManager;
-
public function __construct(
string $appName,
IRequest $request,
- IAppManager $appManager
+ private IAppManager $appManager,
+ private Installer $installer,
+ private IAppConfig $appConfig,
) {
parent::__construct($appName, $request);
+ }
- $this->appManager = $appManager;
+ /**
+ * @throws \InvalidArgumentException
+ */
+ protected function verifyAppId(string $app): string {
+ $cleanId = $this->appManager->cleanAppId($app);
+ if ($cleanId !== $app) {
+ throw new \InvalidArgumentException('Invalid app id given');
+ }
+ return $cleanId;
}
/**
- * @param string|null $filter
- * @return DataResponse
+ * Get a list of installed apps
+ *
+ * @param ?string $filter Filter for enabled or disabled apps
+ * @return DataResponse<Http::STATUS_OK, array{apps: list<string>}, array{}>
* @throws OCSException
+ *
+ * 200: Installed apps returned
*/
- public function getApps(string $filter = null): DataResponse {
+ public function getApps(?string $filter = null): DataResponse {
$apps = (new OC_App())->listAllApps();
+ /** @var list<string> $list */
$list = [];
foreach ($apps as $app) {
$list[] = $app['id'];
@@ -68,7 +66,7 @@ class AppsController extends OCSController {
break;
case 'disabled':
$enabled = OC_App::getEnabledApps();
- return new DataResponse(['apps' => array_diff($list, $enabled)]);
+ return new DataResponse(['apps' => array_values(array_diff($list, $enabled))]);
break;
default:
// Invalid filter variable
@@ -80,11 +78,20 @@ class AppsController extends OCSController {
}
/**
- * @param string $app
- * @return DataResponse
+ * Get the app info for an app
+ *
+ * @param string $app ID of the app
+ * @return DataResponse<Http::STATUS_OK, array<string, ?mixed>, array{}>
* @throws OCSException
+ *
+ * 200: App info returned
*/
public function getAppInfo(string $app): DataResponse {
+ try {
+ $app = $this->verifyAppId($app);
+ } catch (\InvalidArgumentException $e) {
+ throw new OCSException($e->getMessage(), OCSController::RESPOND_UNAUTHORISED);
+ }
$info = $this->appManager->getAppInfo($app);
if (!is_null($info)) {
return new DataResponse($info);
@@ -94,27 +101,53 @@ class AppsController extends OCSController {
}
/**
- * @PasswordConfirmationRequired
- * @param string $app
- * @return DataResponse
+ * Enable an app
+ *
+ * @param string $app ID of the app
+ * @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
* @throws OCSException
+ *
+ * 200: App enabled successfully
*/
+ #[PasswordConfirmationRequired]
public function enable(string $app): DataResponse {
try {
+ $app = $this->verifyAppId($app);
+
+ if (!$this->installer->isDownloaded($app)) {
+ $this->installer->downloadApp($app);
+ }
+
+ if ($this->appConfig->getValueString($app, 'installed_version', '') === '') {
+ $this->installer->installApp($app);
+ }
+
$this->appManager->enableApp($app);
- } catch (AppPathNotFoundException $e) {
+ } catch (\InvalidArgumentException $e) {
+ throw new OCSException($e->getMessage(), OCSController::RESPOND_UNAUTHORISED);
+ } catch (AppPathNotFoundException|AppNotFoundException $e) {
throw new OCSException('The request app was not found', OCSController::RESPOND_NOT_FOUND);
}
return new DataResponse();
}
/**
- * @PasswordConfirmationRequired
- * @param string $app
- * @return DataResponse
+ * Disable an app
+ *
+ * @param string $app ID of the app
+ * @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
+ * @throws OCSException
+ *
+ * 200: App disabled successfully
*/
+ #[PasswordConfirmationRequired]
public function disable(string $app): DataResponse {
- $this->appManager->disableApp($app);
+ try {
+ $app = $this->verifyAppId($app);
+ $this->appManager->disableApp($app);
+ } catch (\InvalidArgumentException $e) {
+ throw new OCSException($e->getMessage(), OCSController::RESPOND_UNAUTHORISED);
+ }
return new DataResponse();
}
}