From d0112b5dc950b8d0180997b6e6dc71bd66af1ee8 Mon Sep 17 00:00:00 2001
From: Barry Warsaw
Date: Thu, 6 Jan 2011 16:19:00 -0500
Subject: Implement the email address validator as a utility for easier
pluggability.
---
src/mailman/app/lifecycle.py | 10 ++++---
src/mailman/app/membership.py | 4 +--
src/mailman/app/registrar.py | 4 +--
src/mailman/config/configure.zcml | 11 +++++--
src/mailman/email/validate.py | 62 +++++++++++++++++++--------------------
src/mailman/interfaces/address.py | 23 +++++++++++++++
6 files changed, 72 insertions(+), 42 deletions(-)
(limited to 'src/mailman')
diff --git a/src/mailman/app/lifecycle.py b/src/mailman/app/lifecycle.py
index 39ec09aa7..b30266f3b 100644
--- a/src/mailman/app/lifecycle.py
+++ b/src/mailman/app/lifecycle.py
@@ -33,7 +33,7 @@ import logging
from zope.component import getUtility
from mailman.config import config
-from mailman.email.validate import validate
+from mailman.interfaces.address import IEmailValidator
from mailman.interfaces.domain import (
BadDomainSpecificationError, IDomainManager)
from mailman.interfaces.listmanager import IListManager
@@ -58,13 +58,15 @@ def create_list(fqdn_listname, owners=None):
:type owners: list of string email addresses
:return: The new mailing list.
:rtype: `IMailingList`
- :raises `BadDomainSpecificationError`: when the hostname part of
+ :raises BadDomainSpecificationError: when the hostname part of
`fqdn_listname` does not exist.
- :raises `ListAlreadyExistsError`: when the mailing list already exists.
+ :raises ListAlreadyExistsError: when the mailing list already exists.
+ :raises InvalidEmailAddressError: when the fqdn email address is invalid.
"""
if owners is None:
owners = []
- validate(fqdn_listname)
+ # This raises I
+ getUtility(IEmailValidator).validate(fqdn_listname)
# pylint: disable-msg=W0612
listname, domain = fqdn_listname.split('@', 1)
if domain not in getUtility(IDomainManager):
diff --git a/src/mailman/app/membership.py b/src/mailman/app/membership.py
index 8ea8769a6..e8564bc60 100644
--- a/src/mailman/app/membership.py
+++ b/src/mailman/app/membership.py
@@ -33,7 +33,7 @@ from mailman import Utils
from mailman.app.notifications import send_goodbye_message
from mailman.core.i18n import _
from mailman.email.message import OwnerNotification
-from mailman.email.validate import validate
+from mailman.interfaces.address import IEmailValidator
from mailman.interfaces.member import (
AlreadySubscribedError, MemberRole, MembershipIsBannedError,
NotAMemberError)
@@ -67,7 +67,7 @@ def add_member(mlist, email, realname, password, delivery_mode, language):
:raises MembershipIsBannedError: if the membership is not allowed.
"""
# Let's be extra cautious.
- validate(email)
+ getUtility(IEmailValidator).validate(email)
if mlist.members.get_member(email) is not None:
raise AlreadySubscribedError(
mlist.fqdn_listname, email, MemberRole.member)
diff --git a/src/mailman/app/registrar.py b/src/mailman/app/registrar.py
index 181d48126..ec899237a 100644
--- a/src/mailman/app/registrar.py
+++ b/src/mailman/app/registrar.py
@@ -33,7 +33,7 @@ from zope.interface import implements
from mailman.core.i18n import _
from mailman.email.message import UserNotification
-from mailman.email.validate import validate
+from mailman.interfaces.address import IEmailValidator
from mailman.interfaces.listmanager import IListManager
from mailman.interfaces.member import MemberRole
from mailman.interfaces.pending import IPendable, IPendings
@@ -57,7 +57,7 @@ class Registrar:
"""See `IUserRegistrar`."""
# First, do validation on the email address. If the address is
# invalid, it will raise an exception, otherwise it just returns.
- validate(email)
+ getUtility(IEmailValidator).validate(email)
# Create a pendable for the registration.
pendable = PendableRegistration(
type=PendableRegistration.PEND_KEY,
diff --git a/src/mailman/config/configure.zcml b/src/mailman/config/configure.zcml
index a7d12e7a2..bf42d6635 100644
--- a/src/mailman/config/configure.zcml
+++ b/src/mailman/config/configure.zcml
@@ -6,14 +6,14 @@
+
+
diff --git a/src/mailman/email/validate.py b/src/mailman/email/validate.py
index 4eb13eee8..0c4c6a5e0 100644
--- a/src/mailman/email/validate.py
+++ b/src/mailman/email/validate.py
@@ -21,15 +21,18 @@ from __future__ import absolute_import, unicode_literals
__metaclass__ = type
__all__ = [
- 'is_valid',
- 'validate',
+ 'Validator',
]
import re
+from zope.interface import implements
+
+
from mailman.email.utils import split_email
-from mailman.interfaces.address import InvalidEmailAddressError
+from mailman.interfaces.address import (
+ IEmailValidator, InvalidEmailAddressError)
# What other characters should be disallowed?
@@ -37,34 +40,31 @@ _badchars = re.compile(r'[][()<>|;^,\000-\037\177-\377]')
-def validate(address):
- """Validate an email address.
+class Validator:
+ """An email address validator."""
- :param address: An email address.
- :type address: string
- :raise InvalidEmailAddressError: when the address is deemed invalid.
- """
- if not is_valid(address):
- raise InvalidEmailAddressError(repr(address))
+ implements(IEmailValidator)
+ def is_valid(self, email):
+ """See `IEmailValidator`."""
+ if not email or ' ' in email:
+ return False
+ if _badchars.search(email) or email[0] == '-':
+ return False
+ user, domain_parts = split_email(email)
+ # Local, unqualified addresses are not allowed.
+ if not domain_parts:
+ return False
+ if len(domain_parts) < 2:
+ return False
+ return True
-
-def is_valid(address):
- """Check if an email address if valid.
-
- :param address: An email address.
- :type address: string
- :return: A flag indicating whether the email address is okay or not.
- :rtype: bool
- """
- if not address or ' ' in address:
- return False
- if _badchars.search(address) or address[0] == '-':
- return False
- user, domain_parts = split_email(address)
- # Local, unqualified addresses are not allowed.
- if not domain_parts:
- return False
- if len(domain_parts) < 2:
- return False
- return True
+ def validate(self, email):
+ """Validate an email address.
+
+ :param address: An email address.
+ :type address: string
+ :raise InvalidEmailAddressError: when the address is deemed invalid.
+ """
+ if not self.is_valid(email):
+ raise InvalidEmailAddressError(repr(email))
diff --git a/src/mailman/interfaces/address.py b/src/mailman/interfaces/address.py
index 446bae3f3..391eae849 100644
--- a/src/mailman/interfaces/address.py
+++ b/src/mailman/interfaces/address.py
@@ -26,6 +26,7 @@ __all__ = [
'AddressNotLinkedError',
'ExistingAddressError',
'IAddress',
+ 'IEmailValidator',
'InvalidEmailAddressError',
]
@@ -104,3 +105,25 @@ class IAddress(Interface):
preferences = Attribute(
"""This address's preferences.""")
+
+
+
+class IEmailValidator(Interface):
+ """An email validator."""
+
+ def is_valid(email):
+ """Check if an email address if valid.
+
+ :param email: A text email address.
+ :type email: str
+ :return: A flag indicating whether the email address is okay or not.
+ :rtype: bool
+ """
+
+ def validate(email):
+ """Validate an email address.
+
+ :param email: A text email address.
+ :type email: str
+ :raise InvalidEmailAddressError: when `email` is deemed invalid.
+ """
--
cgit v1.2.3-70-g09d2