summaryrefslogtreecommitdiff
path: root/Mailman/Handlers
diff options
context:
space:
mode:
authorBarry Warsaw2007-06-21 10:23:40 -0400
committerBarry Warsaw2007-06-21 10:23:40 -0400
commit6c1ccc236bc24d8b3bb04807ba4b24e8a7a0d18e (patch)
treefe4787d9b79e27ea361b33a4f98a12d2e695f16b /Mailman/Handlers
parent3a86b40fe4e3b28c2d9f4e3bbd2cc0eeefe31453 (diff)
downloadmailman-6c1ccc236bc24d8b3bb04807ba4b24e8a7a0d18e.tar.gz
mailman-6c1ccc236bc24d8b3bb04807ba4b24e8a7a0d18e.tar.zst
mailman-6c1ccc236bc24d8b3bb04807ba4b24e8a7a0d18e.zip
Convert the CookHeaders tests in test_handlers to using doctests, split up
into several sub-documents. Defaults.py.in: Removed OLD_STYLE_PREFIXING. So-called 'new style' prefixing is the default and only option now. CookHeaders.py is updated to the new API and some (but not all) of the code has been updated to more modern Python idioms. reply_goes_to_list attribute has been changed from a strict integer to a munepy enum called ReplyToMunging. RFC 2369 headers List-Subscribe and List-Unsubscribe now use the preferred -join and -leave addresses instead of the -request address with a subject value.
Diffstat (limited to 'Mailman/Handlers')
-rw-r--r--Mailman/Handlers/CookHeaders.py46
1 files changed, 21 insertions, 25 deletions
diff --git a/Mailman/Handlers/CookHeaders.py b/Mailman/Handlers/CookHeaders.py
index 7b5579fad..5634fa23e 100644
--- a/Mailman/Handlers/CookHeaders.py
+++ b/Mailman/Handlers/CookHeaders.py
@@ -15,7 +15,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.
-"""Cook a message's Subject header."""
+"""Cook a message's headers."""
import re
@@ -27,6 +27,7 @@ from email.Utils import parseaddr, formataddr, getaddresses
from Mailman import Utils
from Mailman import Version
from Mailman.configuration import config
+from Mailman.constants import ReplyToMunging
from Mailman.i18n import _
CONTINUATION = ',\n\t'
@@ -75,7 +76,7 @@ def process(mlist, msg, msgdata):
pass
# Mark message so we know we've been here, but leave any existing
# X-BeenThere's intact.
- msg['X-BeenThere'] = mlist.GetListEmail()
+ msg['X-BeenThere'] = mlist.posting_address
# Add Precedence: and other useful headers. None of these are standard
# and finding information on some of them are fairly difficult. Some are
# just common practice, and we'll add more here as they become necessary.
@@ -89,11 +90,11 @@ def process(mlist, msg, msgdata):
# known exploits in a particular version of Mailman and we know a site is
# using such an old version, they may be vulnerable. It's too easy to
# edit the code to add a configuration variable to handle this.
- if not msg.has_key('x-mailman-version'):
+ if 'x-mailman-version' not in msg:
msg['X-Mailman-Version'] = Version.VERSION
# We set "Precedence: list" because this is the recommendation from the
# sendmail docs, the most authoritative source of this header's semantics.
- if not msg.has_key('precedence'):
+ if 'precedence' not in msg:
msg['Precedence'] = 'list'
# Reply-To: munging. Do not do this if the message is "fast tracked",
# meaning it is internally crafted and delivered to a specific user. BAW:
@@ -109,12 +110,12 @@ def process(mlist, msg, msgdata):
d = {}
def add(pair):
lcaddr = pair[1].lower()
- if d.has_key(lcaddr):
+ if lcaddr in d:
return
d[lcaddr] = pair
new.append(pair)
# List admin wants an explicit Reply-To: added
- if mlist.reply_goes_to_list == 2:
+ if mlist.reply_goes_to_list == ReplyToMunging.explicit_header:
add(parseaddr(mlist.reply_to_address))
# If we're not first stripping existing Reply-To: then we need to add
# the original Reply-To:'s to the list we're building up. In both
@@ -127,9 +128,9 @@ def process(mlist, msg, msgdata):
# Set Reply-To: header to point back to this list. Add this last
# because some folks think that some MUAs make it easier to delete
# addresses from the right than from the left.
- if mlist.reply_goes_to_list == 1:
+ if mlist.reply_goes_to_list == ReplyToMunging.point_to_list:
i18ndesc = uheader(mlist, mlist.description, 'Reply-To')
- add((str(i18ndesc), mlist.GetListEmail()))
+ add((str(i18ndesc), mlist.posting_address))
del msg['reply-to']
# Don't put Reply-To: back if there's nothing to add!
if new:
@@ -146,8 +147,9 @@ def process(mlist, msg, msgdata):
# above code?
# Also skip Cc if this is an anonymous list as list posting address
# is already in From and Reply-To in this case.
- if mlist.personalize == 2 and mlist.reply_goes_to_list <> 1 \
- and not mlist.anonymous_list:
+ if (mlist.personalize == 2 and
+ mlist.reply_goes_to_list <> ReplyToMunging.point_to_list and
+ not mlist.anonymous_list):
# Watch out for existing Cc headers, merge, and remove dups. Note
# that RFC 2822 says only zero or one Cc header is allowed.
new = []
@@ -168,7 +170,7 @@ def process(mlist, msg, msgdata):
if msgdata.get('_nolist') or not mlist.include_rfc2369_headers:
return
# This will act like an email address for purposes of formataddr()
- listid = '%s.%s' % (mlist.internal_name(), mlist.host_name)
+ listid = '%s.%s' % (mlist.list_name, mlist.host_name)
cset = Utils.GetCharSet(mlist.preferred_language)
if mlist.description:
# Don't wrap the header since here we just want to get it properly RFC
@@ -184,9 +186,9 @@ def process(mlist, msg, msgdata):
# For internally crafted messages, we also add a (nonstandard),
# "X-List-Administrivia: yes" header. For all others (i.e. those coming
# from list posts), we add a bunch of other RFC 2369 headers.
- requestaddr = mlist.GetRequestEmail()
- subfieldfmt = '<%s>, <mailto:%s?subject=%ssubscribe>'
- listinfo = mlist.GetScriptURL('listinfo', absolute=1)
+ requestaddr = mlist.request_address
+ subfieldfmt = '<%s>, <mailto:%s>'
+ listinfo = mlist.script_url('listinfo')
headers = {}
# XXX reduced_list_headers used to suppress List-Help, List-Subject, and
# List-Unsubscribe from UserNotification. That doesn't seem to make sense
@@ -194,15 +196,15 @@ def process(mlist, msg, msgdata):
# suppressed).
headers.update({
'List-Help' : '<mailto:%s?subject=help>' % requestaddr,
- 'List-Unsubscribe': subfieldfmt % (listinfo, requestaddr, 'un'),
- 'List-Subscribe' : subfieldfmt % (listinfo, requestaddr, ''),
+ 'List-Unsubscribe': subfieldfmt % (listinfo, mlist.leave_address),
+ 'List-Subscribe' : subfieldfmt % (listinfo, mlist.join_address),
})
if msgdata.get('reduced_list_headers'):
headers['X-List-Administrivia'] = 'yes'
else:
# List-Post: is controlled by a separate attribute
if mlist.include_list_post_header:
- headers['List-Post'] = '<mailto:%s>' % mlist.GetListEmail()
+ headers['List-Post'] = '<mailto:%s>' % mlist.posting_address
# Add this header if we're archiving
if mlist.archive:
archiveurl = mlist.GetBaseArchiveURL()
@@ -226,9 +228,9 @@ def prefix_subject(mlist, msg, msgdata):
# Add the subject prefix unless the message is a digest or is being fast
# tracked (e.g. internally crafted, delivered to a single user such as the
# list admin).
- prefix = mlist.subject_prefix.strip()
- if not prefix:
+ if not mlist.subject_prefix.strip():
return
+ prefix = mlist.subject_prefix
subject = msg.get('subject', '')
# Try to figure out what the continuation_ws is for the header
if isinstance(subject, Header):
@@ -261,9 +263,6 @@ def prefix_subject(mlist, msg, msgdata):
# prefix have number, so we should search prefix w/number in subject.
# Also, force new style.
prefix_pattern = p.sub(r'\s*\d+\s*', prefix_pattern)
- old_style = False
- else:
- old_style = config.OLD_STYLE_PREFIXING
subject = re.sub(prefix_pattern, '', subject)
rematch = re.match('((RE|AW|SV|VS)(\[\d+\])?:\s*)+', subject, re.I)
if rematch:
@@ -284,9 +283,6 @@ def prefix_subject(mlist, msg, msgdata):
# Get the header as a Header instance, with proper unicode conversion
if not recolon:
h = uheader(mlist, prefix, 'Subject', continuation_ws=ws)
- elif old_style:
- h = uheader(mlist, recolon, 'Subject', continuation_ws=ws)
- h.append(prefix)
else:
h = uheader(mlist, prefix, 'Subject', continuation_ws=ws)
h.append(recolon)