From 73a3660cdf0bda56689f9fd0f7f7ac53c7aa0422 Mon Sep 17 00:00:00 2001
From: Barry Warsaw
Date: Mon, 29 Sep 2008 02:50:17 -0400
Subject: Move all the web-related stuff to its own subdirectory. This stuff
doesn't really work yet anyway. Eradicate UserDesc.
---
mailman/web/Gui/ContentFilter.py | 199 +++++++++++++++++++++++++++++++++++++++
1 file changed, 199 insertions(+)
create mode 100644 mailman/web/Gui/ContentFilter.py
(limited to 'mailman/web/Gui/ContentFilter.py')
diff --git a/mailman/web/Gui/ContentFilter.py b/mailman/web/Gui/ContentFilter.py
new file mode 100644
index 000000000..d7f26321b
--- /dev/null
+++ b/mailman/web/Gui/ContentFilter.py
@@ -0,0 +1,199 @@
+# Copyright (C) 2002-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
Content filtering works like this: when a message is + received by the list and you have enabled content filtering, the + individual attachments are first compared to the + filter + types. If the attachment type matches an entry in the filter + types, it is discarded. + +
Then, if there are pass types + defined, any attachment type that does not match a + pass type is also discarded. If there are no pass types defined, + this check is skipped. + +
After this initial filtering, any multipart + attachments that are empty are removed. If the outer message is + left empty after this filtering, then the whole message is + discarded. + +
Then, each multipart/alternative section will + be replaced by just the first alternative that is non-empty after + filtering if + collapse_alternatives is enabled. + +
Finally, any text/html parts that are left in the + message may be converted to text/plain if + convert_html_to_plaintext is enabled and the site is + configured to allow these conversions."""), + + ('filter_content', config.Radio, (_('No'), _('Yes')), 0, + _("""Should Mailman filter the content of list traffic according + to the settings below?""")), + + ('filter_mime_types', config.Text, (10, WIDTH), 0, + _("""Remove message attachments that have a matching content + type."""), + + _("""Use this option to remove each message attachment that + matches one of these content types. Each line should contain a + string naming a MIME type/subtype, + e.g. image/gif. Leave off the subtype to remove all + parts with a matching major content type, e.g. image. + +
Blank lines are ignored. + +
See also pass_mime_types for a content type whitelist.""")), + + ('pass_mime_types', config.Text, (10, WIDTH), 0, + _("""Remove message attachments that don't have a matching + content type. Leave this field blank to skip this filter + test."""), + + _("""Use this option to remove each message attachment that does + not have a matching content type. Requirements and formats are + exactly like filter_mime_types. + +
Note: if you add entries to this list but don't add + multipart to this list, any messages with attachments + will be rejected by the pass filter.""")), + + ('filter_filename_extensions', config.Text, (10, WIDTH), 0, + _("""Remove message attachments that have a matching filename + extension."""),), + + ('pass_filename_extensions', config.Text, (10, WIDTH), 0, + _("""Remove message attachments that don't have a matching + filename extension. Leave this field blank to skip this filter + test."""),), + + ('collapse_alternatives', config.Radio, (_('No'), _('Yes')), 0, + _("""Should Mailman collapse multipart/alternative to its + first part content?""")), + + ('convert_html_to_plaintext', config.Radio, (_('No'), _('Yes')), 0, + _("""Should Mailman convert text/html parts to plain + text? This conversion happens after MIME attachments have been + stripped.""")), + + ('filter_action', config.Radio, tuple(actions), 0, + + _("""Action to take when a message matches the content filtering + rules."""), + + _("""One of these actions is take when the message matches one of + the content filtering rules, meaning, the top-level + content type matches one of the filter_mime_types, or the top-level content type does + not match one of the + pass_mime_types, or if after filtering the subparts of the + message, the message ends up empty. + +
Note this action is not taken if after filtering the message + still contains content. In that case the message is always + forwarded on to the list membership. + +
When messages are discarded, a log entry is written + containing the Message-ID of the discarded message. When + messages are rejected or forwarded to the list owner, a reason + for the rejection is included in the bounce message to the + original author. When messages are preserved, they are saved in + a special queue directory on disk for the site administrator to + view (and possibly rescue) but otherwise discarded. This last + option is only available if enabled by the site + administrator.""")), + ] + + def _setValue(self, mlist, property, val, doc): + if property in ('filter_mime_types', 'pass_mime_types'): + types = [] + for spectype in [s.strip() for s in val.splitlines()]: + ok = 1 + slashes = spectype.count('/') + if slashes == 0 and not spectype: + ok = 0 + elif slashes == 1: + maintype, subtype = [s.strip().lower() + for s in spectype.split('/')] + if not maintype or not subtype: + ok = 0 + elif slashes > 1: + ok = 0 + if not ok: + doc.addError(_('Bad MIME type ignored: %(spectype)s')) + else: + types.append(spectype.strip().lower()) + if property == 'filter_mime_types': + mlist.filter_mime_types = types + elif property == 'pass_mime_types': + mlist.pass_mime_types = types + elif property in ('filter_filename_extensions', + 'pass_filename_extensions'): + fexts = [] + for ext in [s.strip() for s in val.splitlines()]: + fexts.append(ext.lower()) + if property == 'filter_filename_extensions': + mlist.filter_filename_extensions = fexts + elif property == 'pass_filename_extensions': + mlist.pass_filename_extensions = fexts + else: + GUIBase._setValue(self, mlist, property, val, doc) + + def getValue(self, mlist, kind, property, params): + if property == 'filter_mime_types': + return NL.join(mlist.filter_mime_types) + if property == 'pass_mime_types': + return NL.join(mlist.pass_mime_types) + if property == 'filter_filename_extensions': + return NL.join(mlist.filter_filename_extensions) + if property == 'pass_filename_extensions': + return NL.join(mlist.pass_filename_extensions) + return None -- cgit v1.2.3-70-g09d2