summaryrefslogtreecommitdiff
path: root/src/mailman/model
diff options
context:
space:
mode:
authorBarry Warsaw2011-02-25 18:15:58 -0500
committerBarry Warsaw2011-02-25 18:15:58 -0500
commitdb2777e4aea3b516906a9500a0156d388779292e (patch)
tree6d08a6660226c3d55dd75dae2c20a05680884255 /src/mailman/model
parent51140e885c9e1dc074e1fb3f288f50a8e9add884 (diff)
downloadmailman-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.py110
-rw-r--r--src/mailman/model/mailinglist.py3
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