diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 06c56f06c..b631fc48f 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -2,6 +2,7 @@ import decimal import itertools import re +import socket import time import uuid import warnings @@ -154,21 +155,105 @@ class EmailField(StringField): .. versionadded:: 0.4 """ + USER_REGEX = re.compile( + # `dot-atom` defined in RFC 5322 Section 3.2.3. + r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*\Z" + # `quoted-string` defined in RFC 5322 Section 3.2.4. + r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)', + re.IGNORECASE + ) + + UTF8_USER_REGEX = re.compile( + six.u( + # RFC 6531 Section 3.3 extends `atext` (used by dot-atom) to + # include `UTF8-non-ascii`. + r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z\u0080-\U0010FFFF]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z\u0080-\U0010FFFF]+)*\Z" + # `quoted-string` + r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)' + ), re.IGNORECASE | re.UNICODE + ) - EMAIL_REGEX = re.compile( - # dot-atom - r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" - # quoted-string - r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' - # domain (max length of an ICAAN TLD is 22 characters) - r')@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}|[A-Z0-9-]{2,}(?