Hack invalid w3 spec to validate @localhost email
authorAntoine Musso <hashar@users.mediawiki.org>
Fri, 21 Jan 2011 18:01:47 +0000 (18:01 +0000)
committerAntoine Musso <hashar@users.mediawiki.org>
Fri, 21 Jan 2011 18:01:47 +0000 (18:01 +0000)
In r75682, I have implemented a PHP function to validate email address
based on bug 22449.  Siebrand pointed a w3.org specification which I
implemented. The spec is bugged since it requires a domain and a top
level domain!

I could either make the first part optional or alter the second part
to require 0 to x elements.  I choose the later: s/+/*/

Should fix bug 22449 for good.

TESTS:

Added testEmailDoesNotNeedATopLevelDomain:

Made following emails valid:
  user.@localdaomin
  .@localdomain
  user@a

Test output (please add more):
$ php phpunit.php -c suite.xml --filter alidEmail --tap
TAP version 13
ok 1 - UserIsValidEmailAddrTest::testEmailWellKnownUserAtHostDotTldAreValid
ok 2 - UserIsValidEmailAddrTest::testEmailWithUpperCaseCharactersAreValid
ok 3 - UserIsValidEmailAddrTest::testEmailWithAPlusInUserName
ok 4 - UserIsValidEmailAddrTest::testEmailDoesNotNeedATopLevelDomain
ok 5 - UserIsValidEmailAddrTest::testEmailWithWhiteSpacesBeforeOrAfterAreInvalids
ok 6 - UserIsValidEmailAddrTest::testEmailWithWhiteSpacesAreInvalids
ok 7 - UserIsValidEmailAddrTest::testEmailDomainCanNotBeginWithDot
ok 8 - UserIsValidEmailAddrTest::testEmailWithFunnyCharacters
ok 9 - UserIsValidEmailAddrTest::testEmailTopLevelDomainCanBeNumerical
ok 10 - UserIsValidEmailAddrTest::testEmailWithoutAtSignIsInvalid
ok 11 - UserIsValidEmailAddrTest::testEmailWithOneCharacterDomainIsValid
1..11

includes/User.php
tests/phpunit/includes/UserIsValidEmailAddrTest.php

index 906918c..184362d 100644 (file)
@@ -660,7 +660,7 @@ class User {
                [$rfc5322_atext\\.]+    # user part which is liberal :p
                @                      # 'apostrophe'
                [$rfc1034_ldh_str]+       # First domain part
-               (\\.[$rfc1034_ldh_str]+)+  # Following part prefixed with a dot
+               (\\.[$rfc1034_ldh_str]+)*  # Following part prefixed with a dot
                $                      # End of string
                /ix" ; // case Insensitive, eXtended
 
index 2a100a9..203dfae 100644 (file)
@@ -3,6 +3,7 @@
 class UserIsValidEmailAddrTest extends MediaWikiTestCase {
 
        private function checkEmail( $addr, $expected = true, $msg = '') {
+               if( $msg == '' ) { $msg = "Testing $addr"; }
                $this->assertEquals(
                        $expected,
                        User::isValidEmailAddr( $addr ),
@@ -30,6 +31,11 @@ class UserIsValidEmailAddrTest extends MediaWikiTestCase {
                $this->valid( 'user+sub@example.com' );
                $this->valid( 'user+@example.com' );
        }
+       function testEmailDoesNotNeedATopLevelDomain() {
+               $this->valid( "user@localhost" );
+               $this->valid( "FooBar@localdomain" );
+               $this->valid( "nobody@mycompany" );
+       }
        function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
                $this->invalid( " user@host.com" );
                $this->invalid( "user@host.com " );
@@ -45,8 +51,8 @@ class UserIsValidEmailAddrTest extends MediaWikiTestCase {
                $this->invalid( "user@." );
                $this->invalid( "user@.localdomain" );
                $this->invalid( "user@localdomain." );
-               $this->invalid( "user.@localdomain" );
-               $this->invalid( ".@localdomain" );
+               $this->valid( "user.@localdomain" );
+               $this->valid( ".@localdomain" );
                $this->invalid( ".@a............" );
        }
        function testEmailWithFunnyCharacters() {
@@ -58,7 +64,7 @@ class UserIsValidEmailAddrTest extends MediaWikiTestCase {
        function testEmailWithoutAtSignIsInvalid() {
                $this->invalid( 'useràexample.com' );
        }
-       function testEmailWithOneCharacterDomainIsInvalid() {
-               $this->invalid( 'user@a' );
+       function testEmailWithOneCharacterDomainIsValid() {
+               $this->valid( 'user@a' );
        }
 }