MDL-52818 core: Added CFG->divertallemailsexcept config option

When $CFG->divertallemailsto is specified, this allows a list of email
or domain exceptions to be whitelisted enabling easier testing by groups
of testers who don't share a single email address.
This commit is contained in:
Brendan Heywood
2016-02-09 09:59:20 +00:00
committed by Dan Poltawski
parent 37f77a1b37
commit eca8cf67dc
3 changed files with 99 additions and 1 deletions
+4
View File
@@ -589,6 +589,10 @@ $CFG->admin = 'admin';
// Divert all outgoing emails to this address to test and debug emailing features
// $CFG->divertallemailsto = '[email protected]'; // NOT FOR PRODUCTION SERVERS!
//
// Except for certain email addresses you want to let through for testing. Accepts
// a comma separated list of regexes.
// $CFG->divertallemailsexcept = '[email protected], fred(\+.*)[email protected]'; // NOT FOR PRODUCTION SERVERS!
//
// Uncomment if you want to allow empty comments when modifying install.xml files.
// $CFG->xmldbdisablecommentchecking = true; // NOT FOR PRODUCTION SERVERS!
//
+28 -1
View File
@@ -5433,6 +5433,33 @@ function get_mailer($action='get') {
}
}
/**
* A helper function to test for email diversion
*
* @param string $email
* @return bool Returns true if the email should be diverted
*/
function email_should_be_diverted($email) {
global $CFG;
if (empty($CFG->divertallemailsto)) {
return false;
}
if (empty($CFG->divertallemailsexcept)) {
return true;
}
$patterns = array_map('trim', explode(',', $CFG->divertallemailsexcept));
foreach ($patterns as $pattern) {
if (preg_match("/$pattern/", $email)) {
return false;
}
}
return true;
}
/**
* Send an email to a specified user
*
@@ -5481,7 +5508,7 @@ function email_to_user($user, $from, $subject, $messagetext, $messagehtml = '',
return true;
}
if (!empty($CFG->divertallemailsto)) {
if (email_should_be_diverted($user->email)) {
$subject = "[DIVERTED {$user->email}] $subject";
$user = clone($user);
$user->email = $CFG->divertallemailsto;
+67
View File
@@ -2644,6 +2644,73 @@ class core_moodlelib_testcase extends advanced_testcase {
$this->assertEventContextNotUsed($event);
}
public function diverted_emails_provider() {
return array(
'nodiverts' => array(
'divertallemailsto' => null,
'divertallemailsexcept' => null,
array(
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
),
false,
),
'alldiverts' => array(
'divertallemailsto' => '[email protected]',
'divertallemailsexcept' => null,
array(
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
),
true,
),
'alsodiverts' => array(
'divertallemailsto' => '[email protected]',
'divertallemailsexcept' => '@dev.com, fred(\+.*)[email protected]',
array(
'[email protected]',
'[email protected]',
'[email protected]',
),
true,
),
'divertsexceptions' => array(
'divertallemailsto' => '[email protected]',
'divertallemailsexcept' => '@dev.com, fred(\+.*)[email protected]',
array(
'[email protected]',
'[email protected]',
'[email protected]',
),
false,
),
);
}
/**
* @dataProvider diverted_emails_provider
*/
public function test_email_should_be_diverted($divertallemailsto, $divertallemailsexcept, $addresses, $expected) {
global $CFG;
$this->resetAfterTest();
$CFG->divertallemailsto = $divertallemailsto;
$CFG->divertallemailsexcept = $divertallemailsexcept;
foreach ($addresses as $address) {
$this->assertEquals($expected, email_should_be_diverted($address));
}
}
public function test_email_to_user() {
global $CFG;