nodemailer
Advanced tools
Comparing version 6.9.9 to 6.9.10
# CHANGELOG | ||
## [6.9.10](https://github.com/nodemailer/nodemailer/compare/v6.9.9...v6.9.10) (2024-02-22) | ||
### Bug Fixes | ||
* **data-uri:** Do not use regular expressions for parsing data URI schemes ([12e65e9](https://github.com/nodemailer/nodemailer/commit/12e65e975d80efe6bafe6de4590829b3b5ebb492)) | ||
* **data-uri:** Moved all data-uri regexes to use the non-regex parseDataUri method ([edd5dfe](https://github.com/nodemailer/nodemailer/commit/edd5dfe5ce9b725f8b8ae2830797f65b2a2b0a33)) | ||
## [6.9.9](https://github.com/nodemailer/nodemailer/compare/v6.9.8...v6.9.9) (2024-02-01) | ||
@@ -4,0 +12,0 @@ |
@@ -7,2 +7,3 @@ /* eslint no-undefined: 0 */ | ||
const mimeFuncs = require('../mime-funcs'); | ||
const parseDataURI = require('../shared').parseDataURI; | ||
@@ -541,8 +542,13 @@ /** | ||
_processDataUrl(element) { | ||
let parts = (element.path || element.href).match(/^data:((?:[^;]*;){0,20}(?:[^,]*)),(.*)$/i); | ||
if (!parts) { | ||
let parsedDataUri; | ||
if ((element.path || element.href).match(/^data:/)) { | ||
parsedDataUri = parseDataURI(element.path || element.href); | ||
} | ||
if (!parsedDataUri) { | ||
return element; | ||
} | ||
element.content = /\bbase64$/i.test(parts[1]) ? Buffer.from(parts[2], 'base64') : Buffer.from(decodeURIComponent(parts[2])); | ||
element.content = parsedDataUri.data; | ||
element.contentType = element.contentType || parsedDataUri.contentType; | ||
@@ -557,8 +563,2 @@ if ('path' in element) { | ||
parts[1].split(';').forEach(item => { | ||
if (/^\w+\/[^/]+$/i.test(item)) { | ||
element.contentType = element.contentType || item.toLowerCase(); | ||
} | ||
}); | ||
return element; | ||
@@ -565,0 +565,0 @@ } |
@@ -421,2 +421,51 @@ /* eslint no-console: 0 */ | ||
module.exports.parseDataURI = uri => { | ||
let input = uri; | ||
let commaPos = input.indexOf(','); | ||
if (!commaPos) { | ||
return uri; | ||
} | ||
let data = input.substring(commaPos + 1); | ||
let metaStr = input.substring('data:'.length, commaPos); | ||
let encoding; | ||
let metaEntries = metaStr.split(';'); | ||
let lastMetaEntry = metaEntries.length > 1 ? metaEntries[metaEntries.length - 1] : false; | ||
if (lastMetaEntry && lastMetaEntry.indexOf('=') < 0) { | ||
encoding = lastMetaEntry.toLowerCase(); | ||
metaEntries.pop(); | ||
} | ||
let contentType = metaEntries.shift() || 'application/octet-stream'; | ||
let params = {}; | ||
for (let entry of metaEntries) { | ||
let sep = entry.indexOf('='); | ||
if (sep >= 0) { | ||
let key = entry.substring(0, sep); | ||
let value = entry.substring(sep + 1); | ||
params[key] = value; | ||
} | ||
} | ||
switch (encoding) { | ||
case 'base64': | ||
data = Buffer.from(data, 'base64'); | ||
break; | ||
case 'utf8': | ||
data = Buffer.from(data); | ||
break; | ||
default: | ||
try { | ||
data = Buffer.from(decodeURIComponent(data)); | ||
} catch (err) { | ||
data = Buffer.from(data); | ||
} | ||
data = Buffer.from(data); | ||
} | ||
return { data, encoding, contentType, params }; | ||
}; | ||
/** | ||
@@ -474,7 +523,8 @@ * Resolves a String or a Buffer value for content value. Useful if the value | ||
} else if (/^data:/i.test(content.path || content.href)) { | ||
let parts = (content.path || content.href).match(/^data:((?:[^;]*;)*(?:[^,]*)),(.*)$/i); | ||
if (!parts) { | ||
let parsedDataUri = module.exports.parseDataURI(content.path || content.href); | ||
if (!parsedDataUri || !parsedDataUri.data) { | ||
return callback(null, Buffer.from(0)); | ||
} | ||
return callback(null, /\bbase64$/i.test(parts[1]) ? Buffer.from(parts[2], 'base64') : Buffer.from(decodeURIComponent(parts[2]))); | ||
return callback(null, parsedDataUri.data); | ||
} else if (content.path) { | ||
@@ -481,0 +531,0 @@ return resolveStream(fs.createReadStream(content.path), callback); |
{ | ||
"name": "nodemailer", | ||
"version": "6.9.9", | ||
"version": "6.9.10", | ||
"description": "Easy as cake e-mail sending from your Node.js applications", | ||
@@ -5,0 +5,0 @@ "main": "lib/nodemailer.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
501590
12085