From aa5d307da65cb0933172c9640efeb44d94323be5 Mon Sep 17 00:00:00 2001
From: Aymeric Augustin <aymeric.augustin@m4x.org>
Date: Sat, 7 Jan 2012 18:43:46 +0000
Subject: [PATCH] Fixed #17100 -- Typo in the regex for EmailValidator. Thanks
 reames AT asymmetricventures com for the report and Claude Paroz for the
 patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17349 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/core/validators.py            | 3 ++-
 tests/modeltests/validators/tests.py | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/django/core/validators.py b/django/core/validators.py
index 69e60ebcb3..95224e9de9 100644
--- a/django/core/validators.py
+++ b/django/core/validators.py
@@ -158,7 +158,8 @@ class EmailValidator(RegexValidator):
 
 email_re = re.compile(
     r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
-    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
+    # quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
+    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"'
     r')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$)'  # domain
     r'|\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]$', re.IGNORECASE)  # literal form, ipv4 address (SMTP 4.1.3)
 validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')
diff --git a/tests/modeltests/validators/tests.py b/tests/modeltests/validators/tests.py
index 9e254b9b90..a1a48bf97c 100644
--- a/tests/modeltests/validators/tests.py
+++ b/tests/modeltests/validators/tests.py
@@ -30,6 +30,9 @@ TEST_DATA = (
     (validate_email, 'a @x.cz', ValidationError),
     (validate_email, 'something@@somewhere.com', ValidationError),
     (validate_email, 'email@127.0.0.1', ValidationError),
+    # Quoted-string format (CR not allowed)
+    (validate_email, '"\\\011"@here.com', None),
+    (validate_email, '"\\\012"@here.com', ValidationError),
 
     (validate_slug, 'slug-ok', None),
     (validate_slug, 'longer-slug-still-ok', None),