[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
f413d155df.

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) <xmo@odoo.com>
This commit is contained in:
Priyanka Kakadiya
2019-06-27 08:26:49 +00:00
committed by Xavier Morel
parent d870749d79
commit 5eb15c01b5
2 changed files with 8 additions and 3 deletions
@@ -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,
},
+7 -2
View File
@@ -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