From 97c2ce77b6de3ec722a597d65fb554e4c68d5ab7 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Thu, 18 Feb 2021 10:19:13 +0200 Subject: [PATCH] added minSize and maxSize search parameters --- docs/api/openapi.yml | 10 ++++++++++ imap-core/lib/indexer/indexer.js | 4 ++-- lib/api/messages.js | 18 ++++++++++++++++-- lib/api/submit.js | 4 ++-- package.json | 24 ++++++++++++------------ 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/docs/api/openapi.yml b/docs/api/openapi.yml index 96e843a5..101a7254 100644 --- a/docs/api/openapi.yml +++ b/docs/api/openapi.yml @@ -1681,6 +1681,16 @@ paths: description: 'Partial match for the Subject: header line' schema: type: string + - name: minSize + in: query + description: Minimal message size in bytes + schema: + type: number + - name: maxSize + in: query + description: Maximal message size in bytes + schema: + type: number - name: limit in: query description: How many records to return diff --git a/imap-core/lib/indexer/indexer.js b/imap-core/lib/indexer/indexer.js index 8d6607b5..3ee32239 100644 --- a/imap-core/lib/indexer/indexer.js +++ b/imap-core/lib/indexer/indexer.js @@ -10,7 +10,7 @@ const libqp = require('libqp'); const libbase64 = require('libbase64'); const iconv = require('iconv-lite'); const he = require('he'); -const htmlToText = require('html-to-text'); +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 @@ -502,7 +502,7 @@ class Indexer { if (!alternative) { try { if (content && content.length < MAX_HTML_PARSE_LENGTH) { - let text = htmlToText.fromString(content); + let text = htmlToText(content); textContent.push(text.trim()); } } catch (E) { diff --git a/lib/api/messages.js b/lib/api/messages.js index 7a5d294b..6f4249cd 100644 --- a/lib/api/messages.js +++ b/lib/api/messages.js @@ -7,7 +7,7 @@ const Joi = require('joi'); const MongoPaging = require('mongo-cursor-pagination'); const addressparser = require('nodemailer/lib/addressparser'); const MailComposer = require('nodemailer/lib/mail-composer'); -const htmlToText = require('html-to-text'); +const { htmlToText } = require('html-to-text'); const ObjectID = require('mongodb').ObjectID; const tools = require('../tools'); const consts = require('../consts'); @@ -413,6 +413,8 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler) => { from: Joi.string().trim().empty(''), to: Joi.string().trim().empty(''), subject: Joi.string().trim().empty(''), + minSize: Joi.number().empty(''), + maxSize: Joi.number().empty(''), attachments: booleanSchema, flagged: booleanSchema, unseen: booleanSchema, @@ -465,6 +467,8 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler) => { let filterFlagged = result.value.flagged; let filterUnseen = result.value.unseen; let filterSearchable = result.value.searchable; + let filterMinSize = result.value.minSize; + let filterMaxSize = result.value.maxSize; let limit = result.value.limit; let page = result.value.page; @@ -700,6 +704,16 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler) => { filter.ha = true; } + if (filterMinSize) { + filter.size = filter.size || {}; + filter.size.$gte = filterMinSize; + } + + if (filterMaxSize) { + filter.size = filter.size || {}; + filter.size.$lte = filterMaxSize; + } + if (orQuery.length) { filter.$or = orQuery; } @@ -1766,7 +1780,7 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler) => { if (data.html && !data.text) { try { // might explode on long or strange strings - data.text = htmlToText.fromString(data.html); + data.text = htmlToText(data.html); } catch (E) { // ignore } diff --git a/lib/api/submit.js b/lib/api/submit.js index f3011cbf..008d02ae 100644 --- a/lib/api/submit.js +++ b/lib/api/submit.js @@ -5,7 +5,7 @@ const log = require('npmlog'); const libmime = require('libmime'); const util = require('util'); const MailComposer = require('nodemailer/lib/mail-composer'); -const htmlToText = require('html-to-text'); +const { htmlToText } = require('html-to-text'); const Joi = require('joi'); const ObjectID = require('mongodb').ObjectID; const tools = require('../tools'); @@ -386,7 +386,7 @@ module.exports = (db, server, messageHandler, userHandler) => { if (data.html && !data.text) { try { // might explode on long or strange strings - data.text = htmlToText.fromString(data.html); + data.text = htmlToText(data.html); } catch (E) { // ignore } diff --git a/package.json b/package.json index 8109e21b..ee907f30 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,10 @@ "author": "Andris Reinman", "license": "EUPL-1.2", "devDependencies": { - "ajv": "7.0.3", - "chai": "4.2.0", + "ajv": "7.1.1", + "chai": "4.3.0", "docsify-cli": "4.4.2", - "eslint": "7.19.0", + "eslint": "7.20.0", "eslint-config-nodemailer": "1.2.0", "eslint-config-prettier": "7.2.0", "grunt": "1.3.0", @@ -28,9 +28,9 @@ "grunt-mocha-test": "0.13.3", "grunt-shell-spawn": "0.4.0", "grunt-wait": "0.3.0", - "imapflow": "1.0.51", - "mailparser": "3.0.1", - "mocha": "8.2.1", + "imapflow": "1.0.53", + "mailparser": "3.1.0", + "mocha": "8.3.0", "request": "2.88.2", "supertest": "6.1.3" }, @@ -41,17 +41,17 @@ "axios": "0.21.1", "base32.js": "0.1.0", "bcryptjs": "2.4.3", - "bull": "3.20.0", + "bull": "3.20.1", "gelf": "2.0.1", "generate-password": "1.6.0", "he": "1.2.0", - "html-to-text": "6.0.0", + "html-to-text": "7.0.0", "humanname": "0.2.2", "iconv-lite": "0.6.2", "ioredfour": "1.0.2-ioredis-03", - "ioredis": "4.19.4", + "ioredis": "4.22.0", "isemail": "3.2.0", - "joi": "17.3.0", + "joi": "17.4.0", "js-yaml": "4.0.0", "key-fingerprint": "1.1.0", "libbase64": "1.2.1", @@ -60,10 +60,10 @@ "mailsplit": "5.0.1", "mobileconfig": "2.3.1", "mongo-cursor-pagination": "7.3.1", - "mongodb": "3.6.3", + "mongodb": "3.6.4", "mongodb-extended-json": "1.11.0", "node-forge": "0.10.0", - "nodemailer": "6.4.17", + "nodemailer": "6.4.18", "npmlog": "4.1.2", "openpgp": "4.10.10", "pem": "1.14.4",