attempt to remove section and settings entries when an app got disabled
This commit is contained in:
parent
436e6c1078
commit
1e62bd3d92
|
@ -723,6 +723,7 @@ class OC {
|
|||
self::registerLogRotate();
|
||||
self::registerEncryptionWrapper();
|
||||
self::registerEncryptionHooks();
|
||||
self::registerSettingsHooks();
|
||||
|
||||
//make sure temporary files are cleaned up
|
||||
$tmpManager = \OC::$server->getTempManager();
|
||||
|
@ -801,6 +802,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');
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue