self::registerLogRotate();
self::registerEncryptionWrapper();
self::registerEncryptionHooks();
+ self::registerSettingsHooks();
//make sure temporary files are cleaned up
$tmpManager = \OC::$server->getTempManager();
}
}
+ 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');
}
}
+ /**
+ * 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
*/
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);
*/
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
*