aboutsummaryrefslogtreecommitdiffstats
path: root/lib/public/App
diff options
context:
space:
mode:
Diffstat (limited to 'lib/public/App')
-rw-r--r--lib/public/App/AppPathNotFoundException.php15
-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.php343
-rw-r--r--lib/public/App/ManagerEvent.php90
6 files changed, 565 insertions, 0 deletions
diff --git a/lib/public/App/AppPathNotFoundException.php b/lib/public/App/AppPathNotFoundException.php
new file mode 100644
index 00000000000..56d6571ea68
--- /dev/null
+++ b/lib/public/App/AppPathNotFoundException.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCP\App;
+
+/**
+ * Class AppPathNotFoundException
+ *
+ * @since 11.0.0
+ */
+class AppPathNotFoundException extends \Exception {
+}
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
new file mode 100644
index 00000000000..20019ce1ffd
--- /dev/null
+++ b/lib/public/App/IAppManager.php
@@ -0,0 +1,343 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+namespace OCP\App;
+
+use OCP\IGroup;
+use OCP\IUser;
+
+/**
+ * Interface IAppManager
+ *
+ * @warning This interface shouldn't be included with dependency injection in
+ * classes used for installing Nextcloud.
+ *
+ * @since 8.0.0
+ */
+interface IAppManager {
+ /**
+ * @since 30.0.0
+ */
+ public const BACKEND_CALDAV = 'caldav';
+
+ /**
+ * Returns the app information from "appinfo/info.xml" for an app
+ *
+ * @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
+ * @param bool $useCache
+ * @return string
+ * @since 14.0.0
+ */
+ 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|null $user (optional) if not defined, the currently loggedin user will be used
+ * @return bool
+ * @since 8.0.0
+ */
+ public function isEnabledForUser($appId, $user = null);
+
+ /**
+ * Check if an app is enabled in the instance
+ *
+ * Notice: This actually checks if the app is enabled and not only if it is installed.
+ *
+ * @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
+ * and not if currently installed/enabled
+ *
+ * @param string $appId ID of the app
+ * @since 25.0.0
+ */
+ 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
+ * @param bool $forceEnable
+ * @throws AppPathNotFoundException
+ * @since 8.0.0
+ */
+ public function enableApp(string $appId, bool $forceEnable = false): void;
+
+ /**
+ * Whether a list of types contains a protected app type
+ *
+ * @param string[] $types
+ * @return bool
+ * @since 12.0.0
+ */
+ public function hasProtectedAppType($types);
+
+ /**
+ * Enable an app only for specific groups
+ *
+ * @param string $appId
+ * @param \OCP\IGroup[] $groups
+ * @param bool $forceEnable
+ * @throws \Exception
+ * @since 8.0.0
+ */
+ public function enableAppForGroups(string $appId, array $groups, bool $forceEnable = false): void;
+
+ /**
+ * Disable an app for every user
+ *
+ * @param string $appId
+ * @param bool $automaticDisabled
+ * @since 8.0.0
+ */
+ public function disableApp($appId, $automaticDisabled = false): void;
+
+ /**
+ * Get the directory for the given app.
+ *
+ * @since 11.0.0
+ * @throws AppPathNotFoundException
+ */
+ public function getAppPath(string $appId): string;
+
+ /**
+ * Get the web path for the given app.
+ *
+ * @param string $appId
+ * @return string
+ * @since 18.0.0
+ * @throws AppPathNotFoundException
+ */
+ public function getAppWebPath(string $appId): string;
+
+ /**
+ * List all apps enabled for a user
+ *
+ * @param \OCP\IUser $user
+ * @return list<string>
+ * @since 8.1.0
+ */
+ public function getEnabledAppsForUser(IUser $user);
+
+ /**
+ * List all installed apps
+ *
+ * @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(): void;
+
+ /**
+ * @param string $appId
+ * @return boolean
+ * @since 9.0.0
+ */
+ 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
+ */
+ public function getAlwaysEnabledApps();
+
+ /**
+ * @return string[] app IDs
+ * @since 25.0.0
+ */
+ public function getDefaultEnabledApps(): array;
+
+ /**
+ * @param \OCP\IGroup $group
+ * @return String[]
+ * @since 17.0.0
+ */
+ public function getEnabledAppsForGroup(IGroup $group): array;
+
+ /**
+ * @param String $appId
+ * @return string[]
+ * @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
new file mode 100644
index 00000000000..e02a82195e2
--- /dev/null
+++ b/lib/public/App/ManagerEvent.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+namespace OCP\App;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * Class ManagerEvent
+ *
+ * @since 9.0.0
+ */
+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';
+
+ /**
+ * @since 9.1.0
+ * @deprecated 22.0.0
+ */
+ public const EVENT_APP_UPDATE = 'OCP\App\IAppManager::updateApp';
+
+ /** @var string */
+ protected $event;
+ /** @var string */
+ protected $appID;
+ /** @var \OCP\IGroup[]|null */
+ protected $groups;
+
+ /**
+ * DispatcherEvent constructor.
+ *
+ * @param string $event
+ * @param $appID
+ * @param \OCP\IGroup[]|null $groups
+ * @since 9.0.0
+ */
+ public function __construct($event, $appID, ?array $groups = null) {
+ $this->event = $event;
+ $this->appID = $appID;
+ $this->groups = $groups;
+ }
+
+ /**
+ * @return string
+ * @since 9.0.0
+ */
+ public function getEvent() {
+ return $this->event;
+ }
+
+ /**
+ * @return string
+ * @since 9.0.0
+ */
+ public function getAppID() {
+ return $this->appID;
+ }
+
+ /**
+ * returns the group Ids
+ * @return string[]
+ * @since 9.0.0
+ */
+ public function getGroups() {
+ return array_map(function ($group) {
+ /** @var \OCP\IGroup $group */
+ return $group->getGID();
+ }, $this->groups);
+ }
+}