aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbwarsaw <>2003-12-18 14:57:29 +0000
committerbwarsaw <>2003-12-18 14:57:29 +0000
commit4449fa2eca5cc86990e1cde67460c9f9e39c49f5 (patch)
tree370d0803b5ecb94a787dead7bcfcea74b7de7a5c
parent9d78d653a0e8dd7d762b520bdd311fbbf483e2c5 (diff)
downloadmailman2-4449fa2eca5cc86990e1cde67460c9f9e39c49f5.tar.gz
mailman2-4449fa2eca5cc86990e1cde67460c9f9e39c49f5.tar.xz
mailman2-4449fa2eca5cc86990e1cde67460c9f9e39c49f5.zip
uheader(): Added default argument for maxlinelen.
process(): Reworked the way we calculate the List-Id header in the face of i18n descriptions which may need to be quoted (if ASCII and containing RFC 2822 special chars). What we do now is RFC 2047 encode just the description part, if there is one, then use formataddr() to combine that with the email address-like list identification.
-rw-r--r--Mailman/Handlers/CookHeaders.py23
1 files changed, 12 insertions, 11 deletions
diff --git a/Mailman/Handlers/CookHeaders.py b/Mailman/Handlers/CookHeaders.py
index 6e8c0c6c..8e47d301 100644
--- a/Mailman/Handlers/CookHeaders.py
+++ b/Mailman/Handlers/CookHeaders.py
@@ -39,7 +39,7 @@ MAXLINELEN = 78
def _isunicode(s):
return isinstance(s, UnicodeType)
-def uheader(mlist, s, header_name=None, continuation_ws='\t'):
+def uheader(mlist, s, header_name=None, continuation_ws='\t', maxlinelen=None):
# Get the charset to encode the string in. If this is us-ascii, we'll use
# iso-8859-1 instead, just to get a little extra coverage, and because the
# Header class tries us-ascii first anyway.
@@ -54,8 +54,7 @@ def uheader(mlist, s, header_name=None, continuation_ws='\t'):
codec = charset.input_codec or 'ascii'
s = unicode(s, codec, 'replace')
# We purposefully leave no space b/w prefix and subject!
- return Header(s, charset, header_name=header_name,
- continuation_ws=continuation_ws)
+ return Header(s, charset, maxlinelen, header_name, continuation_ws)
@@ -164,16 +163,18 @@ def process(mlist, msg, msgdata):
# headers by default, pissing off their users. Too bad. Fix the MUAs.
if msgdata.get('_nolist') or not mlist.include_rfc2369_headers:
return
- # Pre-calculate
- listid = '<%s.%s>' % (mlist.internal_name(), mlist.host_name)
+ # This will act like an email address for purposes of formataddr()
+ listid = '%s.%s' % (mlist.internal_name(), mlist.host_name)
if mlist.description:
- # Make sure description is properly i18n'd
- listid_h = uheader(mlist, u'"' + mlist.description + u'"', 'List-Id')
- listid_h.append(listid, 'us-ascii')
+ # Don't wrap the header since here we just want to get it properly RFC
+ # 2047 encoded.
+ h = uheader(mlist, mlist.description, 'List-Id', maxlinelen=10000)
+ desc = str(h)
else:
- # For wrapping
- listid_h = Header(listid, 'us-ascii', header_name='List-Id')
- # We always add a List-ID: header.
+ desc = ''
+ listid_h = formataddr((desc, listid))
+ # We always add a List-ID: header. Do an parse/format roundtrip to
+ # properly quote any funny characters in the description.
del msg['list-id']
msg['List-Id'] = listid_h
# For internally crafted messages, we