diff --git a/config-dist.php b/config-dist.php index 4e25abaae6a..0d9dc8f7ebe 100644 --- a/config-dist.php +++ b/config-dist.php @@ -170,6 +170,13 @@ $CFG->admin = 'admin'; // Seconds for files to remain in caches. Decrease this if you are worried // about students being served outdated versions of uploaded files. // $CFG->filelifetime = 86400; +// +// The following two settings allow you to specify allowed domains for +// email addresses. If the first one is set, then Moodle will DISALLOW +// all domains EXCEPT those listed. Otherwise, if the second one is set +// then all addresses are ALLOWED EXCEPT those listed. +// $CFG->allowemailaddresses = "myschool.edu.au hotmail.com"; +// $CFG->denyemailaddresses = "hotmail.com yahoo.com"; //========================================================================= // ALL DONE! To continue installation, visit your main page with a browser diff --git a/lang/en/moodle.php b/lang/en/moodle.php index c8158c176c3..3c6a264d44b 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -372,6 +372,8 @@ $string['emailenableclick'] = 'Click here to re-enable all email being sent to t $string['emailexists'] = 'This email address is already registered.'; $string['emailformat'] = 'Email format'; $string['emailmustbereal'] = 'Note: your email address must be a real one'; +$string['emailnotallowed'] = 'Email addresses in these domains are not allowed ($a)'; +$string['emailonlyallowed'] = 'This email is not one of those that are allowed ($a)'; $string['emailpasswordconfirmation'] = 'Hi $a->firstname, Someone (probably you) has requested a new password for your diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 47f4a1344ad..f375962c5ce 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -752,6 +752,12 @@ function create_user_record($username, $password, $auth='') { } } + if (!empty($newuser->email)) { + if (email_is_not_allowed($newuser->email)) { + unset($newuser->email); + } + } + $newuser->auth = (empty($auth)) ? $CFG->auth : $auth; $newuser->username = $username; $newuser->password = md5($password); @@ -1630,6 +1636,40 @@ function send_password_change_confirmation_email($user) { } +function email_is_not_allowed($email) { +/// Check that an email is allowed. It returns an error message if there +/// was a problem. + + global $CFG; + + if (!empty($CFG->allowemailaddresses)) { + $allowed = explode(' ', $CFG->allowemailaddresses); + foreach ($allowed as $allowedpattern) { + $allowedpattern = trim($allowedpattern); + if (!$allowedpattern) { + continue; + } + if (strpos($email, $allowedpattern) !== false) { // Match! + return false; + } + } + return get_string("emailonlyallowed", '', $CFG->allowemailaddresses); + + } else if (!empty($CFG->denyemailaddresses)) { + $denied = explode(' ', $CFG->denyemailaddresses); + foreach ($denied as $deniedpattern) { + $deniedpattern = trim($deniedpattern); + if (!$deniedpattern) { + continue; + } + if (strpos($email, $deniedpattern) !== false) { // Match! + return get_string("emailnotallowed", '', $CFG->denyemailaddresses); + } + } + } + + return false; +} /// FILE HANDLING ///////////////////////////////////////////// diff --git a/login/signup.php b/login/signup.php index 6385bd35af7..5b06e1bce0c 100644 --- a/login/signup.php +++ b/login/signup.php @@ -146,6 +146,12 @@ function validate_form($user, &$err) { $err->country = get_string("missingcountry"); } + if (empty($err->email)) { + if ($error = email_is_not_allowed($user->email)) { + $err->email = $error; + } + } + return; } diff --git a/user/edit.php b/user/edit.php index 96e6c76c417..ead4e64782a 100644 --- a/user/edit.php +++ b/user/edit.php @@ -246,15 +246,21 @@ function find_form_errors(&$user, &$usernew, &$err) { if (empty($usernew->country)) $err["country"] = get_string("missingcountry"); - if (! validate_email($usernew->email)) + if (! validate_email($usernew->email)) { $err["email"] = get_string("invalidemail"); - else if ($otheruser = get_record("user", "email", $usernew->email)) { + } else if ($otheruser = get_record("user", "email", $usernew->email)) { if ($otheruser->id <> $user->id) { $err["email"] = get_string("emailexists"); } } + if (empty($err["email"]) and !isadmin()) { + if ($error = email_is_not_allowed($usernew->email)) { + $err["email"] = $error; + } + } + $user->email = $usernew->email; return count($err);