diff --git a/lib/filter-handler.js b/lib/filter-handler.js index 92ecaa7e..12315850 100644 --- a/lib/filter-handler.js +++ b/lib/filter-handler.js @@ -91,7 +91,9 @@ class FilterHandler { return callback(null, false); } return db.users.collection('users').findOne( - { _id: addressData.user }, + { + _id: addressData.user + }, { fields }, @@ -171,8 +173,12 @@ class FilterHandler { db.database .collection('filters') - .find({ user: userData._id }) - .sort({ _id: 1 }) + .find({ + user: userData._id + }) + .sort({ + _id: 1 + }) .toArray((err, filters) => { if (err) { // ignore, as filtering is not so important @@ -394,36 +400,60 @@ class FilterHandler { skipExisting: true }; + let received = [].concat((prepared.mimeTree.parsedHeader && prepared.mimeTree.parsedHeader.received) || []); + if (received.length) { + let receivedData = parseReceived(received[0]); + + if (receivedData.has('with')) { + messageOpts.meta.transtype = receivedData.get('with'); + } + + if (receivedData.has('id')) { + messageOpts.meta.queueId = receivedData.get('id'); + } + + if (receivedData.has('from')) { + messageOpts.meta.origin = receivedData.get('from'); + } + } + if (outbound && outbound.length) { messageOpts.outbound = [].concat(outbound || []); } - this.messageHandler.encryptMessage(userData.encryptMessages ? userData.pubKey : false, { chunks, chunklen }, (err, encrypted) => { - if (!err && encrypted) { - messageOpts.prepared = this.messageHandler.prepareMessage({ - raw: Buffer.concat([extraHeader, encrypted]), - indexedHeaders: this.spamHeaderKeys - }); - messageOpts.maildata = this.messageHandler.indexer.getMaildata(messageOpts.prepared.mimeTree); - } + this.messageHandler.encryptMessage( + userData.encryptMessages ? userData.pubKey : false, + { + chunks, + chunklen + }, + (err, encrypted) => { + if (!err && encrypted) { + messageOpts.prepared = this.messageHandler.prepareMessage({ + raw: Buffer.concat([extraHeader, encrypted]), + indexedHeaders: this.spamHeaderKeys + }); + messageOpts.maildata = this.messageHandler.indexer.getMaildata(messageOpts.prepared.mimeTree); + } - this.messageHandler.add(messageOpts, (err, inserted, info) => { - // push to response list - callback( - null, - { - userData, - response: err ? err : 'Message stored as ' + info.id.toString() - }, - !encrypted - ? { - mimeTree: messageOpts.prepared.mimeTree, - maildata: messageOpts.maildata - } - : false - ); - }); - }); + this.messageHandler.add(messageOpts, (err, inserted, info) => { + // push to response list + callback( + null, + { + userData, + response: err ? err : 'Message stored as ' + info.id.toString() + }, + !encrypted + ? { + mimeTree: messageOpts.prepared.mimeTree, + maildata: messageOpts.maildata + } + : false + ); + }); + } + ); }); }); }); @@ -554,3 +584,32 @@ function prepareSpamChecks(spamHeader) { }) .filter(check => check); } + +function parseReceived(str) { + let result = new Map(); + + str + .trim() + .replace(/[\r\n\s\t]+/g, ' ') + .trim() + .replace(/(^|\s+)(from|by|with|id|for)\s+([^\s]+)/gi, (m, p, k, v) => { + let key = k.toLowerCase(); + let value = v; + if (!result.has(key)) { + result.set(key, value); + } + }); + + let date = str + .split(';') + .pop() + .trim(); + if (date) { + date = new Date(date); + if (date.getTime()) { + result.set('date', date); + } + } + + return result; +} diff --git a/lmtp.js b/lmtp.js index f2945f69..d0e2f77a 100644 --- a/lmtp.js +++ b/lmtp.js @@ -168,7 +168,7 @@ const serverOptions = { chunklen, meta: { transactionId, - source: 'LMTP', + source: 'MX', from: sender, to: [recipient], origin: session.remoteAddress,