diff options
author | Robin Appelman <icewind@owncloud.com> | 2014-11-07 14:26:12 +0100 |
---|---|---|
committer | Robin Appelman <icewind@owncloud.com> | 2014-11-10 13:52:52 +0100 |
commit | 43eb375ace5c62201e2323b39a5f400b2bdc97b7 (patch) | |
tree | 9794ee71a7978fb31316da41935c448fea92601a /lib | |
parent | 2023878d537374b47494eb8ce44d3757b3692626 (diff) | |
download | nextcloud-server-43eb375ace5c62201e2323b39a5f400b2bdc97b7.tar.gz nextcloud-server-43eb375ace5c62201e2323b39a5f400b2bdc97b7.zip |
Add \OC\App\Manager to handle enabling/disabling apps
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/app/appmanager.php | 138 | ||||
-rw-r--r-- | lib/private/server.php | 15 | ||||
-rw-r--r-- | lib/public/app/iappmanager.php | 51 | ||||
-rw-r--r-- | lib/public/iservercontainer.php | 7 |
4 files changed, 211 insertions, 0 deletions
diff --git a/lib/private/app/appmanager.php b/lib/private/app/appmanager.php new file mode 100644 index 00000000000..6d9aa0bfe37 --- /dev/null +++ b/lib/private/app/appmanager.php @@ -0,0 +1,138 @@ +<?php + +/** + * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\App; + +use OCP\App\IAppManager; +use OCP\IAppConfig; +use OCP\IGroupManager; +use OCP\IUserSession; + +class AppManager implements IAppManager { + /** + * @var \OCP\IUserSession + */ + private $userSession; + + /** + * @var \OCP\IAppConfig + */ + private $appConfig; + + /** + * @var \OCP\IGroupManager + */ + private $groupManager; + + /** + * @var string[] $appId => $enabled + */ + private $installedAppsCache; + + /** + * @param \OCP\IUserSession $userSession + * @param \OCP\IAppConfig $appConfig + * @param \OCP\IGroupManager $groupManager + */ + public function __construct(IUserSession $userSession, IAppConfig $appConfig, IGroupManager $groupManager) { + $this->userSession = $userSession; + $this->appConfig = $appConfig; + $this->groupManager = $groupManager; + } + + /** + * @return string[] $appId => $enabled + */ + private function getInstalledApps() { + if (!$this->installedAppsCache) { + $values = $this->appConfig->getValues(false, 'enabled'); + $this->installedAppsCache = array_filter($values, function ($value) { + return $value !== 'no'; + }); + ksort($this->installedAppsCache); + } + return $this->installedAppsCache; + } + + /** + * Check if an app is enabled for user + * + * @param string $appId + * @param \OCP\IUser $user (optional) if not defined, the currently logged in user will be used + * @return bool + */ + public function isEnabledForUser($appId, $user = null) { + if (is_null($user)) { + $user = $this->userSession->getUser(); + } + $installedApps = $this->getInstalledApps(); + if (isset($installedApps[$appId])) { + $enabled = $installedApps[$appId]; + if ($enabled === 'yes') { + return true; + } elseif (is_null($user)) { + return false; + } else { + $groupIds = json_decode($enabled); + $userGroups = $this->groupManager->getUserGroupIds($user); + foreach ($userGroups as $groupId) { + if (array_search($groupId, $groupIds) !== false) { + return true; + } + } + return false; + } + } else { + return false; + } + } + + /** + * Check if an app is installed in the instance + * + * @param string $appId + * @return bool + */ + public function isInstalled($appId) { + $installedApps = $this->getInstalledApps(); + return isset($installedApps[$appId]); + } + + /** + * Enable an app for every user + * + * @param string $appId + */ + public function enableApp($appId) { + $this->appConfig->setValue($appId, 'enabled', 'yes'); + } + + /** + * Enable an app only for specific groups + * + * @param string $appId + * @param \OCP\IGroup[] $groups + */ + public function enableAppForGroups($appId, $groups) { + $groupIds = array_map(function ($group) { + /** @var \OCP\IGroup $group */ + return $group->getGID(); + }, $groups); + $this->appConfig->setValue($appId, 'enabled', json_encode($groupIds)); + } + + /** + * Disable an app for every user + * + * @param string $appId + */ + public function disableApp($appId) { + $this->appConfig->setValue($appId, 'enabled', 'no'); + } +} diff --git a/lib/private/server.php b/lib/private/server.php index f43613e8188..c413ee8bf6d 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -237,6 +237,12 @@ class Server extends SimpleContainer implements IServerContainer { /** @var Server $c */ return new TempManager(get_temp_dir(), $c->getLogger()); }); + $this->registerService('AppManager', function(Server $c) { + $userSession = $c->getUserSession(); + $appConfig = $c->getAppConfig(); + $groupManager = $c->getGroupManager(); + return new \OC\App\AppManager($userSession, $appConfig, $groupManager); + }); } /** @@ -616,4 +622,13 @@ class Server extends SimpleContainer implements IServerContainer { function getTempManager() { return $this->query('TempManager'); } + + /** + * Get the app manager + * + * @return \OCP\App\IAppManager + */ + function getAppManager() { + return $this->query('AppManager'); + } } diff --git a/lib/public/app/iappmanager.php b/lib/public/app/iappmanager.php new file mode 100644 index 00000000000..ebd84a1ce9d --- /dev/null +++ b/lib/public/app/iappmanager.php @@ -0,0 +1,51 @@ +<?php + +/** + * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCP\App; + +interface IAppManager { + /** + * 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 + * @return bool + */ + public function isEnabledForUser($appId, $user = null); + + /** + * Check if an app is installed in the instance + * + * @param string $appId + * @return bool + */ + public function isInstalled($appId); + + /** + * Enable an app for every user + * + * @param string $appId + */ + public function enableApp($appId); + + /** + * Enable an app only for specific groups + * + * @param string $appId + * @param \OCP\IGroup[] $groups + */ + public function enableAppForGroups($appId, $groups); + + /** + * Disable an app for every user + * + * @param string $appId + */ + public function disableApp($appId); +} diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 794bba6bfb6..b734d1b4161 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -291,4 +291,11 @@ interface IServerContainer { * @return \OCP\ITempManager */ function getTempManager(); + + /** + * Get the app manager + * + * @return \OCP\App\IAppManager + */ + function getAppManager(); } |