Skip to content

Commit

Permalink
fix(data-uri): Do not use regular expressions for parsing data URI sc…
Browse files Browse the repository at this point in the history
…hemes
  • Loading branch information
andris9 committed Feb 22, 2024
1 parent dd8f5e8 commit 12e65e9
Showing 1 changed file with 56 additions and 8 deletions.
64 changes: 56 additions & 8 deletions lib/mail-composer/index.js
Expand Up @@ -537,12 +537,17 @@ class MailComposer {
* @return {Object} Parsed element
*/
_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 = this.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;

if ('path' in element) {
element.path = false;
Expand All @@ -552,13 +557,56 @@ class MailComposer {
element.href = false;
}

parts[1].split(';').forEach(item => {
if (/^\w+\/[^/]+$/i.test(item)) {
element.contentType = element.contentType || item.toLowerCase();
return element;
}

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;
}
});
}

return element;
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 };
}
}

Expand Down

0 comments on commit 12e65e9

Please sign in to comment.