From a68524264deb6223363194af0667c9b718ad28d4 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 25 Sep 2013 15:02:24 +0200 Subject: [PATCH] Two fixes Don't send Content-Length header if not needed. (see #480) Always use build_header... (see #473) --- modoboa/extensions/webmail/views.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/modoboa/extensions/webmail/views.py b/modoboa/extensions/webmail/views.py index 5d536f5aa..30c3055c6 100644 --- a/modoboa/extensions/webmail/views.py +++ b/modoboa/extensions/webmail/views.py @@ -1,6 +1,6 @@ # coding: utf-8 import os -from rfc6266 import build_header +from rfc6266 import build_header, parse_headers from django.conf import settings from django.http import HttpResponse from django.template import Template, Context @@ -29,6 +29,14 @@ from templatetags import webextras def getattachment(request): """Fetch a message attachment + The tricky part here consists in properly format the + *Content-Disposition* header. We use the rfc6266 package to encode + headers according to RFC5987 and RFC6266. + + Even if the header received from Dovecot is already encoded, we + decode and re-encode it to make sure it uses UTF-8. IE doesn't + support the ISO-8859-1 encoding even if it is allowed by RFCs. + FIXME: par manque de caching, le bodystructure du message est redemandé pour accéder aux headers de cette pièce jointe. @@ -52,15 +60,20 @@ def getattachment(request): if type(disp[1][0]) != dict: atype, fieldname, filename = disp[0], disp[1][0], disp[1][1] else: - atype, fieldname, filename = disp[0], disp[1][0]['struct'][0], disp[1][0]['struct'][1] + atype, fieldname, filename = \ + disp[0], disp[1][0]['struct'][0], disp[1][0]['struct'][1] if fieldname.endswith('*'): cd = '%s; %s=%s' % (atype, fieldname, filename) else: cd = '%s; %s="%s"' % (atype, fieldname, filename) + fname = parse_headers(cd).filename_unsafe else: - cd = build_header(request.GET["fname"]) - resp["Content-Disposition"] = cd - resp["Content-Length"] = partdef["size"] + fname = request.GET.get("fname", None) + if fname is None: + raise WebmailError(_("Invalid request")) + resp["Content-Disposition"] = build_header(fname) + if int(partdef["size"]) < 200: + resp["Content-Length"] = partdef["size"] return resp