CRM-15856 - Mailing BAO - Only validate tokens when calling through API
authorTim Otten <totten@civicrm.org>
Tue, 10 Feb 2015 12:47:22 +0000 (04:47 -0800)
committerTim Otten <totten@civicrm.org>
Wed, 11 Feb 2015 16:50:53 +0000 (08:50 -0800)
The test suite relies on CRM_Mailing_BAO_Spool to log test messages -- which
(surprisingly, bizarrely) puts them in civicrm_mailing; thus, enforcing
required tokens broke lots of test cases that have nothing to do with
CiviMail.

CRM/Mailing/BAO/Mailing.php
api/v3/Mailing.php

index ee427d4c9756cd68f240a9a2bf8e50c164a77347..8fb0bb55b03147f2f4c79672edb7273c2bba35a3 100644 (file)
@@ -1583,6 +1583,20 @@ ORDER BY   civicrm_email.is_bulkmail DESC
    * Construct a new mailing object, along with job and mailing_group
    * objects, from the form values of the create mailing wizard.
    *
+   * This function is a bit evil. It not only merges $params and saves
+   * the mailing -- it also schedules the mailing and chooses the recipients.
+   * Since it merges $params, it's also the only place to correctly trigger
+   * multi-field validation. It should be broken up.
+   *
+   * In the mean time, use-cases which break under the weight of this
+   * evil may find reprieve in these extra evil params:
+   *
+   *  - _skip_evil_bao_auto_recipients_: bool
+   *  - _skip_evil_bao_auto_schedule_: bool
+   *  - _evil_bao_validator_: string|callable
+   *
+   * </twowrongsmakesaright>
+   *
    * @params array $params
    *   Form values.
    *
@@ -1591,6 +1605,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
    *
    * @return object
    *   $mailing      The new mailing object
+   * @throws \Exception
    */
   public static function create(&$params, $ids = array()) {
 
@@ -1704,8 +1719,9 @@ ORDER BY   civicrm_email.is_bulkmail DESC
     CRM_Core_BAO_File::processAttachment($params, 'civicrm_mailing', $mailing->id);
 
     // If we're going to autosend, then check validity before saving.
-    if (!empty($params['scheduled_date']) && $params['scheduled_date'] != 'null') {
-      $errors = static::checkSendable($mailing);
+    if (!empty($params['scheduled_date']) && $params['scheduled_date'] != 'null' && !empty($params['_evil_bao_validator_'])) {
+      $cb = Civi\Core\Resolver::singleton()->get($params['_evil_bao_validator_']);
+      $errors = call_user_func($cb, $mailing);
       if (!empty($errors)) {
         $fields = implode(',', array_keys($errors));
         throw new CRM_Core_Exception("Mailing cannot be sent. There are missing or invalid fields ($fields).", 'cannot-send', $errors);
@@ -1716,7 +1732,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
 
     // Create parent job if not yet created.
     // Condition on the existence of a scheduled date.
-    if (!empty($params['scheduled_date']) && $params['scheduled_date'] != 'null') {
+    if (!empty($params['scheduled_date']) && $params['scheduled_date'] != 'null' && empty($params['_skip_evil_bao_auto_schedule_'])) {
       $job = new CRM_Mailing_BAO_MailingJob();
       $job->mailing_id = $mailing->id;
       $job->status = 'Scheduled';
index 58d6213996439bd7ede8934e71350f572e32a381..74cf9e209de9214e37011c7640eed74fba8ab39d 100755 (executable)
@@ -58,6 +58,7 @@ function civicrm_api3_mailing_create($params) {
       unset($params['approval_note']);
     }
   }
+  $params['_evil_bao_validator_'] = 'CRM_Mailing_BAO_Mailing::checkSendable';
   return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 }