diff --git a/code/email/MailblockMailSubscriber.php b/code/email/MailblockMailSubscriber.php index 63d0286..21309fb 100644 --- a/code/email/MailblockMailSubscriber.php +++ b/code/email/MailblockMailSubscriber.php @@ -44,7 +44,8 @@ public function onMessage(MessageEvent $event): void $overrideConfiguration = $siteConfig->getField('MailblockOverrideConfiguration'); $sendAllTo = Email::getSendAllEmailsTo(); - if ($enabled + if ( + $enabled && ($enabledOnLive || !Director::isLive()) && (!$sendAllTo || $overrideConfiguration) ) { @@ -53,25 +54,29 @@ public function onMessage(MessageEvent $event): void $bccRecipients = []; $subject = $message->getSubject(); - foreach ($message->getTo() as $to) { - $recipients[] = $to->getAddress(); - } - foreach ($message->getCc() as $cc) { - $ccRecipients[] = $cc->getAddress(); - } - foreach ($message->getBcc() as $bcc) { - $bccRecipients[] = $bcc->getAddress(); - } + foreach ($message->getTo() as $to) { + $recipients[] = $to->getAddress(); + } + foreach ($message->getCc() as $cc) { + $ccRecipients[] = $cc->getAddress(); + } + foreach ($message->getBcc() as $bcc) { + $bccRecipients[] = $bcc->getAddress(); + } - $recipients = implode(',', $recipients); - $ccRecipients = implode(',', $ccRecipients); - $bccRecipients = implode(',', $bccRecipients); + $recipients = implode(',', $recipients); + $ccRecipients = implode(',', $ccRecipients); + $bccRecipients = implode(',', $bccRecipients); $mailblockRecipients = $siteConfig->getField('MailblockRecipients'); $subject .= " [addressed to $recipients"; - if ($ccRecipients) $subject .= ", cc to $ccRecipients"; - if ($bccRecipients) $subject .= ", bcc to $bccRecipients"; + if ($ccRecipients) { + $subject .= ", cc to $ccRecipients"; + } + if ($bccRecipients) { + $subject .= ", bcc to $bccRecipients"; + } $subject .= ']'; $message->setSubject($subject); @@ -79,6 +84,7 @@ public function onMessage(MessageEvent $event): void // to the new recipients list. $mailblockWhitelist = $siteConfig->getField('MailblockWhitelist'); $whitelist = !empty($mailblockWhitelist) ? preg_split("/\r\n|\n|\r/", $mailblockWhitelist) : []; + $newRecipients = !empty($mailblockRecipients) ? preg_split("/\r\n|\n|\r/", $mailblockRecipients) : []; $cc = []; $bcc = []; foreach ($whitelist as $whiteListed) { @@ -94,7 +100,6 @@ public function onMessage(MessageEvent $event): void } } } - $newRecipients = !empty($mailblockRecipients) ? preg_split("/\r\n|\n|\r/", $mailblockRecipients) : []; $message->setTo($newRecipients); $message->setBcc($bcc); $message->setCc($cc); diff --git a/code/extensions/MailblockSiteConfig.php b/code/extensions/MailblockSiteConfig.php index fa06e23..580b0b5 100644 --- a/code/extensions/MailblockSiteConfig.php +++ b/code/extensions/MailblockSiteConfig.php @@ -41,47 +41,50 @@ class MailblockSiteConfig extends DataExtension implements PermissionProvider 'MailblockTestBcc' => 'Text', ); - public function validate(ValidationResult $validationResult) { + public function validate(ValidationResult $validationResult) + { $mailblockRecipients = $this->owner->getField('MailblockRecipients'); if (!$this->validateEmailAddresses($mailblockRecipients)) { - $validationResult->addError(_t('Mailblock.RecipientError', + $validationResult->addError(_t( + 'Mailblock.RecipientError', 'There are invalid email addresses in the Recipient(s) field.' )); } $whitelist = $this->owner->getField('MailblockWhitelist'); if (!$this->validateEmailAddresses($whitelist)) { - $validationResult->addError(_t('Mailblock.WhitelistError', + $validationResult->addError(_t( + 'Mailblock.WhitelistError', 'There are invalid email addresses in the Whitelist field.' )); } } - public function updateCMSFields(FieldList $fields) { + public function updateCMSFields(FieldList $fields) + { $subsites = class_exists(Subsite::class); - $onMainSite = TRUE; + $onMainSite = true; $currentSubsiteID = 0; $currentSiteConfig = SiteConfig::current_site_config(); - if($subsites) { + if ($subsites) { $currentSubsiteID = SubsiteState::singleton()->getSubsiteId(); if ($currentSubsiteID) { - $onMainSite = FALSE; + $onMainSite = false; } $mainSiteConfig = SiteConfig::get()->filter('SubsiteID', 0)->first(); - } - else { + } else { $mainSiteConfig = $currentSiteConfig; } // Add mailblock CMS fields. - if(Permission::check('MANAGE_MAILBLOCK') - && ($mainSiteConfig->getField('MailblockApplyPerSubsite') || $onMainSite) + if ( + Permission::check('MANAGE_MAILBLOCK') + && ($mainSiteConfig->getField('MailblockApplyPerSubsite') || $onMainSite) ) { $enabled = $currentSiteConfig->getField('MailblockEnabled'); $tabSet = new TabSet( 'Mailblock', 'Mailblock' - ); $tabSet->setTabs(new FieldList( $settingsTab = $this->basicSettingsFields(), @@ -97,7 +100,7 @@ public function updateCMSFields(FieldList $fields) { 'MailblockRecipients', 'MailblockWhitelist', ); - if($subsites && $currentSubsiteID == 0) { + if ($subsites && $currentSubsiteID == 0) { $hiddenFields[] = 'MailblockApplyPerSubsite'; } foreach ($hiddenFields as $field) { @@ -106,24 +109,25 @@ public function updateCMSFields(FieldList $fields) { } } - public function updateCMSActions(FieldList $actions) { + public function updateCMSActions(FieldList $actions) + { $subsites = class_exists(Subsite::class); - $onMainSite = TRUE; + $onMainSite = true; $currentSubsiteID = 0; $currentSiteConfig = SiteConfig::current_site_config(); - if($subsites) { + if ($subsites) { $currentSubsiteID = SubsiteState::singleton()->getSubsiteId(); if ($currentSubsiteID) { - $onMainSite = FALSE; + $onMainSite = false; } $mainSiteConfig = SiteConfig::get()->filter('SubsiteID', 0)->first(); - } - else { + } else { $mainSiteConfig = $currentSiteConfig; } - if(Permission::check('MANAGE_MAILBLOCK') - && ($mainSiteConfig->getField('MailblockApplyPerSubsite') || $onMainSite) + if ( + Permission::check('MANAGE_MAILBLOCK') + && ($mainSiteConfig->getField('MailblockApplyPerSubsite') || $onMainSite) ) { $testAction = FormAction::create('mailblockTestEmail', 'Send Test Email'); $actions->push($testAction); @@ -135,13 +139,16 @@ public function updateCMSActions(FieldList $actions) { * * @return array */ - public function providePermissions() { + public function providePermissions() + { return array( 'MANAGE_MAILBLOCK' => array( - 'name' => _t('Mailblock.ADMIN_PERMISSION', + 'name' => _t( + 'Mailblock.ADMIN_PERMISSION', 'Access to \'Mailblock\' settings' ), - 'category' => _t('Permission.CMS_ACCESS_CATEGORY', + 'category' => _t( + 'Permission.CMS_ACCESS_CATEGORY', 'CMS Access' ), 'sort' => 100, @@ -149,71 +156,83 @@ public function providePermissions() { ); } - protected function validateEmailAddresses($emails) { + protected function validateEmailAddresses($emails) + { if (!empty($emails)) { $recipients = preg_split("/\r\n|\n|\r/", $emails); foreach ($recipients as $recipient) { if (!Email::is_valid_address($recipient)) { - return FALSE; + return false; } } } - return TRUE; + return true; } - private function basicSettingsFields() { - $tab = Tab::create('BasicSettings', + private function basicSettingsFields() + { + $tab = Tab::create( + 'BasicSettings', CheckboxField::create( 'MailblockEnabled', - _t('Mailblock.Enabled','Enable mailblock.') + _t('Mailblock.Enabled', 'Enable mailblock.') ), TextareaField::create( 'MailblockRecipients', - _t('Mailblock.Recipients', + _t( + 'Mailblock.Recipients', 'Recipient(s) for out-going mail' ) - )->setDescription(_t('Mailblock.RecipientsDescription', + )->setDescription(_t( + 'Mailblock.RecipientsDescription', 'Redirect messages sent via the MailblockMailer to these ' - . 'addresses (one per line).' + . 'addresses (one per line).' )), TextareaField::create( 'MailblockWhitelist', - _t('Mailblock.Whitelist', - 'Whitelist' + _t( + 'Mailblock.Whitelist', + 'Whitelist' ) - )->setDescription(_t('Mailblock.WhitelistDescription', + )->setDescription(_t( + 'Mailblock.WhitelistDescription', 'Permit delivery to these email addresses (one per line). ' )) ); return $tab; } - private function advancedSettingsFields($subsites, $currentSubsiteID) { + private function advancedSettingsFields($subsites, $currentSubsiteID) + { $applyPerSubsite = ''; $enabledOnLive = CheckboxField::create( 'MailblockEnabledOnLive', - _t('Mailblock.EnabledOnLive', + _t( + 'Mailblock.EnabledOnLive', 'Enable mailblock on live site.' ) - )->setDescription(_t('Mailblock.EnabledOnLiveDescription', + )->setDescription(_t( + 'Mailblock.EnabledOnLiveDescription', 'Whether messages sent via the MailblockMailer should be ' - . 'redirected to the below recipient(s). Useful for prelive sites.' - . ' Site is currently ' - . Config::inst()->get(Director::class, 'environment_type') - . ' mode.' + . 'redirected to the below recipient(s). Useful for prelive sites.' + . ' Site is currently ' + . Config::inst()->get(Director::class, 'environment_type') + . ' mode.' )); $overrideConfiguration = CheckboxField::create( 'MailblockOverrideConfiguration', - _t('Mailblock.OverrideConfiguration', + _t( + 'Mailblock.OverrideConfiguration', 'Override configuration settings.' ) - )->setDescription(_t('Mailblock.OverrideConfigurationDescription', + )->setDescription(_t( + 'Mailblock.OverrideConfigurationDescription', 'Whether mailblock should override the hard coded Email class ' - . '\'send_all_emails_to\' configuration setting. Please note ' - . 'that if \'send_all_emails_to\' is set, then the whitelist ' - . 'will not be respected.' + . '\'send_all_emails_to\' configuration setting. Please note ' + . 'that if \'send_all_emails_to\' is set, then the whitelist ' + . 'will not be respected.' )); $tab = Tab::create( @@ -222,16 +241,18 @@ private function advancedSettingsFields($subsites, $currentSubsiteID) { $overrideConfiguration ); - if($subsites && $currentSubsiteID == 0) { + if ($subsites && $currentSubsiteID == 0) { $applyPerSubsite = CheckboxField::create( 'MailblockApplyPerSubsite', - _t('Mailblock.ApplyPerSubsite', + _t( + 'Mailblock.ApplyPerSubsite', 'Apply mailblock settings per subsite.' ) )->setDescription( - _t('Mailblock.ApplyPerSubsiteDescription', + _t( + 'Mailblock.ApplyPerSubsiteDescription', 'If ticked then different mailblock settings appply ' - . 'per subsite rather than globally.' + . 'per subsite rather than globally.' ) ); $tab->push($applyPerSubsite); @@ -240,56 +261,64 @@ private function advancedSettingsFields($subsites, $currentSubsiteID) { return $tab; } - private function testEmailCMSFields($enabled) { + private function testEmailCMSFields($enabled) + { if (!$enabled) { $mailblockWarning = LiteralField::create( 'MailblockWarning', - '

' . _t('Mailblock.Warning', + '

' . _t( + 'Mailblock.Warning', 'WARNING: Mailblock is currently inactive. Email will ' - . 'NOT be redirected.' + . 'NOT be redirected.' ) . '

' ); - } - else { + } else { $mailblockWarning = LiteralField::create('MailblockWarning', ''); } - $tab = Tab::create('TestEmail', + $tab = Tab::create( + 'TestEmail', $mailblockWarning, TextField::create( 'MailblockTestTo', - _t('Mailblock.TestTo', + _t( + 'Mailblock.TestTo', 'To' ) ), TextField::create( 'MailblockTestFrom', - _t('Mailblock.TestFrom', + _t( + 'Mailblock.TestFrom', 'From' ) ), TextField::create( 'MailblockTestCc', - _t('Mailblock.TestCc', + _t( + 'Mailblock.TestCc', 'Cc' ) ), TextField::create( 'MailblockTestBcc', - _t('Mailblock.TestBcc', + _t( + 'Mailblock.TestBcc', 'Bcc' ) ), TextField::create( 'MailblockTestSubject', - _t('Mailblock.TestSubject', + _t( + 'Mailblock.TestSubject', 'Subject' ) ), TextareaField::create( 'MailblockTestBody', - _t('Mailblock.TestBody', + _t( + 'Mailblock.TestBody', 'Body' ) ) diff --git a/code/extensions/MailblockSiteConfigLeftAndMain.php b/code/extensions/MailblockSiteConfigLeftAndMain.php index d2e8384..3d373b0 100644 --- a/code/extensions/MailblockSiteConfigLeftAndMain.php +++ b/code/extensions/MailblockSiteConfigLeftAndMain.php @@ -13,21 +13,23 @@ */ class MailblockSiteConfigLeftAndMain extends LeftAndMainExtension { - public function subsiteCMSShowInMenu(){ + public function subsiteCMSShowInMenu() + { if ($subsites = class_exists(Subsite::class)) { return true; } } - public function init() { + public function init() + { Requirements::javascript("signify-nz/silverstripe-mailblock:javascript/mailblock.js"); } - public function mailblockTestEmail($data, $form){ + public function mailblockTestEmail($data, $form) + { if (class_exists(Subsite::class)) { $siteConfig = SiteConfig::get()->filter('SubsiteID', 0)->first(); - } - else { + } else { $siteConfig = SiteConfig::current_site_config(); } diff --git a/composer.json b/composer.json index 6e23647..2133e6d 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "issues": "http://github.com/signify-nz/silverstripe-mailblock/issues" }, "require": { + "php": ">=8.1", "silverstripe/framework": "^5", "silverstripe/siteconfig": "^5" }, @@ -19,5 +20,15 @@ "expose": [ "javascript" ] + }, + "config": { + "allow-plugins": { + "composer/installers": true, + "silverstripe/vendor-plugin": true + } + }, + "require-dev": { + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.10" } } diff --git a/tests/MailblockMailSubscriberTest.php b/tests/MailblockMailSubscriberTest.php new file mode 100644 index 0000000..a506df3 --- /dev/null +++ b/tests/MailblockMailSubscriberTest.php @@ -0,0 +1,111 @@ +setField('MailblockEnabled', true); + $siteConfig->setField('MailblockRecipients', self::TEST_OVERRIDE); + + $messageEvent = $this->generateTestMessageEvent(); + + $mailSubscriber = new MailblockMailSubscriber(); + $mailSubscriber->onMessage($messageEvent); + + $message = $messageEvent->getMessage(); + + $addressList = array_map(function ($item) { + return $item->getAddress(); + }, $message->getTo()); + + $this->assertEquals( + $message->getSubject(), + sprintf('%s [addressed to %s, cc to %s, bcc to %s]', self::TEST_SUBJECT, self::TEST_TO, self::TEST_CC, self::TEST_BCC) + ); + $this->assertTrue(in_array(self::TEST_OVERRIDE, $addressList)); + $this->assertFalse(in_array(self::TEST_TO, $addressList)); + } + + public function testOverrideFalse() + { + $siteConfig = SiteConfig::current_site_config(); + $siteConfig->setField('MailblockEnabled', false); + $siteConfig->setField('MailblockRecipients', self::TEST_OVERRIDE); + + $messageEvent = $this->generateTestMessageEvent(); + + $mailSubscriber = new MailblockMailSubscriber(); + $mailSubscriber->onMessage($messageEvent); + + $message = $messageEvent->getMessage(); + + $addressList = array_map(function ($item) { + return $item->getAddress(); + }, $message->getTo()); + + $this->assertEquals($message->getSubject(), self::TEST_SUBJECT); + $this->assertTrue(in_array(self::TEST_TO, $addressList)); + $this->assertFalse(in_array(self::TEST_OVERRIDE, $addressList)); + } + + public function testWhitelisting() + { + $siteConfig = SiteConfig::current_site_config(); + $siteConfig->setField('MailblockEnabled', true); + $siteConfig->setField('MailblockRecipients', self::TEST_OVERRIDE); + $siteConfig->setField('MailblockWhitelist', self::TEST_TO); + + $messageEvent = $this->generateTestMessageEvent(); + + $mailSubscriber = new MailblockMailSubscriber(); + $mailSubscriber->onMessage($messageEvent); + + $message = $messageEvent->getMessage(); + + $addressList = array_map(function ($item) { + return $item->getAddress(); + }, $message->getTo()); + + $this->assertTrue(in_array(self::TEST_TO, $addressList)); + $this->assertTrue(in_array(self::TEST_OVERRIDE, $addressList)); + } + + protected function generateTestMessageEvent(): MessageEvent + { + $email = Email::create(); + $email->setSubject(self::TEST_SUBJECT); + $email->setBody(self::TEST_BODY); + $email->setFrom(self::TEST_FROM); + $email->setTo(self::TEST_TO); + $email->setCC(self::TEST_CC); + $email->setBCC(self::TEST_BCC); + + $sender = new Address(self::TEST_FROM); + $recipient = new Address(self::TEST_TO); + $envelope = new Envelope($sender, [$recipient]); + + $messageEvent = new MessageEvent($email, $envelope, ''); + return $messageEvent; + } +} diff --git a/tests/fixtures.yml b/tests/fixtures.yml new file mode 100644 index 0000000..86e9ddb --- /dev/null +++ b/tests/fixtures.yml @@ -0,0 +1,5 @@ +SilverStripe\SiteConfig\SiteConfig: + mysiteconfig: + MailblockEnabled: false + MailblockRecipients: '' + MailblockWhitelist: ''