Fixed CRM-18159: master branch and sending test mail to group did not include an...
authorJaap Jansma <jaap@edeveloper.nl>
Fri, 15 Apr 2016 13:01:36 +0000 (15:01 +0200)
committerdeb.monish <monish.deb@webaccessglobal.com>
Fri, 20 May 2016 10:57:54 +0000 (16:27 +0530)
CRM/Mailing/BAO/Mailing.php
CRM/Mailing/BAO/MailingJob.php

index bb3f95e46d718a927944be5fb50205294442b535..fdf003228bb70f9fcdc5a7d74586843c720b3fd5 100644 (file)
@@ -908,6 +908,40 @@ ORDER BY   i.contact_id, i.{$tempColumn}
     }
   }
 
+  /**
+   * Build a join and where part for a query
+   *
+   * @param $contact_id
+   * @return array - the first key is join part of the query and the second key is the where part of the query
+   */
+  public function buildAcl($contact_id) {
+    $tables = array();
+    $whereTables = array();
+    $whereClause = CRM_ACL_BAO_ACL::whereClause(CRM_Core_Permission::VIEW, $tables, $whereTables, $contact_id);
+    if (strlen($whereClause)) {
+      $whereClause = " AND (".$whereClause.")";
+    }
+
+    $join = "";
+    foreach ($whereTables as $name => $value) {
+      if (!$value) {
+        continue;
+      }
+      if ($value != 1) {
+        // if there is already a join statement in value, use value itself
+        if (strpos($value, 'JOIN')) {
+          $join .= " $value ";
+        }
+        continue;
+      }
+    }
+
+    return array (
+      $join,
+      $whereClause
+    );
+  }
+
   /**
    * Generate an event queue for a test job.
    *
@@ -917,6 +951,10 @@ ORDER BY   i.contact_id, i.{$tempColumn}
    * @return void
    */
   public function getTestRecipients($testParams) {
+    $session = CRM_Core_Session::singleton();
+    $sender_id = $session->get('userID');
+    list($acl_join, $acl_where) = $this->buildAcl($sender_id);
+
     if (array_key_exists($testParams['test_group'], CRM_Core_PseudoConstant::group())) {
       $contacts = civicrm_api('contact', 'get', array(
           'version' => 3,
@@ -934,13 +972,15 @@ SELECT     civicrm_email.id AS email_id,
            civicrm_email.is_primary as is_primary,
            civicrm_email.is_bulkmail as is_bulkmail
 FROM       civicrm_email
-INNER JOIN civicrm_contact ON civicrm_email.contact_id = civicrm_contact.id
+INNER JOIN civicrm_contact contact_a ON civicrm_email.contact_id = contact_a.id
+{$acl_join}
 WHERE      (civicrm_email.is_bulkmail = 1 OR civicrm_email.is_primary = 1)
-AND        civicrm_contact.id = {$groupContact}
-AND        civicrm_contact.do_not_email = 0
-AND        civicrm_contact.is_deceased <> 1
+AND        contact_a.id = {$groupContact}
+AND        contact_a.do_not_email = 0
+AND        contact_a.is_deceased <> 1
 AND        civicrm_email.on_hold = 0
-AND        civicrm_contact.is_opt_out = 0
+AND        contact_a.is_opt_out = 0
+{$acl_where}
 GROUP BY   civicrm_email.id
 ORDER BY   civicrm_email.is_bulkmail DESC
 ";
index de0ec021f1fa910fb9779de95722b9e4bfa1edcc..20fa926f0e430a25e125799422a0d562883ec681 100644 (file)
@@ -477,6 +477,40 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
     }
   }
 
+  /**
+   * Build a join and where part for a query
+   *
+   * @param $contact_id
+   * @return array - the first key is join part of the query and the second key is the where part of the query
+   */
+  public function buildAcl($contact_id) {
+    $tables = array();
+    $whereTables = array();
+    $whereClause = CRM_ACL_BAO_ACL::whereClause(CRM_Core_Permission::VIEW, $tables, $whereTables, $contact_id);
+    if (strlen($whereClause)) {
+      $whereClause = " AND (".$whereClause.")";
+    }
+
+    $join = "";
+    foreach ($whereTables as $name => $value) {
+      if (!$value) {
+        continue;
+      }
+      if ($value != 1) {
+        // if there is already a join statement in value, use value itself
+        if (strpos($value, 'JOIN')) {
+          $join .= " $value ";
+        }
+        continue;
+      }
+    }
+
+    return array (
+      $join,
+      $whereClause
+    );
+  }
+
   /**
    * Send the mailing.
    *
@@ -499,6 +533,8 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
     $edTable = CRM_Mailing_Event_BAO_Delivered::getTableName();
     $ebTable = CRM_Mailing_Event_BAO_Bounce::getTableName();
 
+    list($acl_join, $acl_where) = $this->buildAcl($mailing->created_id);
+
     $query = "  SELECT      $eqTable.id,
                                 $emailTable.email as email,
                                 $eqTable.contact_id,
@@ -507,16 +543,18 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
                     FROM        $eqTable
                     INNER JOIN  $emailTable
                             ON  $eqTable.email_id = $emailTable.id
-                    INNER JOIN  $contactTable
-                            ON  $contactTable.id = $emailTable.contact_id
+                    INNER JOIN  $contactTable contact_a
+                            ON  contact_a.id = $emailTable.contact_id
                     LEFT JOIN   $edTable
                             ON  $eqTable.id = $edTable.event_queue_id
                     LEFT JOIN   $ebTable
                             ON  $eqTable.id = $ebTable.event_queue_id
+                    $acl_join
                     WHERE       $eqTable.job_id = " . $this->id . "
                         AND     $edTable.id IS null
                         AND     $ebTable.id IS null
-                        AND    $contactTable.is_opt_out = 0";
+                        AND    contact_a.is_opt_out = 0 
+                        $acl_where";
 
     if ($mailing->sms_provider_id) {
       $query = "
@@ -528,17 +566,19 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
                     FROM        $eqTable
                     INNER JOIN  $phoneTable
                             ON  $eqTable.phone_id = $phoneTable.id
-                    INNER JOIN  $contactTable
-                            ON  $contactTable.id = $phoneTable.contact_id
+                    INNER JOIN  $contactTable contact_a
+                            ON  contact_a.id = $phoneTable.contact_id
                     LEFT JOIN   $edTable
                             ON  $eqTable.id = $edTable.event_queue_id
                     LEFT JOIN   $ebTable
                             ON  $eqTable.id = $ebTable.event_queue_id
+                    $acl_join
                     WHERE       $eqTable.job_id = " . $this->id . "
                         AND     $edTable.id IS null
                         AND     $ebTable.id IS null
-                        AND    ( $contactTable.is_opt_out = 0
-                        OR       $contactTable.do_not_sms = 0 )";
+                        AND    ( contact_a.is_opt_out = 0
+                        OR       contact_a.do_not_sms = 0 )
+                        $acl_where}";
     }
     $eq->query($query);