summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-07-01 06:27:07 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-07-01 06:27:07 +0000
commit5eb53a6397bcd58563abe1a2bd9bd65b74349b7a (patch)
tree6da96813ccb39891f5cea846269ee25f241d823a
parenta61d4ebd5f4b49b296063eae603faa3c456d26e5 (diff)
unicode: Fixed a method resolution order (mro) problem introduced in [5547]
that broke non-ASCII email headers. git-svn-id: http://code.djangoproject.com/svn/django/branches/unicode@5581 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/core/mail.py29
1 files changed, 20 insertions, 9 deletions
diff --git a/django/core/mail.py b/django/core/mail.py
index 4cfb5f37cb..96a32ed62d 100644
--- a/django/core/mail.py
+++ b/django/core/mail.py
@@ -63,7 +63,7 @@ def make_msgid(idstring=None):
class BadHeaderError(ValueError):
pass
-class SafeHeaderMixin(object):
+class SafeMIMEText(MIMEText):
def __setitem__(self, name, val):
"Forbids multi-line headers, to prevent header injection."
if '\n' in val or '\r' in val:
@@ -80,15 +80,26 @@ class SafeHeaderMixin(object):
val = ', '.join(result)
else:
val = Header(force_unicode(val), settings.DEFAULT_CHARSET)
- # Note: using super() here is safe; any __setitem__ overrides must use
- # the same argument signature.
- super(SafeHeaderMixin, self).__setitem__(name, val)
+ MIMEText.__setitem__(self, name, val)
-class SafeMIMEText(MIMEText, SafeHeaderMixin):
- pass
-
-class SafeMIMEMultipart(MIMEMultipart, SafeHeaderMixin):
- pass
+class SafeMIMEMultipart(MIMEMultipart):
+ def __setitem__(self, name, val):
+ "Forbids multi-line headers, to prevent header injection."
+ if '\n' in val or '\r' in val:
+ raise BadHeaderError, "Header values can't contain newlines (got %r for header %r)" % (val, name)
+ try:
+ val = str(force_unicode(val))
+ except UnicodeEncodeError:
+ if name.lower() in ('to', 'from', 'cc'):
+ result = []
+ for item in val.split(', '):
+ nm, addr = parseaddr(item)
+ nm = str(Header(nm, settings.DEFAULT_CHARSET))
+ result.append(formataddr((nm, str(addr))))
+ val = ', '.join(result)
+ else:
+ val = Header(force_unicode(val), settings.DEFAULT_CHARSET)
+ MIMEMultipart.__setitem__(self, name, val)
class SMTPConnection(object):
"""