Extract case activity permission check.
authoreileen <emcnaughton@wikimedia.org>
Thu, 18 Oct 2018 04:06:05 +0000 (17:06 +1300)
committereileen <emcnaughton@wikimedia.org>
Thu, 18 Oct 2018 04:06:05 +0000 (17:06 +1300)
This is part of refactoring to address duplicate queries for permission checks - no change
in this commit other than an extraction

CRM/Activity/BAO/Activity.php

index cfa988f28b713052574aac22afc51eef88e1660f..486426d0a1b2400b61ed9ed9782a32aa73172fc7 100644 (file)
@@ -2708,6 +2708,13 @@ AND cl.modified_id  = c.id
     if (!$activity->find(TRUE)) {
       return FALSE;
     }
+
+    // Return early when it is case activity.
+    // Check for CiviCase related permission.
+    if (CRM_Case_BAO_Case::isCaseActivity($activityId)) {
+      return self::isContactPermittedAccessToCaseActivity($activityId, $action, $activity->activity_type_id);
+    }
+
     $allow = FALSE;
     // Component related permissions.
     $compPermissions = array(
@@ -2726,33 +2733,6 @@ AND cl.modified_id  = c.id
       'CiviCampaign' => array('administer CiviCampaign'),
     );
 
-    // Return early when it is case activity.
-    $isCaseActivity = CRM_Case_BAO_Case::isCaseActivity($activityId);
-    // Check for civicase related permission.
-    if ($isCaseActivity) {
-      $allow = FALSE;
-      foreach ($compPermissions['CiviCase'] as $per) {
-        if (CRM_Core_Permission::check($per)) {
-          $allow = TRUE;
-          break;
-        }
-      }
-
-      // Check for case specific permissions.
-      if ($allow) {
-        $oper = 'view';
-        if ($action == CRM_Core_Action::UPDATE) {
-          $oper = 'edit';
-        }
-        $allow = CRM_Case_BAO_Case::checkPermission($activityId,
-          $oper,
-          $activity->activity_type_id
-        );
-      }
-
-      return $allow;
-    }
-
     // First check the component permission.
     $sql = "
     SELECT  component_id
@@ -2835,6 +2815,39 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
     return $allow;
   }
 
+  /**
+   * Check if the logged in user has permission for the given case activity.
+   *
+   * @param int $activityId
+   * @param int $action
+   * @param int $activityTypeID
+   *
+   * @return bool
+   */
+  protected static function isContactPermittedAccessToCaseActivity($activityId, $action, $activityTypeID) {
+    $allow = FALSE;
+    foreach (['administer CiviCase', 'access my cases and activities', 'access all cases and activities'] as $per) {
+      if (CRM_Core_Permission::check($per)) {
+        $allow = TRUE;
+        break;
+      }
+    }
+
+    // Check for case specific permissions.
+    if ($allow) {
+      $oper = 'view';
+      if ($action == CRM_Core_Action::UPDATE) {
+        $oper = 'edit';
+      }
+      $allow = CRM_Case_BAO_Case::checkPermission($activityId,
+        $oper,
+        $activityTypeID
+      );
+    }
+
+    return $allow;
+  }
+
   /**
    * Checks if user has permissions to edit inbound e-mails, either bsic info
    * or both basic information and content.