From 34cf55d5004608a4fba64019eaa53ff997dd1559 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Wed, 3 Jul 2019 11:37:26 +0300 Subject: [PATCH] fix message parsing for too large messages --- examples/append.js | 59 ++++++++++++++++++++++++++++++++ imap-core/lib/commands/append.js | 8 +++++ imap-core/lib/indexer/indexer.js | 8 +++-- 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 examples/append.js diff --git a/examples/append.js b/examples/append.js new file mode 100644 index 00000000..a4b9d45f --- /dev/null +++ b/examples/append.js @@ -0,0 +1,59 @@ +/* eslint no-console:0 */ + +'use strict'; +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; +const rawpath = process.argv[2]; + +const config = require('wild-config'); +const BrowserBox = require('browserbox'); + +const raw = require('fs').readFileSync(rawpath); +console.log('Processing %s of %s bytes', rawpath, raw.length); + +const client = new BrowserBox('localhost', config.imap.port, { + useSecureTransport: config.imap.secure, + auth: { + user: 'myuser', + pass: 'verysecret' + }, + id: { + name: 'My Client', + version: '0.1' + }, + tls: { + rejectUnauthorized: false + } +}); + +client.onerror = function(err) { + console.log(err); + process.exit(1); +}; + +client.onauth = function() { + client.upload('INBOX', raw, false, err => { + if (err) { + console.log(err); + return process.exit(1); + } + + client.selectMailbox('INBOX', (err, mailbox) => { + if (err) { + console.log(err); + return process.exit(1); + } + console.log(mailbox); + + client.listMessages(mailbox.exists, ['BODY.PEEK[]', 'BODYSTRUCTURE'], (err, data) => { + if (err) { + console.log(err); + return process.exit(1); + } + console.log('<<<%s>>>', data[0]['body[]']); + return process.exit(0); + }); + }); + }); +}; + +client.connect(); diff --git a/imap-core/lib/commands/append.js b/imap-core/lib/commands/append.js index 1cd4d871..b14c6510 100644 --- a/imap-core/lib/commands/append.js +++ b/imap-core/lib/commands/append.js @@ -140,6 +140,14 @@ module.exports = { logdata._response = err.response; this._server.loggelf(logdata); + if (err.code === 10334) { + // 10334 is Mongodb BSONObjectTooLarge + return callback(null, { + response: 'NO', + message: 'Message text too large' + }); + } + // do not return actual error to user return callback(null, { response: 'NO', diff --git a/imap-core/lib/indexer/indexer.js b/imap-core/lib/indexer/indexer.js index 43d55c4a..90bb880a 100644 --- a/imap-core/lib/indexer/indexer.js +++ b/imap-core/lib/indexer/indexer.js @@ -13,6 +13,8 @@ const he = require('he'); const htmlToText = require('html-to-text'); const crypto = require('crypto'); +const MAX_HTML_PARSE_LENGTH = 2 * 1024 * 1024; // do not parse HTML messages larger than 2MB to plaintext + class Indexer { constructor(options) { this.options = options || {}; @@ -347,8 +349,10 @@ class Indexer { htmlContent.push(content.trim()); if (!alternative) { try { - let text = htmlToText.fromString(content); - textContent.push(text.trim()); + if (content && content.length < MAX_HTML_PARSE_LENGTH) { + let text = htmlToText.fromString(content); + textContent.push(text.trim()); + } } catch (E) { // ignore }