summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mailman/Archiver/HyperArch.py1
-rw-r--r--mailman/Archiver/pipermail.py6
-rw-r--r--mailman/Utils.py11
-rw-r--r--mailman/app/lifecycle.py15
-rw-r--r--mailman/app/membership.py4
-rw-r--r--mailman/app/moderator.py4
-rw-r--r--mailman/bin/__init__.py1
-rw-r--r--mailman/bin/add_members.py4
-rw-r--r--mailman/bin/bumpdigests.py4
-rw-r--r--mailman/bin/change_pw.py177
-rw-r--r--mailman/bin/config_list.py8
-rw-r--r--mailman/bin/create_list.py6
-rw-r--r--mailman/bin/disabled.py4
-rw-r--r--mailman/bin/export.py4
-rw-r--r--mailman/bin/find_member.py4
-rw-r--r--mailman/bin/import.py4
-rw-r--r--mailman/bin/list_members.py4
-rw-r--r--mailman/bin/remove_list.py1
-rw-r--r--mailman/bin/withlist.py3
-rw-r--r--mailman/configuration.py6
-rw-r--r--mailman/core/__init__.py0
-rw-r--r--mailman/core/errors.py (renamed from mailman/Errors.py)0
-rw-r--r--mailman/database/listmanager.py1
-rw-r--r--mailman/docs/bounces.txt2
-rw-r--r--mailman/interfaces/member.py2
-rw-r--r--mailman/passwords.py4
-rw-r--r--mailman/pipeline/acknowledge.py1
-rw-r--r--mailman/pipeline/calculate_recipients.py4
-rw-r--r--mailman/pipeline/decorate.py1
-rw-r--r--mailman/pipeline/file_recipients.py1
-rw-r--r--mailman/pipeline/mime_delete.py8
-rw-r--r--mailman/pipeline/moderate.py12
-rw-r--r--mailman/pipeline/scrubber.py2
-rw-r--r--mailman/pipeline/smtp_direct.py4
-rw-r--r--mailman/pipeline/to_digest.py6
-rw-r--r--mailman/queue/outgoing.py4
-rw-r--r--mailman/tests/test_membership.py2
-rw-r--r--mailman/tests/test_passwords.py10
-rw-r--r--mailman/tests/test_security_mgr.py1
39 files changed, 77 insertions, 259 deletions
diff --git a/mailman/Archiver/HyperArch.py b/mailman/Archiver/HyperArch.py
index a376279cb..52a0bfa50 100644
--- a/mailman/Archiver/HyperArch.py
+++ b/mailman/Archiver/HyperArch.py
@@ -43,7 +43,6 @@ from email.Errors import HeaderParseError
from email.Header import decode_header, make_header
from locknix.lockfile import Lock
-from mailman import Errors
from mailman import Utils
from mailman import i18n
from mailman.Archiver import HyperDatabase
diff --git a/mailman/Archiver/pipermail.py b/mailman/Archiver/pipermail.py
index a7c4e3a98..19bc05c3f 100644
--- a/mailman/Archiver/pipermail.py
+++ b/mailman/Archiver/pipermail.py
@@ -17,8 +17,8 @@ __version__ = '0.11 (Mailman edition)'
VERSION = __version__
CACHESIZE = 100 # Number of slots in the cache
-from mailman import Errors
from mailman.Mailbox import ArchiverMailbox
+from mailman.core import errors
from mailman.i18n import _
SPACE = ' '
@@ -548,7 +548,7 @@ class T:
while counter < start:
try:
m = mbox.next()
- except Errors.DiscardMessage:
+ except errors.DiscardMessage:
continue
if m is None:
return
@@ -557,7 +557,7 @@ class T:
try:
pos = input.tell()
m = mbox.next()
- except Errors.DiscardMessage:
+ except errors.DiscardMessage:
continue
except Exception:
log.error('uncaught archiver exception at filepos: %s', pos)
diff --git a/mailman/Utils.py b/mailman/Utils.py
index 7975cb9d3..178fff538 100644
--- a/mailman/Utils.py
+++ b/mailman/Utils.py
@@ -40,10 +40,11 @@ from email.Errors import HeaderParseError
from string import ascii_letters, digits, whitespace
import mailman.templates
-from mailman import Errors
+
from mailman import passwords
from mailman.SafeDict import SafeDict
from mailman.configuration import config
+from mailman.core import errors
AT = '@'
CR = '\r'
@@ -199,15 +200,15 @@ def ValidateEmail(s):
"""Verify that the an email address isn't grossly evil."""
# Pretty minimal, cheesy check. We could do better...
if not s or ' ' in s:
- raise Errors.InvalidEmailAddress(repr(s))
+ raise errors.InvalidEmailAddress(repr(s))
if _badchars.search(s) or s[0] == '-':
- raise Errors.InvalidEmailAddress(repr(s))
+ raise errors.InvalidEmailAddress(repr(s))
user, domain_parts = ParseEmail(s)
# Local, unqualified addresses are not allowed.
if not domain_parts:
- raise Errors.InvalidEmailAddress(repr(s))
+ raise errors.InvalidEmailAddress(repr(s))
if len(domain_parts) < 2:
- raise Errors.InvalidEmailAddress(repr(s))
+ raise errors.InvalidEmailAddress(repr(s))
diff --git a/mailman/app/lifecycle.py b/mailman/app/lifecycle.py
index 7095c0f9a..363ade2c4 100644
--- a/mailman/app/lifecycle.py
+++ b/mailman/app/lifecycle.py
@@ -17,23 +17,26 @@
"""Application level list creation."""
+__metaclass__ = type
+__all__ = [
+ 'create_list',
+ 'remove_list',
+ ]
+
+
import os
import sys
import shutil
import logging
-from mailman import Errors
from mailman import Utils
from mailman.Utils import ValidateEmail
from mailman.app.plugins import get_plugin
from mailman.app.styles import style_manager
from mailman.configuration import config
+from mailman.core import errors
from mailman.interfaces import MemberRole
-__all__ = [
- 'create_list',
- 'remove_list',
- ]
log = logging.getLogger('mailman.error')
@@ -47,7 +50,7 @@ def create_list(fqdn_listname, owners=None):
ValidateEmail(fqdn_listname)
listname, domain = Utils.split_listname(fqdn_listname)
if domain not in config.domains:
- raise Errors.BadDomainSpecificationError(domain)
+ raise errors.BadDomainSpecificationError(domain)
mlist = config.db.list_manager.create(fqdn_listname)
for style in style_manager.lookup(mlist):
# XXX FIXME. When we get rid of the wrapper object, this hack won't
diff --git a/mailman/app/membership.py b/mailman/app/membership.py
index 481e55a4e..775c5cf59 100644
--- a/mailman/app/membership.py
+++ b/mailman/app/membership.py
@@ -28,12 +28,12 @@ __all__ = [
from email.utils import formataddr
-from mailman import Errors
from mailman import Message
from mailman import Utils
from mailman import i18n
from mailman.app.notifications import send_goodbye_message
from mailman.configuration import config
+from mailman.core import errors
from mailman.interfaces import AlreadySubscribedError, DeliveryMode, MemberRole
_ = i18n._
@@ -68,7 +68,7 @@ def add_member(mlist, address, realname, password, delivery_mode, language):
# confirmations.
pattern = Utils.get_pattern(address, mlist.ban_list)
if pattern:
- raise Errors.MembershipIsBanned(pattern)
+ raise errors.MembershipIsBanned(pattern)
# Do the actual addition. First, see if there's already a user linked
# with the given address.
user = config.db.user_manager.get_user(address)
diff --git a/mailman/app/moderator.py b/mailman/app/moderator.py
index 2483d933e..7ef454c03 100644
--- a/mailman/app/moderator.py
+++ b/mailman/app/moderator.py
@@ -33,7 +33,6 @@ import logging
from datetime import datetime
from email.utils import formataddr, formatdate, getaddresses, make_msgid
-from mailman import Errors
from mailman import Message
from mailman import Utils
from mailman import i18n
@@ -41,6 +40,7 @@ from mailman.app.membership import add_member, delete_member
from mailman.app.notifications import (
send_admin_subscription_notice, send_welcome_message)
from mailman.configuration import config
+from mailman.core import errors
from mailman.interfaces import Action, DeliveryMode, RequestType
from mailman.interfaces.member import AlreadySubscribedError
from mailman.queue import Switchboard
@@ -310,7 +310,7 @@ def handle_unsubscription(mlist, id, action, comment=None):
key, data = requestdb.get_request(id)
try:
delete_member(mlist, address)
- except Errors.NotAMemberError:
+ except errors.NotAMemberError:
# User has already been unsubscribed.
pass
slog.info('%s: deleted %s', mlist.fqdn_listname, address)
diff --git a/mailman/bin/__init__.py b/mailman/bin/__init__.py
index eb7e7b846..4c3fc1673 100644
--- a/mailman/bin/__init__.py
+++ b/mailman/bin/__init__.py
@@ -20,7 +20,6 @@ __all__ = [
'arch',
'bounces',
'bumpdigests',
- 'change_pw',
'check_perms',
'checkdbs',
'cleanarch',
diff --git a/mailman/bin/add_members.py b/mailman/bin/add_members.py
index 98e14c5e6..613d2b322 100644
--- a/mailman/bin/add_members.py
+++ b/mailman/bin/add_members.py
@@ -24,7 +24,7 @@ import codecs
from cStringIO import StringIO
from email.utils import parseaddr
-from mailman import Errors
+from mailman import errors
from mailman import Message
from mailman import Utils
from mailman import i18n
@@ -122,7 +122,7 @@ def addall(mlist, subscribers, delivery_mode, ack, admin_notify, outfp):
config.DEFAULT_SERVER_LANGUAGE, ack, admin_notify)
except AlreadySubscribedError:
print >> tee, _('Already a member: $subscriber')
- except Errors.InvalidEmailAddress:
+ except errors.InvalidEmailAddress:
if not address:
print >> tee, _('Bad/Invalid email address: blank line')
else:
diff --git a/mailman/bin/bumpdigests.py b/mailman/bin/bumpdigests.py
index 7cde0d9de..2739a0fe6 100644
--- a/mailman/bin/bumpdigests.py
+++ b/mailman/bin/bumpdigests.py
@@ -18,7 +18,7 @@
import sys
import optparse
-from mailman import Errors
+from mailman import errors
from mailman import MailList
from mailman.configuration import config
from mailman.i18n import _
@@ -58,7 +58,7 @@ def main():
try:
# Be sure the list is locked
mlist = MailList.MailList(listname)
- except Errors.MMListError, e:
+ except errors.MMListError, e:
parser.print_help()
print >> sys.stderr, _('No such list: $listname')
sys.exit(1)
diff --git a/mailman/bin/change_pw.py b/mailman/bin/change_pw.py
deleted file mode 100644
index e67b951d2..000000000
--- a/mailman/bin/change_pw.py
+++ /dev/null
@@ -1,177 +0,0 @@
-# Copyright (C) 2001-2008 by the Free Software Foundation, Inc.
-#
-# This file is part of GNU Mailman.
-#
-# GNU Mailman is free software: you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation, either version 3 of the License, or (at your option)
-# any later version.
-#
-# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
-
-from __future__ import with_statement
-
-import sha
-import sys
-import optparse
-
-from mailman import Errors
-from mailman import MailList
-from mailman import Message
-from mailman import Utils
-from mailman import i18n
-from mailman.configuration import config
-from mailman.version import MAILMAN_VERSION
-
-_ = i18n._
-SPACE = ' '
-
-
-
-def parseargs():
- parser = optparse.OptionParser(version=MAILMAN_VERSION,
- usage=_("""\
-%%prog [options]
-
-Change a list's password.
-
-Prior to Mailman 2.1, list passwords were kept in crypt'd format -- usually.
-Some Python installations didn't have the crypt module available, so they'd
-fall back to md5. Then suddenly the Python installation might grow a crypt
-module and all list passwords would be broken.
-
-In Mailman 2.1, all list and site passwords are stored in SHA1 hexdigest
-form. This breaks list passwords for all existing pre-Mailman 2.1 lists, and
-since those passwords aren't stored anywhere in plain text, they cannot be
-retrieved and updated.
-
-Thus, this script generates new passwords for a list, and optionally sends it
-to all the owners of the list."""))
- parser.add_option('-a', '--all',
- default=False, action='store_true',
- help=_('Change the password for all lists'))
- parser.add_option('-d', '--domain',
- default=[], type='string', action='append',
- dest='domains', help=_("""\
-Change the password for all lists in the virtual domain DOMAIN. It is okay
-to give multiple -d options."""))
- parser.add_option('-l', '--listname',
- default=[], type='string', action='append',
- dest='listnames', help=_("""\
-Change the password only for the named list. It is okay to give multiple -l
-options."""))
- parser.add_option('-p', '--password',
- type='string', metavar='NEWPASSWORD', help=_("""\
-Use the supplied plain text password NEWPASSWORD as the new password for any
-lists that are being changed (as specified by the -a, -d, and -l options). If
-not given, lists will be assigned a randomly generated new password."""))
- parser.add_option('-q', '--quiet',
- default=False, action='store_true', help=_("""\
-Don't notify list owners of the new password. You'll have to have some other
-way of letting the list owners know the new password (presumably
-out-of-band)."""))
- parser.add_option('-C', '--config',
- help=_('Alternative configuration file to use'))
- opts, args = parser.parse_args()
- if args:
- parser.print_help()
- print >> sys.stderr, _('Unexpected arguments')
- sys.exit(1)
- if opts.password == '':
- parser.print_help()
- print >> sys.stderr, _('Empty list passwords are not allowed')
- sys.exit(1)
- return parser, opts, args
-
-
-
-_listcache = {}
-_missing = object()
-
-def openlist(listname):
- missing = []
- mlist = _listcache.get(listname, _missing)
- if mlist is _missing:
- try:
- mlist = MailList.MailList(listname, lock=False)
- except Errors.MMListError:
- print >> sys.stderr, _('No such list: $listname')
- return None
- _listcache[listname] = mlist
- return mlist
-
-
-
-def main():
- parser, opts, args = parseargs()
- config.load(opts.config)
-
- # Cull duplicates
- domains = set(opts.domains)
- listnames = set(config.list_manager.names if opts.all else opts.listnames)
-
- if domains:
- for name in config.list_manager.names:
- mlist = openlist(name)
- if mlist.host_name in domains:
- listnames.add(name)
-
- if not listnames:
- print >> sys.stderr, _('Nothing to do.')
- sys.exit(0)
-
- # Set the password on the lists
- if opts.password:
- shapassword = sha.new(opts.password).hexdigest()
-
- for listname in listnames:
- mlist = openlist(listname)
- mlist.Lock()
- try:
- if opts.password is None:
- randompw = Utils.MakeRandomPassword(
- config.ADMIN_PASSWORD_LENGTH)
- shapassword = sha.new(randompw).hexdigest()
- notifypassword = randompw
- else:
- notifypassword = opts.password
-
- mlist.password = shapassword
- mlist.Save()
- finally:
- mlist.Unlock()
-
- # Notification
- print _('New $listname password: $notifypassword')
- if not opts.quiet:
- with i18n.using_language(mlist.preferred_language):
- hostname = mlist.host_name
- adminurl = mlist.GetScriptURL('admin', absolute=True)
- msg = Message.UserNotification(
- mlist.owner[:], mlist.no_reply_address,
- _('Your new $listname list password'),
- _('''\
-The site administrator at $hostname has changed the password for your
-mailing list $listname. It is now
-
- $notifypassword
-
-Please be sure to use this for all future list administration. You may want
-to log in now to your list and change the password to something more to your
-liking. Visit your list admin page at
-
- $adminurl
-'''),
- mlist.preferred_language)
- msg.send(mlist)
-
-
-
-if __name__ == '__main__':
- main()
diff --git a/mailman/bin/config_list.py b/mailman/bin/config_list.py
index 814b9640c..7fb3e73a7 100644
--- a/mailman/bin/config_list.py
+++ b/mailman/bin/config_list.py
@@ -20,7 +20,7 @@ import sys
import time
import optparse
-from mailman import Errors
+from mailman import errors
from mailman import MailList
from mailman import Utils
from mailman import i18n
@@ -97,7 +97,7 @@ def do_output(listname, outfile, parser):
# Open the specified list unlocked, since we're only reading it.
try:
mlist = MailList.MailList(listname, lock=False)
- except Errors.MMListError:
+ except errors.MMListError:
parser.error(_('No such list: $listname'))
# Preamble for the config info. PEP 263 charset and capture time.
language = mlist.preferred_language
@@ -246,7 +246,7 @@ def do_input(listname, infile, checkonly, verbose, parser):
# Open the specified list locked, unless checkonly is set
try:
mlist = MailList.MailList(listname, lock=not checkonly)
- except Errors.MMListError, e:
+ except errors.MMListError, e:
parser.error(_('No such list "$listname"\n$e'))
savelist = False
guibyprop = getPropertyMap(mlist)
@@ -278,7 +278,7 @@ def do_input(listname, infile, checkonly, verbose, parser):
validval = gui._getValidValue(mlist, k, wtype, v)
except ValueError:
print >> sys.stderr, _('Invalid value for property: $k')
- except Errors.EmailAddressError:
+ except errors.EmailAddressError:
print >> sys.stderr, _(
'Bad email address for option $k: $v')
else:
diff --git a/mailman/bin/create_list.py b/mailman/bin/create_list.py
index f581184dc..c25ab3283 100644
--- a/mailman/bin/create_list.py
+++ b/mailman/bin/create_list.py
@@ -19,7 +19,7 @@ from __future__ import with_statement
import sys
-from mailman import Errors
+from mailman import errors
from mailman import Message
from mailman import Utils
from mailman import i18n
@@ -100,11 +100,11 @@ def main():
try:
mlist = create_list(fqdn_listname, options.options.owners)
mlist.preferred_language = options.options.language
- except Errors.InvalidEmailAddress:
+ except errors.InvalidEmailAddress:
options.parser.error(_('Illegal list name: $fqdn_listname'))
except ListAlreadyExistsError:
options.parser.error(_('List already exists: $fqdn_listname'))
- except Errors.BadDomainSpecificationError, domain:
+ except errors.BadDomainSpecificationError, domain:
options.parser.error(_('Undefined domain: $domain'))
config.db.commit()
diff --git a/mailman/bin/disabled.py b/mailman/bin/disabled.py
index ae57757f1..31fd0c014 100644
--- a/mailman/bin/disabled.py
+++ b/mailman/bin/disabled.py
@@ -19,7 +19,7 @@ import time
import logging
import optparse
-from mailman import Errors
+from mailman import errors
from mailman import MailList
from mailman import MemberAdaptor
from mailman import Pending
@@ -183,7 +183,7 @@ def main():
member, mlist.internal_name())
try:
mlist.sendNextNotification(member)
- except Errors.NotAMemberError:
+ except errors.NotAMemberError:
# There must have been some problem with the data we have
# on this member. Most likely it's that they don't have a
# password assigned. Log this and delete the member.
diff --git a/mailman/bin/export.py b/mailman/bin/export.py
index 1834205e7..e494d5a8d 100644
--- a/mailman/bin/export.py
+++ b/mailman/bin/export.py
@@ -29,7 +29,7 @@ import optparse
from xml.sax.saxutils import escape
from mailman import Defaults
-from mailman import Errors
+from mailman import errors
from mailman import MemberAdaptor
from mailman.MailList import MailList
from mailman.configuration import config
@@ -247,7 +247,7 @@ class XMLDumper(object):
for listname in sorted(listnames):
try:
mlist = MailList(listname, lock=False)
- except Errors.MMUnknownListError:
+ except errors.MMUnknownListError:
print >> sys.stderr, _('No such list: $listname')
continue
self._dump_list(mlist)
diff --git a/mailman/bin/find_member.py b/mailman/bin/find_member.py
index e605767a7..605e243b4 100644
--- a/mailman/bin/find_member.py
+++ b/mailman/bin/find_member.py
@@ -19,7 +19,7 @@ import re
import sys
import optparse
-from mailman import Errors
+from mailman import errors
from mailman import MailList
from mailman.configuration import config
from mailman.i18n import _
@@ -93,7 +93,7 @@ def main():
for listname in listnames:
try:
mlist = MailList.MailList(listname, lock=False)
- except Errors.MMListError:
+ except errors.MMListError:
print _('No such list: $listname')
continue
if opts.owners:
diff --git a/mailman/bin/import.py b/mailman/bin/import.py
index 51dffceb9..2617cca99 100644
--- a/mailman/bin/import.py
+++ b/mailman/bin/import.py
@@ -26,7 +26,7 @@ from xml.dom import minidom
from xml.parsers.expat import ExpatError
from mailman import Defaults
-from mailman import Errors
+from mailman import errors
from mailman import MemberAdaptor
from mailman import Utils
from mailman import passwords
@@ -202,7 +202,7 @@ def create(all_listdata):
print _('Creating mailing list: $fqdn_listname')
mlist.Create(fqdn_listname, list_config['owner'][0],
list_config['password'])
- except Errors.BadDomainSpecificationError:
+ except errors.BadDomainSpecificationError:
print _('List is not in a supported domain: $fqdn_listname')
continue
# Save the list creation, then unlock and relock the list. This is so
diff --git a/mailman/bin/list_members.py b/mailman/bin/list_members.py
index 31bc61b0c..a5b047504 100644
--- a/mailman/bin/list_members.py
+++ b/mailman/bin/list_members.py
@@ -19,7 +19,7 @@ import sys
from email.Utils import formataddr
-from mailman import Errors
+from mailman import errors
from mailman import Utils
from mailman.configuration import config
from mailman.i18n import _
@@ -120,7 +120,7 @@ def isinvalid(addr):
try:
Utils.ValidateEmail(addr)
return False
- except Errors.EmailAddressError:
+ except errors.EmailAddressError:
return True
diff --git a/mailman/bin/remove_list.py b/mailman/bin/remove_list.py
index 76db51f2d..b83c56bbf 100644
--- a/mailman/bin/remove_list.py
+++ b/mailman/bin/remove_list.py
@@ -19,7 +19,6 @@ import os
import sys
import shutil
-from mailman import Errors
from mailman import Utils
from mailman.app.lifecycle import remove_list
from mailman.configuration import config
diff --git a/mailman/bin/withlist.py b/mailman/bin/withlist.py
index daf009ca3..32bfb1206 100644
--- a/mailman/bin/withlist.py
+++ b/mailman/bin/withlist.py
@@ -19,7 +19,6 @@ import os
import sys
import optparse
-from mailman import Errors
from mailman import interact
from mailman.configuration import config
from mailman.i18n import _
@@ -105,7 +104,7 @@ As another example, say you wanted to change the password for a particular
user on a particular list. You could put the following function in a file
called 'changepw.py':
- from mailman.Errors import NotAMemberError
+ from mailman.errors import NotAMemberError
def changepw(mlist, addr, newpasswd):
try:
diff --git a/mailman/configuration.py b/mailman/configuration.py
index 1c4612f32..070f82085 100644
--- a/mailman/configuration.py
+++ b/mailman/configuration.py
@@ -22,8 +22,8 @@ import sys
import errno
from mailman import Defaults
-from mailman import Errors
from mailman import version
+from mailman.core import errors
from mailman.domain import Domain
from mailman.languages import LanguageManager
@@ -184,11 +184,11 @@ class Configuration(object):
"""
domain = Domain(*args, **kws)
if domain.email_host in self.domains:
- raise Errors.BadDomainSpecificationError(
+ raise errors.BadDomainSpecificationError(
'Duplicate email host: %s' % domain.email_host)
# Make sure there's only one mapping for the url_host
if domain.url_host in self.domains.values():
- raise Errors.BadDomainSpecificationError(
+ raise errors.BadDomainSpecificationError(
'Duplicate url host: %s' % domain.url_host)
# We'll do the reverse mappings on-demand. There shouldn't be too
# many virtual hosts that it will really matter that much.
diff --git a/mailman/core/__init__.py b/mailman/core/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mailman/core/__init__.py
diff --git a/mailman/Errors.py b/mailman/core/errors.py
index 91e724195..91e724195 100644
--- a/mailman/Errors.py
+++ b/mailman/core/errors.py
diff --git a/mailman/database/listmanager.py b/mailman/database/listmanager.py
index 1fb416203..c4cebce4c 100644
--- a/mailman/database/listmanager.py
+++ b/mailman/database/listmanager.py
@@ -21,7 +21,6 @@ import datetime
from zope.interface import implements
-from mailman import Errors
from mailman.Utils import split_listname, fqdn_listname
from mailman.configuration import config
from mailman.database.mailinglist import MailingList
diff --git a/mailman/docs/bounces.txt b/mailman/docs/bounces.txt
index 671e43a22..ff110c509 100644
--- a/mailman/docs/bounces.txt
+++ b/mailman/docs/bounces.txt
@@ -72,7 +72,7 @@ An error message can be given when the message is bounced, and this will be
included in the payload of the text/plain part. The error message must be
passed in as an instance of a RejectMessage exception.
- >>> from mailman.Errors import RejectMessage
+ >>> from mailman.core.errors import RejectMessage
>>> error = RejectMessage("This wasn't very important after all.")
>>> bounce_message(mlist, msg, error)
>>> len(switchboard.files)
diff --git a/mailman/interfaces/member.py b/mailman/interfaces/member.py
index a5e1caf07..009b18c91 100644
--- a/mailman/interfaces/member.py
+++ b/mailman/interfaces/member.py
@@ -31,7 +31,7 @@ __all__ = [
from munepy import Enum
from zope.interface import Interface, Attribute
-from mailman.Errors import SubscriptionError
+from mailman.core.errors import SubscriptionError
diff --git a/mailman/passwords.py b/mailman/passwords.py
index b353e7710..65bf8de05 100644
--- a/mailman/passwords.py
+++ b/mailman/passwords.py
@@ -30,7 +30,7 @@ from base64 import urlsafe_b64decode as decode
from base64 import urlsafe_b64encode as encode
from munepy import Enum
-from mailman import Errors
+from mailman.core import errors
SALT_LENGTH = 20 # bytes
ITERATIONS = 2000
@@ -221,7 +221,7 @@ def make_secret(password, scheme=None):
password = password.encode('utf-8')
scheme_class = _SCHEMES_BY_ENUM.get(scheme)
if not scheme_class:
- raise Errors.BadPasswordSchemeError(scheme)
+ raise errors.BadPasswordSchemeError(scheme)
secret = scheme_class.make_secret(password)
return '{%s}%s' % (scheme_class.TAG, secret)
diff --git a/mailman/pipeline/acknowledge.py b/mailman/pipeline/acknowledge.py
index a7e6f2ce8..41fc931ae 100644
--- a/mailman/pipeline/acknowledge.py
+++ b/mailman/pipeline/acknowledge.py
@@ -26,7 +26,6 @@ __all__ = ['Acknowledge']
from zope.interface import implements
-from mailman import Errors
from mailman import Message
from mailman import Utils
from mailman.configuration import config
diff --git a/mailman/pipeline/calculate_recipients.py b/mailman/pipeline/calculate_recipients.py
index a7e5f1521..f892435cd 100644
--- a/mailman/pipeline/calculate_recipients.py
+++ b/mailman/pipeline/calculate_recipients.py
@@ -28,10 +28,10 @@ __all__ = ['CalculateRecipients']
from zope.interface import implements
-from mailman import Errors
from mailman import Message
from mailman import Utils
from mailman.configuration import config
+from mailman.core import errors
from mailman.i18n import _
from mailman.interfaces import DeliveryStatus, IHandler
@@ -83,7 +83,7 @@ class CalculateRecipients:
Your urgent message to the %(realname)s mailing list was not authorized for
delivery. The original message as received by Mailman is attached.
""")
- raise Errors.RejectMessage, Utils.wrap(text)
+ raise errors.RejectMessage, Utils.wrap(text)
# Calculate the regular recipients of the message
recips = set(member.address.address
for member in mlist.regular_members.members
diff --git a/mailman/pipeline/decorate.py b/mailman/pipeline/decorate.py
index a9f20f4d8..3e9c6360b 100644
--- a/mailman/pipeline/decorate.py
+++ b/mailman/pipeline/decorate.py
@@ -28,7 +28,6 @@ from email.MIMEText import MIMEText
from string import Template
from zope.interface import implements
-from mailman import Errors
from mailman import Utils
from mailman.Message import Message
from mailman.configuration import config
diff --git a/mailman/pipeline/file_recipients.py b/mailman/pipeline/file_recipients.py
index 3ca13b6e1..5f47059d3 100644
--- a/mailman/pipeline/file_recipients.py
+++ b/mailman/pipeline/file_recipients.py
@@ -28,7 +28,6 @@ import errno
from zope.interface import implements
-from mailman import Errors
from mailman.i18n import _
from mailman.interfaces import IHandler
diff --git a/mailman/pipeline/mime_delete.py b/mailman/pipeline/mime_delete.py
index bfcdd39a9..9cb34297f 100644
--- a/mailman/pipeline/mime_delete.py
+++ b/mailman/pipeline/mime_delete.py
@@ -37,14 +37,14 @@ from email.Iterators import typed_subpart_iterator
from os.path import splitext
from zope.interface import implements
-from mailman import Errors
from mailman.Message import UserNotification
from mailman.Utils import oneline
-from mailman.version import VERSION
from mailman.configuration import config
+from mailman.core import errors
from mailman.i18n import _
from mailman.interfaces import IHandler
from mailman.queue import Switchboard
+from mailman.version import VERSION
log = logging.getLogger('mailman.error')
@@ -231,7 +231,7 @@ def dispose(mlist, msg, msgdata, why):
# filter_action == 0 just discards, see below
if mlist.filter_action == 1:
# Bounce the message to the original author
- raise Errors.RejectMessage, why
+ raise errors.RejectMessage, why
if mlist.filter_action == 2:
# Forward it on to the list owner
listname = mlist.internal_name()
@@ -249,7 +249,7 @@ are receiving the only remaining copy of the discarded message.
badq = Switchboard(config.BADQUEUE_DIR)
badq.enqueue(msg, msgdata)
# Most cases also discard the message
- raise Errors.DiscardMessage
+ raise errors.DiscardMessage
def get_file_ext(m):
"""
diff --git a/mailman/pipeline/moderate.py b/mailman/pipeline/moderate.py
index 0463a5e9b..11471dd3a 100644
--- a/mailman/pipeline/moderate.py
+++ b/mailman/pipeline/moderate.py
@@ -22,10 +22,10 @@ import re
from email.MIMEMessage import MIMEMessage
from email.MIMEText import MIMEText
-from mailman import Errors
from mailman import Message
from mailman import Utils
from mailman.configuration import config
+from mailman.core import errors
from mailman.i18n import _
@@ -72,11 +72,11 @@ def process(mlist, msg, msgdata):
else:
# Use the default RejectMessage notice string
text = None
- raise Errors.RejectMessage, text
+ raise errors.RejectMessage, text
elif mlist.member_moderation_action == 2:
# Discard. BAW: Again, it would be nice if we could send a
# discard notice to the sender
- raise Errors.DiscardMessage
+ raise errors.DiscardMessage
else:
assert 0, 'bad member_moderation_action'
# Should we do anything explict to mark this message as getting past
@@ -135,10 +135,10 @@ def matches_p(sender, nonmembers):
def do_reject(mlist):
listowner = mlist.GetOwnerEmail()
if mlist.nonmember_rejection_notice:
- raise Errors.RejectMessage, \
+ raise errors.RejectMessage, \
Utils.wrap(_(mlist.nonmember_rejection_notice))
else:
- raise Errors.RejectMessage, Utils.wrap(_("""\
+ raise errors.RejectMessage, Utils.wrap(_("""\
You are not allowed to post to this mailing list, and your message has been
automatically rejected. If you think that your messages are being rejected in
error, contact the mailing list owner at %(listowner)s."""))
@@ -164,4 +164,4 @@ def do_discard(mlist, msg):
nmsg.attach(MIMEMessage(msg))
nmsg.send(mlist)
# Discard this sucker
- raise Errors.DiscardMessage
+ raise errors.DiscardMessage
diff --git a/mailman/pipeline/scrubber.py b/mailman/pipeline/scrubber.py
index f6187a1cd..a538de1e9 100644
--- a/mailman/pipeline/scrubber.py
+++ b/mailman/pipeline/scrubber.py
@@ -39,9 +39,9 @@ from mimetypes import guess_all_extensions
from zope.interface import implements
from mailman import Utils
-from mailman.Errors import DiscardMessage
from mailman.app.plugins import get_plugin
from mailman.configuration import config
+from mailman.core.errors import DiscardMessage
from mailman.i18n import _
from mailman.interfaces import IHandler
diff --git a/mailman/pipeline/smtp_direct.py b/mailman/pipeline/smtp_direct.py
index 447c61c8b..7d9242417 100644
--- a/mailman/pipeline/smtp_direct.py
+++ b/mailman/pipeline/smtp_direct.py
@@ -43,9 +43,9 @@ from email.Header import Header
from email.Utils import formataddr
from zope.interface import implements
-from mailman import Errors
from mailman import Utils
from mailman.configuration import config
+from mailman.core import errors
from mailman.i18n import _
from mailman.interfaces import IHandler, Personalization
@@ -254,7 +254,7 @@ def process(mlist, msg, msgdata):
failure_log.info('%s', template.safe_substitute(substitutions))
# Return the results
if tempfailures or permfailures:
- raise Errors.SomeRecipientsFailed(tempfailures, permfailures)
+ raise errors.SomeRecipientsFailed(tempfailures, permfailures)
diff --git a/mailman/pipeline/to_digest.py b/mailman/pipeline/to_digest.py
index d8d4ac669..7c868fe74 100644
--- a/mailman/pipeline/to_digest.py
+++ b/mailman/pipeline/to_digest.py
@@ -48,16 +48,16 @@ from email.parser import Parser
from email.utils import formatdate, getaddresses, make_msgid
from zope.interface import implements
-from mailman import Errors
from mailman import Message
from mailman import Utils
from mailman import i18n
from mailman.Mailbox import Mailbox
from mailman.Mailbox import Mailbox
from mailman.configuration import config
+from mailman.core import errors
+from mailman.interfaces import DeliveryMode, DeliveryStatus, IHandler
from mailman.pipeline.decorate import decorate
from mailman.pipeline.scrubber import process as scrubber
-from mailman.interfaces import DeliveryMode, DeliveryStatus, IHandler
from mailman.queue import Switchboard
@@ -321,7 +321,7 @@ def send_i18n_digests(mlist, mboxfp):
# Use Mailman.pipeline.scrubber.process() to get plain text
try:
msg = scrubber(mlist, msg)
- except Errors.DiscardMessage:
+ except errors.DiscardMessage:
print >> plainmsg, _('[Message discarded by content filter]')
continue
# Honor the default setting
diff --git a/mailman/queue/outgoing.py b/mailman/queue/outgoing.py
index 42b2d71db..624368930 100644
--- a/mailman/queue/outgoing.py
+++ b/mailman/queue/outgoing.py
@@ -26,9 +26,9 @@ import logging
from datetime import datetime
-from mailman import Errors
from mailman import Message
from mailman.configuration import config
+from mailman.core import errors
from mailman.queue import Runner, Switchboard
from mailman.queue.bounce import BounceMixin
@@ -82,7 +82,7 @@ class OutgoingRunner(Runner, BounceMixin):
config.SMTPHOST, port)
self._logged = True
return True
- except Errors.SomeRecipientsFailed, e:
+ except errors.SomeRecipientsFailed, e:
# Handle local rejects of probe messages differently.
if msgdata.get('probe_token') and e.permfailures:
self._probe_bounce(mlist, msgdata['probe_token'])
diff --git a/mailman/tests/test_membership.py b/mailman/tests/test_membership.py
index dca7e020b..062520665 100644
--- a/mailman/tests/test_membership.py
+++ b/mailman/tests/test_membership.py
@@ -23,9 +23,9 @@ import unittest
from mailman import Utils
from mailman import passwords
-from mailman.Errors import NotAMemberError
from mailman.UserDesc import UserDesc
from mailman.configuration import config
+from mailman.core.errors import NotAMemberError
diff --git a/mailman/tests/test_passwords.py b/mailman/tests/test_passwords.py
index 3c539c77b..7c9b9671e 100644
--- a/mailman/tests/test_passwords.py
+++ b/mailman/tests/test_passwords.py
@@ -19,8 +19,8 @@
import unittest
-from mailman import Errors
from mailman import passwords
+from mailman.core import errors
@@ -73,19 +73,19 @@ class TestBogusPasswords(TestPasswordsBase):
scheme = -1
def test_passwords(self):
- self.assertRaises(Errors.BadPasswordSchemeError,
+ self.assertRaises(errors.BadPasswordSchemeError,
passwords.make_secret, self.pw8a, self.scheme)
def test_unicode_passwords(self):
- self.assertRaises(Errors.BadPasswordSchemeError,
+ self.assertRaises(errors.BadPasswordSchemeError,
passwords.make_secret, self.pwua, self.scheme)
def test_passwords_with_funky_chars(self):
- self.assertRaises(Errors.BadPasswordSchemeError,
+ self.assertRaises(errors.BadPasswordSchemeError,
passwords.make_secret, self.pw8b, self.scheme)
def test_unicode_passwords_with_funky_chars(self):
- self.assertRaises(Errors.BadPasswordSchemeError,
+ self.assertRaises(errors.BadPasswordSchemeError,
passwords.make_secret, self.pwub, self.scheme)
diff --git a/mailman/tests/test_security_mgr.py b/mailman/tests/test_security_mgr.py
index 2b5cd20c3..3dde9dd2a 100644
--- a/mailman/tests/test_security_mgr.py
+++ b/mailman/tests/test_security_mgr.py
@@ -27,7 +27,6 @@ import unittest
# Don't use cStringIO because we're going to inherit
from StringIO import StringIO
-from mailman import Errors
from mailman import Utils
from mailman import passwords
from mailman.configuration import config