CRM-11925 - Only run cleanupPermissions/uninstallPermissions if our CMS driver suppor...
authorTim Otten <totten@civicrm.org>
Thu, 7 Mar 2013 09:53:21 +0000 (04:53 -0500)
committerTim Otten <totten@civicrm.org>
Fri, 8 Mar 2013 01:16:26 +0000 (20:16 -0500)
CRM/Core/Config.php
CRM/Core/Permission/Base.php
CRM/Core/Permission/Drupal.php
CRM/Extension/Manager/Module.php

index 875b67994b4d02eac9568ab2b90fcf84ba1367a7..aa45c82ec9d8094d406e9b4ebc004ab9686c7308 100644 (file)
@@ -659,13 +659,34 @@ class CRM_Core_Config extends CRM_Core_Config_Variables {
    */
   function cleanupPermissions() {
     $module_files = CRM_Extension_System::singleton()->getMapper()->getActiveModuleFiles();
-    foreach ($module_files as $module_file) {
-      // Clean up old module permissions that have been removed in the current
-      // module version.
-      $this->userPermissionClass->upgradePermissions(
-        $module_file['prefix'],
-        $this->userPermissionClass->getModulePermissions($module_file['prefix'])
-      );
+    if ($this->userPermissionClass->isModulePermissionSupported()) {
+      // Can store permissions -- so do it!
+      foreach ($module_files as $module_file) {
+        // Consider corner case: Cleaning up old module permissions that have been removed
+        // by unversioned source-code changes.
+        $this->userPermissionClass->upgradePermissions(
+          $module_file['prefix'],
+          $this->userPermissionClass->getModulePermissions($module_file['prefix'])
+        );
+      }
+    } else {
+      // Cannot store permissions -- warn if any modules require them
+      $modules_with_perms = array();
+      foreach ($module_files as $module_file) {
+        $perms = $this->userPermissionClass->getModulePermissions($module_file['prefix']);
+        if (!empty($perms)) {
+          $modules_with_perms[] = $module_file['prefix'];
+        }
+      }
+      if (!empty($modules_with_perms)) {
+        CRM_Core_Session::setStatus(
+          ts('Some modules define permissions, but the CMS cannot store them: %1', array(
+            array(1 => implode(', ', $modules_with_perms))
+          )),
+          ts('Permission Error'),
+          'error'
+        );
+      }
     }
   }
 
index 5f222a8f5a205c4fb24090684a1713f9aaabf020..68bef77ce99e2f36d5295528086535efb13c0a24 100644 (file)
@@ -152,10 +152,22 @@ class CRM_Core_Permission_Base {
     CRM_Core_Error::fatal("this function only works in Drupal 6 at the moment");
   }
 
+  /**
+   * Determine whether the permission store allows us to store
+   * a list of permissions generated dynamically (eg by
+   * hook_civicrm_permissions.)
+   *
+   * @return bool
+   */
+  public function isModulePermissionSupported() {
+    return FALSE;
+  }
+
   /**
    * Remove all vestiges of permissions for the given module.
    */
   function uninstallPermissions($module) {
+    throw new CRM_Core_Exception("Unimplemented method: CRM_Core_Permission_*::uninstallPermissions");
   }
 
   /**
@@ -169,6 +181,7 @@ class CRM_Core_Permission_Base {
    * @see CRM_Core_Permission::getCorePermissions
    */
   function upgradePermissions($module, $modulePermissions) {
+    throw new CRM_Core_Exception("Unimplemented method: CRM_Core_Permission_*::upgradePermissions");
   }
 
   /**
index f2b9a0c65769ab4a8d517d7d7a428b34ec38110f..19750a8e1cb27171a22e0ee325fcbbb4d2328e96 100644 (file)
@@ -84,6 +84,13 @@ class CRM_Core_Permission_Drupal extends CRM_Core_Permission_DrupalBase{
     return FALSE;
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  public function isModulePermissionSupported() {
+    return TRUE;
+  }
+
   /**
    * Remove all vestiges of permissions for the given module.
    */
index 26ad3ca96c7c1ab2a5d70cf1bc6fc76ab735911b..7c2ce4768b64b97de5e9094439982065dece9636 100644 (file)
@@ -69,7 +69,9 @@ class CRM_Extension_Manager_Module extends CRM_Extension_Manager_Base {
   public function onPostUninstall(CRM_Extension_Info $info) {
     // Remove references to the module's permissions.
     $config = CRM_Core_Config::singleton();
-    return $config->userPermissionClass->uninstallPermissions($info->file);
+    if ($config->userPermissionClass->isModulePermissionSupported()) {
+      $config->userPermissionClass->uninstallPermissions($info->file);
+    } // else: don't care because no permissions were installed!
   }
 
   public function onPreDisable(CRM_Extension_Info $info) {