From b612f375f54e50e9adac88b782d604b7d1f6df93 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Wed, 17 Jan 2024 14:36:55 -0800 Subject: [PATCH] ListUnsubscribe - Fix VERP parsing (alternate separators; optional localpart-prefix) --- CRM/Mailing/Service/ListUnsubscribe.php | 4 +++- .../phpunit/CRM/Mailing/BaseMailingSystemTest.php | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CRM/Mailing/Service/ListUnsubscribe.php b/CRM/Mailing/Service/ListUnsubscribe.php index 5439047895..32d9c57643 100644 --- a/CRM/Mailing/Service/ListUnsubscribe.php +++ b/CRM/Mailing/Service/ListUnsubscribe.php @@ -41,7 +41,9 @@ class CRM_Mailing_Service_ListUnsubscribe extends \Civi\Core\Service\AutoService return; } - if (!preg_match(';^$;', $params['List-Unsubscribe'], $m)) { + $sep = preg_quote(Civi::settings()->get('verpSeparator'), ';'); + $regex = ";^]*u{$sep}(\d+){$sep}(\d+){$sep}(\w*)@(.+)>$;"; + if (!preg_match($regex, $params['List-Unsubscribe'], $m)) { \Civi::log()->warning('Failed to set final value of List-Unsubscribe'); return; } diff --git a/tests/phpunit/CRM/Mailing/BaseMailingSystemTest.php b/tests/phpunit/CRM/Mailing/BaseMailingSystemTest.php index b401711d69..9f958015c9 100644 --- a/tests/phpunit/CRM/Mailing/BaseMailingSystemTest.php +++ b/tests/phpunit/CRM/Mailing/BaseMailingSystemTest.php @@ -41,6 +41,7 @@ abstract class CRM_Mailing_BaseMailingSystemTest extends CiviUnitTestCase { parent::setUp(); $this->useTransaction(); CRM_Mailing_BAO_MailingJob::$mailsProcessed = 0; + CRM_Core_BAO_MailSettings::defaultDAO(TRUE); $this->_groupID = $this->groupCreate(); $this->createContactsInGroup(2, $this->_groupID); @@ -141,6 +142,19 @@ abstract class CRM_Mailing_BaseMailingSystemTest extends CiviUnitTestCase { $this->assertEquals(2, $getMembers('Removed')->count()); } + public function testHttpUnsubscribe_altVerp(): void { + CRM_Core_DAO::executeQuery('UPDATE civicrm_mail_settings SET localpart = "aeiou.aeiou-"'); + CRM_Core_BAO_MailSettings::defaultDAO(TRUE); + + try { + Civi::settings()->set('verpSeparator', '-'); + $this->testHttpUnsubscribe(); + } + finally { + $this->revertSetting('verpSeparator'); + } + } + /** * Generate a fully-formatted mailing (with body_text content). */ -- 2.25.1