From e2d741284e9232a4be086efb9bcf2cc34e1f3281 Mon Sep 17 00:00:00 2001 From: Jaap Jansma Date: Fri, 15 Apr 2016 15:01:36 +0200 Subject: [PATCH] Fixed CRM-18159: master branch and sending test mail to group did not include an acl yet. --- CRM/Mailing/BAO/Mailing.php | 50 +++++++++++++++++++++++++++---- CRM/Mailing/BAO/MailingJob.php | 54 +++++++++++++++++++++++++++++----- 2 files changed, 92 insertions(+), 12 deletions(-) diff --git a/CRM/Mailing/BAO/Mailing.php b/CRM/Mailing/BAO/Mailing.php index bb3f95e46d..fdf003228b 100644 --- a/CRM/Mailing/BAO/Mailing.php +++ b/CRM/Mailing/BAO/Mailing.php @@ -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 "; diff --git a/CRM/Mailing/BAO/MailingJob.php b/CRM/Mailing/BAO/MailingJob.php index de0ec021f1..20fa926f0e 100644 --- a/CRM/Mailing/BAO/MailingJob.php +++ b/CRM/Mailing/BAO/MailingJob.php @@ -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); -- 2.25.1