summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/base.php9
-rw-r--r--lib/private/Settings/Manager.php33
-rw-r--r--lib/public/Settings/IManager.php14
3 files changed, 56 insertions, 0 deletions
diff --git a/lib/base.php b/lib/base.php
index 3457a74e989..9e56bc09f01 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -725,6 +725,7 @@ class OC {
self::registerLogRotate();
self::registerEncryptionWrapper();
self::registerEncryptionHooks();
+ self::registerSettingsHooks();
//make sure temporary files are cleaned up
$tmpManager = \OC::$server->getTempManager();
@@ -803,6 +804,14 @@ class OC {
}
}
+ public static function registerSettingsHooks() {
+ $dispatcher = \OC::$server->getEventDispatcher();
+ $dispatcher->addListener(OCP\App\ManagerEvent::EVENT_APP_DISABLE, function($event) {
+ /** @var \OCP\App\ManagerEvent $event */
+ \OC::$server->getSettingsManager()->onAppDisabled($event->getAppID());
+ });
+ }
+
private static function registerEncryptionWrapper() {
$manager = self::$server->getEncryptionManager();
\OCP\Util::connectHook('OC_Filesystem', 'preSetup', $manager, 'setupStorage');
diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php
index 1304a60949e..8fdc7fefbb3 100644
--- a/lib/private/Settings/Manager.php
+++ b/lib/private/Settings/Manager.php
@@ -94,6 +94,25 @@ class Manager implements IManager {
}
/**
+ * attempts to remove an apps section and/or settings entry. A listener is
+ * added centrally making sure that this method is called ones an app was
+ * disabled.
+ *
+ * @param string $appId
+ * @since 9.1.0
+ */
+ public function onAppDisabled($appId) {
+ $appInfo = \OC_App::getAppInfo($appId); // hello static legacy
+
+ if(isset($appInfo['settings'][IManager::KEY_ADMIN_SECTION])) {
+ $this->remove(self::TABLE_ADMIN_SECTIONS, $appInfo['settings'][IManager::KEY_ADMIN_SECTION]);
+ }
+ if(isset($settings['settings'][IManager::KEY_ADMIN_SETTINGS])) {
+ $this->remove(self::TABLE_ADMIN_SETTINGS, $appInfo['settings'][IManager::KEY_ADMIN_SETTINGS]);
+ }
+ }
+
+ /**
* @param string $sectionClassName
*/
private function setupAdminSection($sectionClassName) {
@@ -222,6 +241,20 @@ class Manager implements IManager {
return (bool) $row;
}
+ /**
+ * deletes an settings or admin entry from the given table
+ *
+ * @param $table
+ * @param $className
+ */
+ private function remove($table, $className) {
+ $query = $this->dbc->getQueryBuilder();
+ $query->delete($table)
+ ->where($query->expr()->eq('class', $query->createNamedParameter($className)));
+
+ $query->execute();
+ }
+
private function setupAdminSettings($settingsClassName) {
if(!class_exists($settingsClassName)) {
$this->log->debug('Could not find admin section class ' . $settingsClassName);
diff --git a/lib/public/Settings/IManager.php b/lib/public/Settings/IManager.php
index 8aa7a9ac248..cba4efbd037 100644
--- a/lib/public/Settings/IManager.php
+++ b/lib/public/Settings/IManager.php
@@ -51,6 +51,20 @@ interface IManager {
public function setupSettings(array $settings);
/**
+ * attempts to remove an apps section and/or settings entry. A listener is
+ * added centrally making sure that this method is called ones an app was
+ * disabled.
+ *
+ * What this does not help with is when applications change their settings
+ * or section classes during their life time. New entries will be added,
+ * but inactive ones will still reside in the database.
+ *
+ * @param string $appId
+ * @since 9.1.0
+ */
+ public function onAppDisabled($appId);
+
+ /**
* returns a list of the admin sections
*
* @return array array of ISection[] where key is the priority