From 9edca39b49f6b7fcfc4e43b61b88204222ad5e91 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Mon, 15 Aug 2016 20:03:19 +0200 Subject: [PATCH] attempt to remove section and settings entries when an app got disabled --- lib/base.php | 9 +++++++++ lib/private/Settings/Manager.php | 33 ++++++++++++++++++++++++++++++++ lib/public/Settings/IManager.php | 14 ++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/lib/base.php b/lib/base.php index 3457a74e98..9e56bc09f0 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 1304a60949..8fdc7fefbb 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -93,6 +93,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 */ @@ -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 8aa7a9ac24..cba4efbd03 100644 --- a/lib/public/Settings/IManager.php +++ b/lib/public/Settings/IManager.php @@ -50,6 +50,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 *