From 5eb15c01b556620c77c0f7327494d4bf3117d115 Mon Sep 17 00:00:00 2001 From: Priyanka Kakadiya Date: Fri, 21 Jun 2019 11:45:00 +0000 Subject: [PATCH] [FIX] base, web: missing extension on binary downloads It's currently possible for binary downloads to be missing an extension entirely. Generate an extension from the mimetype and use that. Also ensure the existing extension (if any) matches the mimetype. Warning: this may require adding new mimetype/extensions pairs to the local mimetype database similar to f413d155df1c8f8fc15877fb6d9f737472291ae3. Also fix missing or incorrect filenames on records without a filename field: in some Odoo versions the client would send a filename of "null", resulting in a download of e.g. "null.pdf" instead of the attachment or inferred name. Task 2025716 closes odoo/odoo#34299 Signed-off-by: Xavier Morel (xmo) --- addons/web/static/src/js/views/form_widgets.js | 2 +- odoo/addons/base/ir/ir_http.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/views/form_widgets.js b/addons/web/static/src/js/views/form_widgets.js index 25b4fbed8ba..515ba674eb7 100644 --- a/addons/web/static/src/js/views/form_widgets.js +++ b/addons/web/static/src/js/views/form_widgets.js @@ -1144,7 +1144,7 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, { 'id': this.view.datarecord.id, 'field': this.name, 'filename_field': filename_fieldname, - 'filename': filename_field ? filename_field.get('value') : null, + 'filename': filename_field ? filename_field.get('value') : "", 'download': true, 'data': utils.is_bin_size(value) ? null : value, }, diff --git a/odoo/addons/base/ir/ir_http.py b/odoo/addons/base/ir/ir_http.py index df15e45df22..c01e6d4a4ea 100644 --- a/odoo/addons/base/ir/ir_http.py +++ b/odoo/addons/base/ir/ir_http.py @@ -303,9 +303,9 @@ class IrHttp(models.AbstractModel): if not filename: if filename_field in obj: filename = obj[filename_field] - elif module_resource_path: + if not filename and module_resource_path: filename = os.path.basename(module_resource_path) - else: + if not filename: filename = "%s-%s-%s" % (obj._name, obj.id, field) # mimetype @@ -320,6 +320,11 @@ class IrHttp(models.AbstractModel): if not mimetype: mimetype = guess_mimetype(base64.b64decode(content), default=default_mimetype) + # extension + extension = mimetypes.guess_extension(mimetype) + if extension and not filename.endswith(extension): + filename = "%s%s" % (filename, extension) + headers += [('Content-Type', mimetype), ('X-Content-Type-Options', 'nosniff')] # cache