CRM_Core_Permission_* - Add getAvailablePermision(). Implement on BD/D7/D8/WP.
authorTim Otten <totten@civicrm.org>
Fri, 4 Dec 2020 07:05:25 +0000 (23:05 -0800)
committerTim Otten <totten@civicrm.org>
Wed, 9 Dec 2020 22:24:48 +0000 (14:24 -0800)
CRM/Core/Permission/Backdrop.php
CRM/Core/Permission/Base.php
CRM/Core/Permission/Drupal.php
CRM/Core/Permission/Drupal8.php
CRM/Core/Permission/WordPress.php

index 8226c45a168fb9ad881647038289cf2c6f2f466e..09411c38fa12316ba9046f0446f77f15354e723f 100644 (file)
@@ -98,6 +98,31 @@ class CRM_Core_Permission_Backdrop extends CRM_Core_Permission_DrupalBase {
     return FALSE;
   }
 
+  /**
+   * @inheritDoc
+   */
+  public function getAvailablePermissions() {
+    // We want to list *only* Backdrop perms, so we'll *skip* Civi perms.
+    $allCorePerms = \CRM_Core_Permission::basicPermissions(TRUE);
+
+    $permissions = [];
+    $modules = system_get_info('module');
+    foreach ($modules as $moduleName => $module) {
+      $prefix = isset($module['name']) ? ($module['name'] . ': ') : '';
+      foreach (module_invoke($moduleName, 'permission') as $permName => $perm) {
+        if (isset($allCorePerms[$permName])) {
+          continue;
+        }
+
+        $permissions["Drupal:$permName"] = [
+          'title' => $prefix . strip_tags($perm['title']),
+          'description' => $perm['description'] ?? NULL,
+        ];
+      }
+    }
+    return $permissions;
+  }
+
   /**
    * @inheritDoc
    */
index a49eb88f8a88fdbdc3db9a0698a16e2b38589145..68c2cd53d0bbc22b920c07371be7bbfd1385700b 100644 (file)
@@ -162,6 +162,26 @@ class CRM_Core_Permission_Base {
     return FALSE;
   }
 
+  /**
+   * Get the palette of available permissions in the CMS's user-management system.
+   *
+   * @return array
+   *   List of permissions, keyed by symbolic name. Each item may have fields:
+   *     - title: string
+   *     - description: string
+   *
+   *   The permission-name should correspond to the Civi notation used by
+   *   'CRM_Core_Permission::check()'. For CMS-specific permissions, these are
+   *   translated names (eg "WordPress:list_users" or "Drupal:post comments").
+   *
+   *   The list should include *only* CMS permissions. Exclude Civi-native permissions.
+   *
+   * @see \CRM_Core_Permission_Base::translatePermission()
+   */
+  public function getAvailablePermissions() {
+    return [];
+  }
+
   /**
    * Get all the contact emails for users that have a specific permission.
    *
index 73179d457505f413b310c6c267f7bc2d2577cf31..b179cdf0c3b16b90d9c6fd5d1165a3ffafc656cd 100644 (file)
@@ -97,6 +97,31 @@ class CRM_Core_Permission_Drupal extends CRM_Core_Permission_DrupalBase {
     return FALSE;
   }
 
+  /**
+   * @inheritDoc
+   */
+  public function getAvailablePermissions() {
+    // We want to list *only* Drupal perms, so we'll *skip* Civi perms.
+    $allCorePerms = \CRM_Core_Permission::basicPermissions(TRUE);
+
+    $permissions = [];
+    $modules = system_get_info('module');
+    foreach ($modules as $moduleName => $module) {
+      $prefix = isset($module['name']) ? ($module['name'] . ': ') : '';
+      foreach (module_invoke($moduleName, 'permission') as $permName => $perm) {
+        if (isset($allCorePerms[$permName])) {
+          continue;
+        }
+
+        $permissions["Drupal:$permName"] = [
+          'title' => $prefix . strip_tags($perm['title']),
+          'description' => $perm['description'] ?? NULL,
+        ];
+      }
+    }
+    return $permissions;
+  }
+
   /**
    * @inheritDoc
    */
index 649ff0c53b9c80b6ee01919aa6ebdb034da73d02..e9fa1377d96125d5876e85eb2fd46ae915c37560 100644 (file)
@@ -45,6 +45,38 @@ class CRM_Core_Permission_Drupal8 extends CRM_Core_Permission_DrupalBase {
     return $acct->hasPermission($str);
   }
 
+  /**
+   * Get the palette of available permissions in the CMS's user-management system.
+   *
+   * @return array
+   *   List of permissions, keyed by symbolic name. Each item may have fields:
+   *     - title: string
+   *     - description: string
+   */
+  public function getAvailablePermissions() {
+    // We want to list *only* Drupal perms, so we'll *skip* Civi perms.
+    $allCorePerms = \CRM_Core_Permission::basicPermissions(TRUE);
+
+    $dperms = \Drupal::service('user.permissions')->getPermissions();
+    $modules = system_get_info('module');
+
+    $permissions = [];
+    foreach ($dperms as $permName => $dperm) {
+      if (isset($allCorePerms[$permName])) {
+        continue;
+      }
+
+      $module = $modules[$dperm['provider']] ?? [];
+      $prefix = isset($module['name']) ? ($module['name'] . ': ') : '';
+      $permissions["Drupal:$permName"] = [
+        'title' => $prefix . strip_tags($dperm['title']),
+        'description' => $perm['description'] ?? NULL,
+      ];
+    }
+
+    return $permissions;
+  }
+
   /**
    * Get all the contact emails for users that have a specific permission.
    *
index 9b7f8c9a5be3bfee7c094cd980dd4342f60818f7..3325d0fc117c3f23a4ba3dee0e04cf42b6f4ff6f 100644 (file)
@@ -86,6 +86,36 @@ class CRM_Core_Permission_WordPress extends CRM_Core_Permission_Base {
     return FALSE;
   }
 
+  /**
+   * @inheritDoc
+   */
+  public function getAvailablePermissions() {
+    // We want to list *only* WordPress perms, so we'll *skip* Civi perms.
+    $mungedCorePerms = array_map(
+      function($str) {
+        return CRM_Utils_String::munge(strtolower($str));
+      },
+      array_keys(\CRM_Core_Permission::basicPermissions(TRUE))
+    );
+
+    // WP doesn't have an API to list all capabilities. However, we can discover a
+    // pretty good list by inspecting the (super)admin roles.
+    $wpCaps = [];
+    foreach (wp_roles()->roles as $wpRole) {
+      $wpCaps = array_unique(array_merge(array_keys($wpRole['capabilities']), $wpCaps));
+    }
+
+    $permissions = [];
+    foreach ($wpCaps as $wpCap) {
+      if (!in_array($wpCap, $mungedCorePerms)) {
+        $permissions["WordPress:$wpCap"] = [
+          'title' => "WordPress: $wpCap",
+        ];
+      }
+    }
+    return $permissions;
+  }
+
   /**
    * @inheritDoc
    */