diff options
| author | Barry Warsaw | 2011-02-25 18:15:58 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2011-02-25 18:15:58 -0500 |
| commit | db2777e4aea3b516906a9500a0156d388779292e (patch) | |
| tree | 6d08a6660226c3d55dd75dae2c20a05680884255 /src/mailman/model | |
| parent | 51140e885c9e1dc074e1fb3f288f50a8e9add884 (diff) | |
| download | mailman-db2777e4aea3b516906a9500a0156d388779292e.tar.gz mailman-db2777e4aea3b516906a9500a0156d388779292e.tar.zst mailman-db2777e4aea3b516906a9500a0156d388779292e.zip | |
Eliminate Utils.get_pattern() and in the process, completely revamp
subscription bans so as not to have to rely on BLOBS or pickles in the
database.
Also, be sure to include .rst files in both doctests and in the packaged
tarballs. With the now awesome reST mode for Emacs, I plan to rename all .txt
doctest files to .rst.
Diffstat (limited to 'src/mailman/model')
| -rw-r--r-- | src/mailman/model/bans.py | 110 | ||||
| -rw-r--r-- | src/mailman/model/mailinglist.py | 3 |
2 files changed, 111 insertions, 2 deletions
diff --git a/src/mailman/model/bans.py b/src/mailman/model/bans.py new file mode 100644 index 000000000..95711cfa9 --- /dev/null +++ b/src/mailman/model/bans.py @@ -0,0 +1,110 @@ +# Copyright (C) 2011 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/>. + +"""Ban manager.""" + +from __future__ import absolute_import, unicode_literals + +__metaclass__ = type +__all__ = [ + 'BanManager', + ] + + +import re + +from storm.locals import Int, Unicode +from zope.interface import implements + +from mailman.config import config +from mailman.database.model import Model +from mailman.interfaces.bans import IBan, IBanManager + + + +class Ban(Model): + implements(IBan) + + id = Int(primary=True) + email = Unicode() + mailing_list = Unicode() + + def __init__(self, email, mailing_list): + super(Ban, self).__init__() + self.email = email + self.mailing_list = mailing_list + + + +class BanManager: + implements(IBanManager) + + def ban(self, email, mailing_list=None): + """See `IBanManager`.""" + bans = config.db.store.find( + Ban, email=email, mailing_list=mailing_list) + if bans.count() == 0: + ban = Ban(email, mailing_list) + config.db.store.add(ban) + + def unban(self, email, mailing_list=None): + """See `IBanManager`.""" + ban = config.db.store.find( + Ban, email=email, mailing_list=mailing_list).one() + if ban is not None: + config.db.store.remove(ban) + + def is_banned(self, email, mailing_list=None): + """See `IBanManager`.""" + # A specific mailing list ban is being checked, however the email + # address could be banned specifically, or globally. + if mailing_list is not None: + # Try specific bans first. + bans = config.db.store.find( + Ban, email=email, mailing_list=mailing_list) + if bans.count() > 0: + return True + # Try global bans next. + bans = config.db.store.find(Ban, email=email, mailing_list=None) + if bans.count() > 0: + return True + # Now try specific mailing list bans, but with a pattern. + bans = config.db.store.find(Ban, mailing_list=mailing_list) + for ban in bans: + if (ban.email.startswith('^') and + re.match(ban.email, email, re.IGNORECASE) is not None): + return True + # And now try global pattern bans. + bans = config.db.store.find(Ban, mailing_list=None) + for ban in bans: + if (ban.email.startswith('^') and + re.match(ban.email, email, re.IGNORECASE) is not None): + return True + else: + # The client is asking for global bans. Look up bans on the + # specific email address first. + bans = config.db.store.find( + Ban, email=email, mailing_list=None) + if bans.count() > 0: + return True + # And now look for global pattern bans. + bans = config.db.store.find(Ban, mailing_list=None) + for ban in bans: + if (ban.email.startswith('^') and + re.match(ban.email, email, re.IGNORECASE) is not None): + return True + return False diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index cdebd5ca6..488b6da3d 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -108,8 +108,7 @@ class MailingList(Model): filter_content = Bool() collapse_alternatives = Bool() convert_html_to_plaintext = Bool() - # Bounces and bans. - ban_list = Pickle() # XXX + # Bounces. bounce_info_stale_after = TimeDelta() # XXX bounce_matching_headers = Unicode() # XXX bounce_notify_owner_on_disable = Bool() # XXX |
