From 7a34e8c169bf391e07b0d0370729ed467275e5e7 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Thu, 4 Feb 2021 12:27:14 -0800 Subject: [PATCH] Fixed international download filenames. --- meshdevicefile.js | 4 ++-- redirserver.js | 2 +- webserver.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/meshdevicefile.js b/meshdevicefile.js index 41b919fd..1e071228 100644 --- a/meshdevicefile.js +++ b/meshdevicefile.js @@ -294,9 +294,9 @@ module.exports.CreateMeshDeviceFile = function (parent, ws, res, req, domain, us // Set the content disposition header for a HTTP response. // Because the filename can't have any special characters in it, we need to be extra careful. function setContentDispositionHeader(res, type, name, size, altname) { - if (name != null) { name = require('path').basename(name).split('\\').join('').split('/').join('').split(':').join('').split('*').join('').split('?').join('').split('"').join('').split('<').join('').split('>').join('').split('|').join('').split(' ').join('').split('\'').join(''); } else { name = altname; } + if (name != null) { name = require('path').basename(name).split('\\').join('').split('/').join('').split(':').join('').split('*').join('').split('?').join('').split('"').join('').split('<').join('').split('>').join('').split('|').join('').split('\'').join(''); } else { name = altname; } try { - var x = { 'Cache-Control': 'no-store', 'Content-Type': type, 'Content-Disposition': 'attachment; filename="' + name + '"' }; + var x = { 'Cache-Control': 'no-store', 'Content-Type': type, 'Content-Disposition': 'attachment; filename*="' + encodeURIComponent(name) + '"; filename="' + altname + '"' }; if (typeof size == 'number') { x['Content-Length'] = size; } res.set(x); } catch (ex) { diff --git a/redirserver.js b/redirserver.js index 3e1048dd..b418b92a 100644 --- a/redirserver.js +++ b/redirserver.js @@ -53,7 +53,7 @@ module.exports.CreateRedirServer = function (parent, db, args, func) { obj.app.get('/MeshServerRootCert.cer', function (req, res) { // The redirection server starts before certificates are loaded, make sure to handle the case where no certificate is loaded now. if (obj.certificates != null) { - res.set({ 'Cache-Control': 'no-store', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename="' + obj.certificates.RootName + '.cer"' }); + res.set({ 'Cache-Control': 'no-store', 'Content-Type': 'application/octet-stream', 'Content-Disposition': 'attachment; filename*="' + encodeURIComponent(obj.certificates.RootName) + '.cer"' }); var rootcert = obj.certificates.root.cert; var i = rootcert.indexOf('-----BEGIN CERTIFICATE-----\r\n'); if (i >= 0) { rootcert = rootcert.substring(i + 29); } diff --git a/webserver.js b/webserver.js index cf1bdb86..334278ba 100644 --- a/webserver.js +++ b/webserver.js @@ -6705,9 +6705,9 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) { // Set the content disposition header for a HTTP response. // Because the filename can't have any special characters in it, we need to be extra careful. function setContentDispositionHeader(res, type, name, size, altname) { - var name = require('path').basename(name).split('\\').join('').split('/').join('').split(':').join('').split('*').join('').split('?').join('').split('"').join('').split('<').join('').split('>').join('').split('|').join('').split(' ').join('').split('\'').join(''); + var name = require('path').basename(name).split('\\').join('').split('/').join('').split(':').join('').split('*').join('').split('?').join('').split('"').join('').split('<').join('').split('>').join('').split('|').join('').split('\'').join(''); try { - var x = { 'Cache-Control': 'no-store', 'Content-Type': type, 'Content-Disposition': 'attachment; filename="' + name + '"' }; + var x = { 'Cache-Control': 'no-store', 'Content-Type': type, 'Content-Disposition': 'attachment; filename*="' + encodeURIComponent(name) + '"; filename="' + altname + '"' }; if (typeof size == 'number') { x['Content-Length'] = size; } res.set(x); } catch (ex) {