attempt to remove section and settings entries when an app got disabled

This commit is contained in:
Arthur Schiwon 2016-08-15 20:03:19 +02:00
parent 6c6338b810
commit 9edca39b49
No known key found for this signature in database
GPG Key ID: 7424F1874854DF23
3 changed files with 56 additions and 0 deletions

View File

@ -725,6 +725,7 @@ class OC {
self::registerLogRotate(); self::registerLogRotate();
self::registerEncryptionWrapper(); self::registerEncryptionWrapper();
self::registerEncryptionHooks(); self::registerEncryptionHooks();
self::registerSettingsHooks();
//make sure temporary files are cleaned up //make sure temporary files are cleaned up
$tmpManager = \OC::$server->getTempManager(); $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() { private static function registerEncryptionWrapper() {
$manager = self::$server->getEncryptionManager(); $manager = self::$server->getEncryptionManager();
\OCP\Util::connectHook('OC_Filesystem', 'preSetup', $manager, 'setupStorage'); \OCP\Util::connectHook('OC_Filesystem', 'preSetup', $manager, 'setupStorage');

View File

@ -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 * @param string $sectionClassName
*/ */
@ -222,6 +241,20 @@ class Manager implements IManager {
return (bool) $row; 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) { private function setupAdminSettings($settingsClassName) {
if(!class_exists($settingsClassName)) { if(!class_exists($settingsClassName)) {
$this->log->debug('Could not find admin section class ' . $settingsClassName); $this->log->debug('Could not find admin section class ' . $settingsClassName);

View File

@ -50,6 +50,20 @@ interface IManager {
*/ */
public function setupSettings(array $settings); 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 * returns a list of the admin sections
* *