From 31bc6d8b07fbb9dd4e2290d1ddf6395a8222c231 Mon Sep 17 00:00:00 2001
From: Tim Steiner <tsteiner2@unl.edu>
Date: Thu, 17 May 2012 13:29:25 -0500
Subject: [PATCH] [gh-382] Change the module whitelist to be configurable

---
 sites/all/modules/unl/includes/unl.admin.inc | 24 ++++++++++++++++++++
 sites/all/modules/unl/unl.install            | 13 +++++++++++
 sites/all/modules/unl/unl.module             |  5 +---
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/sites/all/modules/unl/includes/unl.admin.inc b/sites/all/modules/unl/includes/unl.admin.inc
index 9c898a49..c61be7fa 100644
--- a/sites/all/modules/unl/includes/unl.admin.inc
+++ b/sites/all/modules/unl/includes/unl.admin.inc
@@ -37,6 +37,29 @@ function unl_config($form, &$form_state) {
     '#type' => 'submit',
     '#value' => 'Update',
   );
+  
+  // Grab a list of available modules (active or not).
+  // Based on system_modules() from modules/system.admin.inc.
+  $files = system_rebuild_module_data();
+  require_once DRUPAL_ROOT . '/modules/system/system.admin.inc';
+  uasort($files, 'system_sort_modules_by_info_name');
+  
+  $modules = array();
+  foreach ($files as $filename => $file) {
+    if (!empty($file->info['hidden'])) {
+      continue;
+    }
+    $modules[$filename] = $file->info['name'];
+  }
+  
+  $form['root']['module_whitelist'] = array(
+    '#type' => 'select',
+    '#title' => 'Module White List (Global)',
+    '#multiple' => TRUE,
+    '#options' => $modules,
+    '#size' => 15,
+    '#default_value' => unl_shared_variable_get('unl_module_whitelist', array()),
+  );
 
   return $form;
 }
@@ -47,4 +70,5 @@ function unl_config_submit($form, &$form_state) {
   if (class_exists('Tidy')) {
     variable_set('unl_tidy', $form_state['values']['root']['unl_tidy']);
   }
+  variable_set('unl_module_whitelist', $form_state['values']['root']['module_whitelist']);
 }
diff --git a/sites/all/modules/unl/unl.install b/sites/all/modules/unl/unl.install
index a6836993..b68f6815 100644
--- a/sites/all/modules/unl/unl.install
+++ b/sites/all/modules/unl/unl.install
@@ -376,3 +376,16 @@ function unl_update_7111() {
   db_add_unique_key('unl_sites', 'uri', array('uri'));
   db_add_unique_key('unl_sites', 'db_prefix', array('db_prefix'));
 }
+
+/**
+ * Add the hard-coded white list as the default whitelist.
+ */
+function unl_update_7112() {
+  $modules = array(
+    'aggregator', 'blog', 'book', 'comment', 'translation', 'dashboard', 'forum', 'help', 'list', 'locale', 'number', 'taxonomy', 'trigger', // Core on this line, Contrib below
+    'action_email_role', 'context', 'context_layouts', 'context_ui', 'features', 'unl_news', 'imce', 'imce_mkdir', 'imce_rename', 'menu_block', 'menu_block_export',
+    'form_builder', 'form_builder_webform_ui', 'webform', 'webform_alt_ui',
+    'workbench', 'workbench_access', 'workbench_files', 'workbench_media', 'workbench_moderation'
+  );
+  unl_shared_variable_set('unl_module_whitelist', $modules);
+}
diff --git a/sites/all/modules/unl/unl.module b/sites/all/modules/unl/unl.module
index 777bb0aa..6a02aeb3 100644
--- a/sites/all/modules/unl/unl.module
+++ b/sites/all/modules/unl/unl.module
@@ -620,10 +620,7 @@ function unl_form_field_ui_display_overview_form_alter(&$form, &$form_state, $fo
  */
 function unl_form_system_modules_alter(&$form, &$form_state, $form_id) {
   // Whitelist of modules that Site Admin are allowed to turn on and off on admin/modules
-  $modules = array('aggregator', 'blog', 'book', 'comment', 'translation', 'dashboard', 'forum', 'help', 'list', 'locale', 'number', 'taxonomy', 'trigger', // Core on this line, Contrib below
-                   'action_email_role', 'context', 'context_layouts', 'context_ui', 'features', 'unl_news', 'imce', 'imce_mkdir', 'imce_rename', 'menu_block', 'menu_block_export',
-                   'form_builder', 'form_builder_webform_ui', 'webform', 'webform_alt_ui',
-                   'workbench', 'workbench_access', 'workbench_files', 'workbench_media', 'workbench_moderation');
+  $modules = unl_shared_variable_get('unl_module_whitelist', array());
 
   if (!unl_user_is_administrator() && isset($form['modules'])) {
     foreach ($form['modules'] as $category_name => $category) {
-- 
GitLab