diff --git a/include/class.validator.php b/include/class.validator.php index c5cd2283eb362a58325e6291a3d2c5f245816116..28bf61c2b90f917c97b31a2b6bf049b2b7668299 100644 --- a/include/class.validator.php +++ b/include/class.validator.php @@ -140,13 +140,23 @@ class Validator { /*** Functions below can be called directly without class instance. Validator::func(var..); (nolint) ***/ - function is_email($email) { - if (strpos($email, '@') === false) - return false; - + function is_email($email, $list=false) { require_once 'Mail/RFC822.php'; require_once 'PEAR.php'; - return !PEAR::isError(Mail_RFC822::parseAddressList($email)); + if (!($mails = Mail_RFC822::parseAddressList($email)) || PEAR::isError($mails)) + return false; + + if (!$list && count($mails) > 1) + return false; + + foreach ($mails as $m) { + if (!$m->mailbox) + return false; + if ($m->host == 'localhost') + return false; + } + + return true; } function is_phone($phone) { /* We're not really validating the phone number but just making sure it doesn't contain illegal chars and of acceptable len */ diff --git a/setup/test/tests/test.validation.php b/setup/test/tests/test.validation.php index 27e61af8438a4fc8a75bcb3003013af6ab56801d..bce9fe85505d08e41251fc127e230bba9f775394 100644 --- a/setup/test/tests/test.validation.php +++ b/setup/test/tests/test.validation.php @@ -37,6 +37,9 @@ class TestValidation extends Test { // Illegal or unsupported $this->assert(!Validator::is_email('jared r@domain.tld')); $this->assert(!Validator::is_email('jared')); + $this->assert(!Validator::is_email('jared@')); + $this->assert(!Validator::is_email('@domain.tld')); + $this->assert(!Validator::is_email('@domain.tld, @domain2.tld')); // Odd cases, but legal $this->assert(Validator::is_email('jared@host'));