aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2014-11-07 14:26:12 +0100
committerRobin Appelman <icewind@owncloud.com>2014-11-10 13:52:52 +0100
commit43eb375ace5c62201e2323b39a5f400b2bdc97b7 (patch)
tree9794ee71a7978fb31316da41935c448fea92601a /lib
parent2023878d537374b47494eb8ce44d3757b3692626 (diff)
downloadnextcloud-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.php138
-rw-r--r--lib/private/server.php15
-rw-r--r--lib/public/app/iappmanager.php51
-rw-r--r--lib/public/iservercontainer.php7
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();
}