From: Antoine Musso Date: Fri, 21 Jan 2011 18:01:47 +0000 (+0000) Subject: Hack invalid w3 spec to validate @localhost email X-Git-Tag: 1.31.0-rc.0~32448 X-Git-Url: http://git.cyclocoop.org/data/Fool?a=commitdiff_plain;h=4868ccbf3d0fa0302f3525a09915d82068bfa098;p=lhc%2Fweb%2Fwiklou.git Hack invalid w3 spec to validate @localhost email 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 --- diff --git a/includes/User.php b/includes/User.php index 906918c454..184362db91 100644 --- a/includes/User.php +++ b/includes/User.php @@ -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 diff --git a/tests/phpunit/includes/UserIsValidEmailAddrTest.php b/tests/phpunit/includes/UserIsValidEmailAddrTest.php index 2a100a9355..203dfaee3e 100644 --- a/tests/phpunit/includes/UserIsValidEmailAddrTest.php +++ b/tests/phpunit/includes/UserIsValidEmailAddrTest.php @@ -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' ); } }