aboutsummaryrefslogtreecommitdiffstats
path: root/lib/public/App
diff options
context:
space:
mode:
Diffstat (limited to 'lib/public/App')
-rw-r--r--lib/public/App/AppPathNotFoundException.php23
-rw-r--r--lib/public/App/Events/AppDisableEvent.php36
-rw-r--r--lib/public/App/Events/AppEnableEvent.php47
-rw-r--r--lib/public/App/Events/AppUpdateEvent.php34
-rw-r--r--lib/public/App/IAppManager.php207
-rw-r--r--lib/public/App/ManagerEvent.php29
6 files changed, 298 insertions, 78 deletions
diff --git a/lib/public/App/AppPathNotFoundException.php b/lib/public/App/AppPathNotFoundException.php
index 29475fce216..56d6571ea68 100644
--- a/lib/public/App/AppPathNotFoundException.php
+++ b/lib/public/App/AppPathNotFoundException.php
@@ -1,25 +1,8 @@
<?php
+
/**
- * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
- *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Julius Haertl <jus@bitgrid.net>
- *
- * @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: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\App;
diff --git a/lib/public/App/Events/AppDisableEvent.php b/lib/public/App/Events/AppDisableEvent.php
new file mode 100644
index 00000000000..5d16d42785e
--- /dev/null
+++ b/lib/public/App/Events/AppDisableEvent.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCP\App\Events;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * This event is triggered when an app is disabled.
+ *
+ * @since 27.0.0
+ */
+class AppDisableEvent extends Event {
+ private string $appId;
+
+ /**
+ * @since 27.0.0
+ */
+ public function __construct(string $appId) {
+ parent::__construct();
+
+ $this->appId = $appId;
+ }
+
+ /**
+ * @since 27.0.0
+ */
+ public function getAppId(): string {
+ return $this->appId;
+ }
+}
diff --git a/lib/public/App/Events/AppEnableEvent.php b/lib/public/App/Events/AppEnableEvent.php
new file mode 100644
index 00000000000..fe1523d6a83
--- /dev/null
+++ b/lib/public/App/Events/AppEnableEvent.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCP\App\Events;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * This event is triggered when an app is enabled.
+ *
+ * @since 27.0.0
+ */
+class AppEnableEvent extends Event {
+ private string $appId;
+ /** @var string[] */
+ private array $groupIds;
+
+ /**
+ * @param string[] $groupIds
+ * @since 27.0.0
+ */
+ public function __construct(string $appId, array $groupIds = []) {
+ parent::__construct();
+
+ $this->appId = $appId;
+ $this->groupIds = $groupIds;
+ }
+
+ /**
+ * @since 27.0.0
+ */
+ public function getAppId(): string {
+ return $this->appId;
+ }
+
+ /**
+ * @since 27.0.0
+ */
+ public function getGroupIds(): array {
+ return $this->groupIds;
+ }
+}
diff --git a/lib/public/App/Events/AppUpdateEvent.php b/lib/public/App/Events/AppUpdateEvent.php
new file mode 100644
index 00000000000..2cf59ff7949
--- /dev/null
+++ b/lib/public/App/Events/AppUpdateEvent.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCP\App\Events;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * This event is triggered when an app is updated.
+ *
+ * @since 27.0.0
+ */
+class AppUpdateEvent extends Event {
+ /**
+ * @since 27.0.0
+ */
+ public function __construct(
+ private readonly string $appId,
+ ) {
+ parent::__construct();
+ }
+
+ /**
+ * @since 27.0.0
+ */
+ public function getAppId(): string {
+ return $this->appId;
+ }
+}
diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php
index de36fafcdfe..20019ce1ffd 100644
--- a/lib/public/App/IAppManager.php
+++ b/lib/public/App/IAppManager.php
@@ -1,32 +1,9 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Daniel Rudolf <github.com@daniel-rudolf.de>
- * @author Greta Doci <gretadoci@gmail.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Julius Haertl <jus@bitgrid.net>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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 OCP\App;
@@ -43,15 +20,28 @@ use OCP\IUser;
*/
interface IAppManager {
/**
- * Returns the app information from "appinfo/info.xml".
+ * @since 30.0.0
+ */
+ public const BACKEND_CALDAV = 'caldav';
+
+ /**
+ * Returns the app information from "appinfo/info.xml" for an app
*
- * @param string $appId
- * @return mixed
+ * @param string|null $lang
+ * @return array|null
* @since 14.0.0
+ * @since 31.0.0 Usage of $path is discontinued and throws an \InvalidArgumentException, use {@see self::getAppInfoByPath} instead.
*/
public function getAppInfo(string $appId, bool $path = false, $lang = null);
/**
+ * Returns the app information from a given path ending with "/appinfo/info.xml"
+ *
+ * @since 31.0.0
+ */
+ public function getAppInfoByPath(string $path, ?string $lang = null): ?array;
+
+ /**
* Returns the app information from "appinfo/info.xml".
*
* @param string $appId
@@ -62,10 +52,28 @@ interface IAppManager {
public function getAppVersion(string $appId, bool $useCache = true): string;
/**
+ * Returns the installed version of all apps
+ *
+ * @return array<string, string>
+ * @since 32.0.0
+ */
+ public function getAppInstalledVersions(bool $onlyEnabled = false): array;
+
+ /**
+ * Returns the app icon or null if none is found
+ *
+ * @param string $appId
+ * @param bool $dark Enable to request a dark icon variant, default is a white icon
+ * @return string|null
+ * @since 29.0.0
+ */
+ public function getAppIcon(string $appId, bool $dark = false): ?string;
+
+ /**
* Check if an app is enabled for user
*
* @param string $appId
- * @param \OCP\IUser $user (optional) if not defined, the currently loggedin user will be used
+ * @param \OCP\IUser|null $user (optional) if not defined, the currently loggedin user will be used
* @return bool
* @since 8.0.0
*/
@@ -79,10 +87,18 @@ interface IAppManager {
* @param string $appId
* @return bool
* @since 8.0.0
+ * @deprecated 32.0.0 Use either {@see self::isEnabledForUser} or {@see self::isEnabledForAnyone}
*/
public function isInstalled($appId);
/**
+ * Check if an app is enabled in the instance, either for everyone or for specific groups
+ *
+ * @since 32.0.0
+ */
+ public function isEnabledForAnyone(string $appId): bool;
+
+ /**
* Check if an app should be enabled by default
*
* Notice: This actually checks if the app should be enabled by default
@@ -94,6 +110,20 @@ interface IAppManager {
public function isDefaultEnabled(string $appId):bool;
/**
+ * Load an app, if not already loaded
+ * @param string $app app id
+ * @since 27.0.0
+ */
+ public function loadApp(string $app): void;
+
+ /**
+ * Check if an app is loaded
+ * @param string $app app id
+ * @since 27.0.0
+ */
+ public function isAppLoaded(string $app): bool;
+
+ /**
* Enable an app for every user
*
* @param string $appId
@@ -130,17 +160,15 @@ interface IAppManager {
* @param bool $automaticDisabled
* @since 8.0.0
*/
- public function disableApp($appId, $automaticDisabled = false);
+ public function disableApp($appId, $automaticDisabled = false): void;
/**
* Get the directory for the given app.
*
- * @param string $appId
- * @return string
* @since 11.0.0
* @throws AppPathNotFoundException
*/
- public function getAppPath($appId);
+ public function getAppPath(string $appId): string;
/**
* Get the web path for the given app.
@@ -156,7 +184,7 @@ interface IAppManager {
* List all apps enabled for a user
*
* @param \OCP\IUser $user
- * @return string[]
+ * @return list<string>
* @since 8.1.0
*/
public function getEnabledAppsForUser(IUser $user);
@@ -166,14 +194,23 @@ interface IAppManager {
*
* @return string[]
* @since 8.1.0
+ * @deprecated 32.0.0 Use either {@see self::getEnabledApps} or {@see self::getEnabledAppsForUser}
*/
public function getInstalledApps();
/**
+ * List all apps enabled, either for everyone or for specific groups only
+ *
+ * @return list<string>
+ * @since 32.0.0
+ */
+ public function getEnabledApps(): array;
+
+ /**
* Clear the cached list of apps when enabling/disabling an app
* @since 8.1.0
*/
- public function clearAppsCache();
+ public function clearAppsCache(): void;
/**
* @param string $appId
@@ -183,6 +220,27 @@ interface IAppManager {
public function isShipped($appId);
/**
+ * Loads all apps
+ *
+ * @param string[] $types
+ * @return bool
+ *
+ * This function walks through the Nextcloud directory and loads all apps
+ * it can find. A directory contains an app if the file `/appinfo/info.xml`
+ * exists.
+ *
+ * if $types is set to non-empty array, only apps of those types will be loaded
+ * @since 27.0.0
+ */
+ public function loadApps(array $types = []): bool;
+
+ /**
+ * Check if an app is of a specific type
+ * @since 27.0.0
+ */
+ public function isType(string $app, array $types): bool;
+
+ /**
* @return string[]
* @since 9.0.0
*/
@@ -207,4 +265,79 @@ interface IAppManager {
* @since 17.0.0
*/
public function getAppRestriction(string $appId): array;
+
+ /**
+ * Returns the id of the user's default app
+ *
+ * If `user` is not passed, the currently logged in user will be used
+ *
+ * @param ?IUser $user User to query default app for
+ * @param bool $withFallbacks Include fallback values if no default app was configured manually
+ * Before falling back to predefined default apps,
+ * the user defined app order is considered and the first app would be used as the fallback.
+ *
+ * @since 25.0.6
+ * @since 28.0.0 Added optional $withFallbacks parameter
+ * @deprecated 31.0.0
+ * Use @see \OCP\INavigationManager::getDefaultEntryIdForUser() instead
+ */
+ public function getDefaultAppForUser(?IUser $user = null, bool $withFallbacks = true): string;
+
+ /**
+ * Get the global default apps with fallbacks
+ *
+ * @return string[] The default applications
+ * @since 28.0.0
+ * @deprecated 31.0.0
+ * Use @see \OCP\INavigationManager::getDefaultEntryIds() instead
+ */
+ public function getDefaultApps(): array;
+
+ /**
+ * Set the global default apps with fallbacks
+ *
+ * @param string[] $defaultApps
+ * @throws \InvalidArgumentException If any of the apps is not installed
+ * @since 28.0.0
+ * @deprecated 31.0.0
+ * Use @see \OCP\INavigationManager::setDefaultEntryIds() instead
+ */
+ public function setDefaultApps(array $defaultApps): void;
+
+ /**
+ * Check whether the given backend is required by at least one app.
+ *
+ * @param self::BACKEND_* $backend Name of the backend, one of `self::BACKEND_*`
+ * @return bool True if at least one app requires the backend
+ *
+ * @since 30.0.0
+ */
+ public function isBackendRequired(string $backend): bool;
+
+ /**
+ * Clean the appId from forbidden characters
+ *
+ * @psalm-taint-escape callable
+ * @psalm-taint-escape cookie
+ * @psalm-taint-escape file
+ * @psalm-taint-escape has_quotes
+ * @psalm-taint-escape header
+ * @psalm-taint-escape html
+ * @psalm-taint-escape include
+ * @psalm-taint-escape ldap
+ * @psalm-taint-escape shell
+ * @psalm-taint-escape sql
+ * @psalm-taint-escape unserialize
+ *
+ * @since 31.0.0
+ */
+ public function cleanAppId(string $app): string;
+
+ /**
+ * Get a list of all apps in the apps folder
+ *
+ * @return list<string> an array of app names (string IDs)
+ * @since 31.0.0
+ */
+ public function getAllAppsInAppsFolders(): array;
}
diff --git a/lib/public/App/ManagerEvent.php b/lib/public/App/ManagerEvent.php
index 0069e57db42..e02a82195e2 100644
--- a/lib/public/App/ManagerEvent.php
+++ b/lib/public/App/ManagerEvent.php
@@ -1,25 +1,9 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Lukas Reschke <lukas@statuscode.ch>
- *
- * @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 OCP\App;
@@ -32,16 +16,19 @@ use OCP\EventDispatcher\Event;
*/
class ManagerEvent extends Event {
/**
+ * @since 9.0.0
* @deprecated 22.0.0
*/
public const EVENT_APP_ENABLE = 'OCP\App\IAppManager::enableApp';
/**
+ * @since 9.0.0
* @deprecated 22.0.0
*/
public const EVENT_APP_ENABLE_FOR_GROUPS = 'OCP\App\IAppManager::enableAppForGroups';
/**
+ * @since 9.0.0
* @deprecated 22.0.0
*/
public const EVENT_APP_DISABLE = 'OCP\App\IAppManager::disableApp';
@@ -67,7 +54,7 @@ class ManagerEvent extends Event {
* @param \OCP\IGroup[]|null $groups
* @since 9.0.0
*/
- public function __construct($event, $appID, array $groups = null) {
+ public function __construct($event, $appID, ?array $groups = null) {
$this->event = $event;
$this->appID = $appID;
$this->groups = $groups;