From ba2598fae1d2164ce06ba197cc7e86a11f8402b3 Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Mon, 10 Mar 2014 22:20:30 -0500
Subject: [PATCH] lint: Add email address validation

---
 include/class.validator.php          |  3 ++-
 setup/test/tests/test.validation.php | 33 ++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/include/class.validator.php b/include/class.validator.php
index 62ce68153..74e13f983 100644
--- a/include/class.validator.php
+++ b/include/class.validator.php
@@ -137,7 +137,8 @@ class Validator {
     /*** Functions below can be called directly without class instance.
          Validator::func(var..);  (nolint) ***/
     function is_email($email) {
-        return preg_match('/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i',$email);
+        require_once PEAR_DIR.'Mail/RFC822.php';
+        return !PEAR::isError(Mail_RFC822::parseAddressList($email));
     }
     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 942767329..20b1eae9a 100644
--- a/setup/test/tests/test.validation.php
+++ b/setup/test/tests/test.validation.php
@@ -15,6 +15,39 @@ class TestValidation extends Test {
         $this->assert(Validator::is_username('中国期刊全文数据'));
         // Non-letters
         $this->assert(!Validator::is_username('j®red'));
+        // Special chars
+        $this->assert(Validator::is_username('jar.ed'));
+        $this->assert(Validator::is_username('jar_ed'));
+        $this->assert(Validator::is_username('jar-ed'));
+        // Illegals
+        $this->assert(!Validator::is_username('j red'));
+        $this->assert(!Validator::is_username('jared '));
+        $this->assert(!Validator::is_username(' jared'));
+    }
+
+    function testValidEmail() {
+        // Common emails
+        $this->assert(Validator::is_email('jared@domain.tld'));
+        $this->assert(Validator::is_email('jared12@domain.tld'));
+        $this->assert(Validator::is_email('jared.12@domain.tld'));
+        $this->assert(Validator::is_email('jared_12@domain.tld'));
+        $this->assert(Validator::is_email('jared-12@domain.tld'));
+
+        // Very likely illegal
+        $this->assert(!Validator::is_email('jared r@domain.tld'));
+        $this->assert(Validator::is_email('jared@host'));
+
+        // Odd cases, but legal
+        $this->assert(Validator::is_email('jared@[127.0.0.1]'));
+        $this->assert(Validator::is_email('jared@[ipv6:::1]'));
+        $this->assert(Validator::is_email('*@domain.tld'));
+        $this->assert(Validator::is_email("'@domain.tld"));
+        $this->assert(Validator::is_email('"jared r"@domain.tld'));
+
+        // RFC 6530
+        #$this->assert(Validator::is_email('Pelé@example.com'));
+        #$this->assert(Validator::is_email('δοκιμή@παράδειγμα.δοκιμή'));
+        #$this->assert(Validator::is_email('甲斐@黒川.日本'));
     }
 }
 return 'TestValidation';
-- 
GitLab