From c83b83eeae9806cb60ea3f41f2cff055b0c6ed7e Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 17 Aug 2012 09:37:04 -0400
Subject: [PATCH] Fix domain part check in email address validation function. Added test cases.

---
 program/include/rcube_utils.php |    5 ++
 tests/phpunit.xml               |    1 
 tests/Utils.php                 |   74 +++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/program/include/rcube_utils.php b/program/include/rcube_utils.php
index d1a8315..9f18b79 100644
--- a/program/include/rcube_utils.php
+++ b/program/include/rcube_utils.php
@@ -110,6 +110,11 @@
                 }
             }
 
+            // last domain part
+            if (preg_match('/[^a-zA-Z]/', array_pop($domain_array))) {
+                return false;
+            }
+
             $rcube = rcube::get_instance();
 
             if (!$dns_check || !$rcube->config->get('email_dns_check')) {
diff --git a/tests/Utils.php b/tests/Utils.php
new file mode 100644
index 0000000..648b399
--- /dev/null
+++ b/tests/Utils.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * Test class to test rcube_utils class
+ *
+ * @package Tests
+ */
+class Utils extends PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Valid email addresses for test_valid_email()
+     */
+    function data_valid_email()
+    {
+        return array(
+            array('email@domain.com', 'Valid email'),
+            array('firstname.lastname@domain.com', 'Email contains dot in the address field'),
+            array('email@subdomain.domain.com', 'Email contains dot with subdomain'),
+            array('firstname+lastname@domain.com', 'Plus sign is considered valid character'),
+            array('email@123.123.123.123', 'Domain is valid IP address'),
+            array('email@[123.123.123.123]', 'Square bracket around IP address is considered valid'),
+            array('"email"@domain.com', 'Quotes around email is considered valid'),
+            array('1234567890@domain.com', 'Digits in address are valid'),
+            array('email@domain-one.com', 'Dash in domain name is valid'),
+            array('_______@domain.com', 'Underscore in the address field is valid'),
+            array('email@domain.name', '.name is valid Top Level Domain name'),
+            array('email@domain.co.jp', 'Dot in Top Level Domain name also considered valid (use co.jp as example here)'),
+            array('firstname-lastname@domain.com', 'Dash in address field is valid'),
+        );
+    }
+
+    /**
+     * Invalid email addresses for test_invalid_email()
+     */
+    function data_invalid_email()
+    {
+        return array(
+            array('plainaddress', 'Missing @ sign and domain'),
+            array('#@%^%#$@#$@#.com', 'Garbage'),
+            array('@domain.com', 'Missing username'),
+            array('Joe Smith <email@domain.com>', 'Encoded html within email is invalid'),
+            array('email.domain.com', 'Missing @'),
+            array('email@domain@domain.com', 'Two @ sign'),
+            array('.email@domain.com', 'Leading dot in address is not allowed'),
+            array('email.@domain.com', 'Trailing dot in address is not allowed'),
+            array('email..email@domain.com', 'Multiple dots'),
+            array('あいうえお@domain.com', 'Unicode char as address'),
+            array('email@domain.com (Joe Smith)', 'Text followed email is not allowed'),
+            array('email@domain', 'Missing top level domain (.com/.net/.org/etc)'),
+            array('email@-domain.com', 'Leading dash in front of domain is invalid'),
+//            array('email@domain.web', '.web is not a valid top level domain'),
+            array('email@111.222.333.44444', 'Invalid IP format'),
+            array('email@domain..com', 'Multiple dot in the domain portion is invalid'),
+        );
+    }
+
+    /**
+     * @dataProvider data_valid_email
+     */
+    function test_valid_email($email, $title)
+    {
+        $this->assertTrue(rcube_utils::check_email($email, false), $title);
+    }
+
+    /**
+     * @dataProvider data_invalid_email
+     */
+    function test_invalid_email($email, $title)
+    {
+        $this->assertFalse(rcube_utils::check_email($email, false), $title);
+    }
+
+}
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index 4a3b883..cfd066e 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -7,6 +7,7 @@
             <file>MailDecode.php</file>
             <file>MailFunc.php</file>
             <file>ModCss.php</file>
+            <file>Utils.php</file>
             <file>VCards.php</file>
         </testsuite>
     </testsuites>

--
Gitblit v1.9.1