From bfe6229cb135528021e1495640eae2595dd13bd2 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Thu, 14 Mar 2024 13:20:55 +0200 Subject: [PATCH] fix(connections): Added additional logging to detect broken reconnections --- data/google-crawlers.json | 2 +- lib/imap-connection.js | 79 +++++++++++++++++++++++++++++++++------ package.json | 4 +- sbom.json | 2 +- static/licenses.html | 20 +++++++--- translations/messages.pot | 26 ++++++------- 6 files changed, 100 insertions(+), 33 deletions(-) diff --git a/data/google-crawlers.json b/data/google-crawlers.json index 1732b92e8..c1ebd350d 100644 --- a/data/google-crawlers.json +++ b/data/google-crawlers.json @@ -1,5 +1,5 @@ { - "creationTime": "2024-03-05T23:00:43.000000", + "creationTime": "2024-03-12T23:00:54.000000", "prefixes": [ { "ipv6Prefix": "2001:4860:4801:2008::/64" diff --git a/lib/imap-connection.js b/lib/imap-connection.js index ffe37f54c..64d9a5992 100644 --- a/lib/imap-connection.js +++ b/lib/imap-connection.js @@ -148,6 +148,8 @@ class IMAPConnection extends BaseClient { this.syncing = false; + this.connectionCount = 0; + this.state = 'connecting'; } @@ -203,7 +205,7 @@ class IMAPConnection extends BaseClient { return null; } - const commandCid = `${this.cid}:c`; + const commandCid = `${this.cid}:c:${this.connectionCount++}`; let imapConfig = await this.getImapConfig(accountData); @@ -621,7 +623,7 @@ class IMAPConnection extends BaseClient { }); imapClient.on('close', async () => { - this.logger.info({ msg: 'Connection closed', type: 'imapClient', account: this.account }); + this.logger.info({ msg: 'Connection closed', type: 'imapClient', account: this.account, disabled: imapClient.disabled }); try { for (let [, mailbox] of this.mailboxes) { @@ -662,7 +664,18 @@ class IMAPConnection extends BaseClient { } async reconnect(force) { + this.logger.debug({ msg: 'Establishing connection', force }); if (this.paused || this._connecting || this.isClosing || (this.isClosed && !force)) { + this.logger.debug({ + msg: 'Skipped establishing connection', + paused: this.paused, + hasClient: !!this.imapClient, + usable: this.imapClient?.usable, + connecting: this._connecting, + closing: this.isClosing, + closed: this.isClosed, + force + }); return false; } @@ -677,31 +690,63 @@ class IMAPConnection extends BaseClient { } try { + this.logger.debug({ msg: 'Initiating connection to IMAP' }); await backOff(() => this.start(), { maxDelay: MAX_BACKOFF_DELAY, numOfAttempts: Infinity, retry: () => !this.isClosing && !this.isClosed, startingDelay: 2000 }); + this.logger.debug({ + msg: 'Connection initiated', + hasClient: !!this.imapClient, + usable: this.imapClient && this.imapClient.usable, + connected: this.isConnected() + }); } finally { this._connecting = false; } if (this.paused) { + this.logger.debug({ msg: 'Skipped connection setup', reason: 'paused' }); return; } if (this.state === 'unset') { + this.logger.debug({ msg: 'Skipped connection setup', reason: 'unset' }); return; } try { await this.checkIMAPConnection(); + this.logger.debug({ msg: 'Starting mailbox sync' }); await this.syncMailboxes(); + this.logger.debug({ msg: 'Mailboxes synced', usable: this.imapClient?.usable }); + + if (this.imapClient?.usable) { + // was able to finish syncing, clear the failure flag + try { + await this.connection.redis.hdel(this.connection.getAccountKey(), 'syncError'); + } catch (err) { + // ignore + } + } } catch (err) { // ended in an unconncted state - this.logger.error({ msg: 'Failed to set up connection', err }); + this.logger.error({ msg: 'Failed to set up connection, will retry', err }); + return setTimeout(() => { + this.reconnect().catch(err => { + this.logger.error({ msg: 'Gave up setting up a connection', err }); + }); + }, 1000); } + + this.logger.debug({ + msg: 'Connection established', + hasClient: !!this.imapClient, + usable: this.imapClient && this.imapClient.usable, + connected: this.isConnected() + }); } async setStateVal() { @@ -730,7 +775,8 @@ class IMAPConnection extends BaseClient { clearTimeout(this.resyncTimer); clearTimeout(this.completedTimer); - if (!this.imapClient) { + if (!this.imapClient || !this.imapClient.usable) { + this.logger.debug({ msg: 'Skipped syncing', reason: 'no imap client' }); return; } @@ -741,7 +787,8 @@ class IMAPConnection extends BaseClient { } } - if (!this.imapClient) { + if (!this.imapClient || !this.imapClient.usable) { + this.logger.debug({ msg: 'Syncing completed, skipping state change', reason: 'no imap client' }); return; } @@ -777,21 +824,27 @@ class IMAPConnection extends BaseClient { return; } + this.logger.debug({ msg: 'Syncing completed, selecting main path', path: mainPath }); // start waiting for changes await this.select(mainPath); // schedule next sync - clearTimeout(this.resyncTimer); - this.resyncTimer = setTimeout(() => { - this.syncMailboxes().catch(err => { - this.logger.error({ msg: 'Mailbox Sync Error', err }); - }); - }, this.resyncDelay); + let setSyncTimer = () => { + clearTimeout(this.resyncTimer); + this.resyncTimer = setTimeout(() => { + this.syncMailboxes().catch(err => { + this.logger.error({ msg: 'Mailbox Sync Error', err }); + setSyncTimer(); + }); + }, this.resyncDelay); + }; + setSyncTimer(); } async select(path) { if (!this.mailboxes.has(normalizePath(path))) { // nothing to do here, mailbox not found + this.logger.debug({ msg: 'Can not select unlisted path', path }); return; } @@ -1130,12 +1183,14 @@ class IMAPConnection extends BaseClient { async start() { if (this.paused) { + this.logger.debug({ msg: 'Skipped start', reason: 'paused' }); return; } let initialState = this.state; if (this.imapClient) { + this.logger.debug({ msg: 'Clearing previous connection' }); this.imapClient.disabled = true; try { this.imapClient.removeAllListeners(); @@ -1144,6 +1199,7 @@ class IMAPConnection extends BaseClient { }); this.imapClient.close(); if (this.connectionClient) { + this.logger.debug({ msg: 'Clearing previous command connection' }); this.connectionClient.close(); } } catch (err) { @@ -1166,6 +1222,7 @@ class IMAPConnection extends BaseClient { } let imapConfig = await this.getImapConfig(accountData); + imapConfig.id = `${imapConfig.id}:m:${this.connectionCount++}`; this.imapClient = new ImapFlow( Object.assign({}, imapConfig, { diff --git a/package.json b/package.json index 29f3b1bd2..2c72bf097 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@hapi/boom": "10.0.1", "@hapi/cookie": "12.0.1", "@hapi/crumb": "9.0.1", - "@hapi/hapi": "21.3.3", + "@hapi/hapi": "21.3.6", "@hapi/inert": "7.1.0", "@hapi/vision": "7.0.3", "@phc/pbkdf2": "1.1.14", @@ -93,7 +93,7 @@ "murmurhash": "2.0.1", "nanoid": "3.3.4", "node-gettext": "3.0.0", - "nodemailer": "6.9.11", + "nodemailer": "6.9.12", "pino": "8.19.0", "prom-client": "15.1.0", "psl": "1.9.0", diff --git a/sbom.json b/sbom.json index f85df6640..04ccee2e6 100644 --- a/sbom.json +++ b/sbom.json @@ -1 +1 @@ -{"bomFormat":"CycloneDX","specVersion":"1.4","version":1,"metadata":{"timestamp":"2024-03-08T09:05:15Z","tools":[{"vendor":"advanced-security","name":"gh-sbom","version":"0.0.9"}],"licenses":[{"expression":"CC0-1.0"}]},"components":[{"type":"library","group":"google-github-actions","name":"release-please-action","version":"3","purl":"pkg:github/google-github-actions/release-please-action@3"},{"type":"library","group":"actions","name":"checkout","version":"4","purl":"pkg:github/actions/checkout@4"},{"type":"library","group":"shimataro","name":"ssh-key-action","version":"2","purl":"pkg:github/shimataro/ssh-key-action@2"},{"type":"library","group":"docker","name":"login-action","version":"3","purl":"pkg:github/docker/login-action@3"},{"type":"library","group":"docker","name":"metadata-action","version":"5","purl":"pkg:github/docker/metadata-action@5"},{"type":"library","group":"docker","name":"build-push-action","version":"5","purl":"pkg:github/docker/build-push-action@5"},{"type":"library","group":"docker","name":"setup-buildx-action","version":"3","purl":"pkg:github/docker/setup-buildx-action@3"},{"type":"library","group":"docker","name":"setup-qemu-action","version":"3","purl":"pkg:github/docker/setup-qemu-action@3"},{"type":"library","group":"actions","name":"setup-node","version":"3","purl":"pkg:github/actions/setup-node@3"},{"type":"library","group":"actions","name":"setup-node","version":"1","purl":"pkg:github/actions/setup-node@1"},{"type":"library","name":"joi","version":"17.12.2","purl":"pkg:npm/joi@17.12.2","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","group":"@postalsys","name":"joi-messages","version":"1.0.1","purl":"pkg:npm/%40postalsys/joi-messages@1.0.1"},{"type":"library","name":"exponential-backoff","version":"3.1.1","purl":"pkg:npm/exponential-backoff@3.1.1","licenses":[{"expression":"Apache-2.0"}]},{"type":"library","group":"@postalsys","name":"email-text-tools","version":"2.1.7","purl":"pkg:npm/%40postalsys/email-text-tools@2.1.7"},{"type":"library","name":"punycode","version":"2.3.1","purl":"pkg:npm/punycode@2.3.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"humanize","version":"0.0.9","purl":"pkg:npm/humanize@0.0.9","licenses":[{"expression":"MIT"}]},{"type":"library","name":"pubface","version":"1.0.9","purl":"pkg:npm/pubface@1.0.9"},{"type":"library","group":"@hapi","name":"vision","version":"7.0.3","purl":"pkg:npm/%40hapi/vision@7.0.3","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"gettext-parser","version":"7.0.1","purl":"pkg:npm/gettext-parser@7.0.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"timezones-list","version":"3.0.3","purl":"pkg:npm/timezones-list@3.0.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"undici","version":"5.28.3","purl":"pkg:npm/undici@5.28.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"base32.js","version":"0.1.0","purl":"pkg:npm/base32.js@0.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"minimist","version":"1.2.8","purl":"pkg:npm/minimist@1.2.8","licenses":[{"expression":"MIT"}]},{"type":"library","name":"chai","version":"4.3.10","purl":"pkg:npm/chai@4.3.10","licenses":[{"expression":"MIT"}]},{"type":"library","name":"msgpack5","version":"6.0.2","purl":"pkg:npm/msgpack5@6.0.2","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@bugsnag","name":"js","version":"7.22.4","purl":"pkg:npm/%40bugsnag/js@7.22.4"},{"type":"library","group":"@hapi","name":"crumb","version":"9.0.1","purl":"pkg:npm/%40hapi/crumb@9.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"imapflow","version":"1.0.156","purl":"pkg:npm/imapflow@1.0.156"},{"type":"library","name":"license-checker","version":"25.0.1","purl":"pkg:npm/license-checker@25.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"pkg","version":"5.8.1","purl":"pkg:npm/pkg@5.8.1","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@postalsys","name":"hecks","version":"3.0.0-fork.3","purl":"pkg:npm/%40postalsys/hecks@3.0.0-fork.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"eslint-config-prettier","version":"9.1.0","purl":"pkg:npm/eslint-config-prettier@9.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"grunt-cli","version":"1.4.3","purl":"pkg:npm/grunt-cli@1.4.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"hapi-auth-bearer-token","version":"8.0.0","purl":"pkg:npm/hapi-auth-bearer-token@8.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"mailparser","version":"3.6.9","purl":"pkg:npm/mailparser@3.6.9"},{"type":"library","group":"@elastic","name":"elasticsearch","version":"8.12.2","purl":"pkg:npm/%40elastic/elasticsearch@8.12.2"},{"type":"library","name":"bullmq","version":"5.4.2","purl":"pkg:npm/bullmq@5.4.2"},{"type":"library","name":"prom-client","version":"15.1.0","purl":"pkg:npm/prom-client@15.1.0","licenses":[{"expression":"Apache-2.0"}]},{"type":"library","name":"psl","version":"1.9.0","purl":"pkg:npm/psl@1.9.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"dotenv","version":"16.4.5","purl":"pkg:npm/dotenv@16.4.5","licenses":[{"expression":"BSD-2-Clause"}]},{"type":"library","name":"ipaddr.js","version":"2.1.0","purl":"pkg:npm/ipaddr.js@2.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"bull-arena","version":"4.2.0","purl":"pkg:npm/bull-arena@4.2.0"},{"type":"library","name":"grunt-eslint","version":"24.3.0","purl":"pkg:npm/grunt-eslint@24.3.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"encoding-japanese","version":"2.0.0","purl":"pkg:npm/encoding-japanese@2.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"ical.js","version":"1.5.0","purl":"pkg:npm/ical.js@1.5.0","licenses":[{"expression":"MPL-2.0"}]},{"type":"library","name":"libqp","version":"2.1.0","purl":"pkg:npm/libqp@2.1.0"},{"type":"library","name":"mailsplit","version":"5.4.0","purl":"pkg:npm/mailsplit@5.4.0","licenses":[{"expression":"EUPL-1.1+ OR MIT OR (EUPL-1.1+ AND MIT)"}]},{"type":"library","name":"qrcode","version":"1.5.3","purl":"pkg:npm/qrcode@1.5.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"wild-config","version":"1.7.1","purl":"pkg:npm/wild-config@1.7.1","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@phc","name":"pbkdf2","version":"1.1.14","purl":"pkg:npm/%40phc/pbkdf2@1.1.14","licenses":[{"expression":"MIT"}]},{"type":"library","name":"compare-versions","version":"6.1.0","purl":"pkg:npm/compare-versions@6.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"eslint-config-nodemailer","version":"1.2.0","purl":"pkg:npm/eslint-config-nodemailer@1.2.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"grunt","version":"1.6.1","purl":"pkg:npm/grunt@1.6.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"iconv-lite","version":"0.6.3","purl":"pkg:npm/iconv-lite@0.6.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"node-gettext","version":"3.0.0","purl":"pkg:npm/node-gettext@3.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"resedit","version":"2.0.0","purl":"pkg:npm/resedit@2.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"cookie","version":"12.0.1","purl":"pkg:npm/%40hapi/cookie@12.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","group":"@postalsys","name":"certs","version":"1.0.8","purl":"pkg:npm/%40postalsys/certs@1.0.8"},{"type":"library","name":"ioredis","version":"5.3.2","purl":"pkg:npm/ioredis@5.3.2","licenses":[{"expression":"MIT"}]},{"type":"library","name":"jsxgettext","version":"0.11.0","purl":"pkg:npm/jsxgettext@0.11.0","licenses":[{"expression":"MPL-2.0"}]},{"type":"library","name":"libmime","version":"5.3.4","purl":"pkg:npm/libmime@5.3.4"},{"type":"library","name":"nodemailer","version":"6.9.11","purl":"pkg:npm/nodemailer@6.9.11","licenses":[{"expression":"MIT-0"}]},{"type":"library","name":"speakeasy","version":"2.0.0","purl":"pkg:npm/speakeasy@2.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@postalsys","name":"email-ai-tools","version":"1.8.6","purl":"pkg:npm/%40postalsys/email-ai-tools@1.8.6"},{"type":"library","name":"he","version":"1.2.0","purl":"pkg:npm/he@1.2.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"hapi-pino","version":"12.1.0","purl":"pkg:npm/hapi-pino@12.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"jquery","version":"3.7.1","purl":"pkg:npm/jquery@3.7.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"libbase64","version":"1.3.0","purl":"pkg:npm/libbase64@1.3.0"},{"type":"library","name":"marked","version":"9.1.6","purl":"pkg:npm/marked@9.1.6","licenses":[{"expression":"MIT"}]},{"type":"library","name":"pino-pretty","version":"10.3.1","purl":"pkg:npm/pino-pretty@10.3.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"socks","version":"2.8.1","purl":"pkg:npm/socks@2.8.1","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"boom","version":"10.0.1","purl":"pkg:npm/%40hapi/boom@10.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","group":"@hapi","name":"inert","version":"7.1.0","purl":"pkg:npm/%40hapi/inert@7.1.0","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"uuid","version":"9.0.1","purl":"pkg:npm/uuid@9.0.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"handlebars","version":"4.7.8","purl":"pkg:npm/handlebars@4.7.8","licenses":[{"expression":"MIT"}]},{"type":"library","name":"smtp-server","version":"3.13.3","purl":"pkg:npm/smtp-server@3.13.3"},{"type":"library","name":"startbootstrap-sb-admin-2","version":"3.3.7","purl":"pkg:npm/startbootstrap-sb-admin-2@3.3.7","licenses":[{"expression":"MIT"}]},{"type":"library","name":"xgettext-template","version":"5.0.0","purl":"pkg:npm/xgettext-template@5.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@postalsys","name":"templates","version":"1.0.8","purl":"pkg:npm/%40postalsys/templates@1.0.8"},{"type":"library","name":"ace-builds","version":"1.32.7","purl":"pkg:npm/ace-builds@1.32.7"},{"type":"library","name":"express","version":"4.18.3","purl":"pkg:npm/express@4.18.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"hapi-swagger","version":"17.2.1","purl":"pkg:npm/hapi-swagger@17.2.1"},{"type":"library","name":"html-to-text","version":"9.0.5","purl":"pkg:npm/html-to-text@9.0.5","licenses":[{"expression":"MIT"}]},{"type":"library","name":"nanoid","version":"3.3.4","purl":"pkg:npm/nanoid@3.3.4","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"hapi","version":"21.3.3","purl":"pkg:npm/%40hapi/hapi@21.3.3"},{"type":"library","name":"eslint","version":"8.57.0","purl":"pkg:npm/eslint@8.57.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"ioredfour","version":"1.3.0-ioredis-07","purl":"pkg:npm/ioredfour@1.3.0-ioredis-07","licenses":[{"expression":"MIT"}]},{"type":"library","name":"murmurhash","version":"2.0.1","purl":"pkg:npm/murmurhash@2.0.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"pino","version":"8.19.0","purl":"pkg:npm/pino@8.19.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"xml2js","version":"0.6.2","purl":"pkg:npm/xml2js@0.6.2","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"bell","version":"13.0.1","purl":"pkg:npm/%40hapi/bell@13.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"eerawlog","version":"1.5.1","purl":"pkg:npm/eerawlog@1.5.1","licenses":[{"expression":"ISC"}]}]} +{"bomFormat":"CycloneDX","specVersion":"1.4","version":1,"metadata":{"timestamp":"2024-03-14T11:13:09Z","tools":[{"vendor":"advanced-security","name":"gh-sbom","version":"0.0.9"}],"licenses":[{"expression":"CC0-1.0"}]},"components":[{"type":"library","group":"@hapi","name":"boom","version":"10.0.1","purl":"pkg:npm/%40hapi/boom@10.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","group":"@hapi","name":"crumb","version":"9.0.1","purl":"pkg:npm/%40hapi/crumb@9.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","group":"@hapi","name":"hapi","version":"21.3.3","purl":"pkg:npm/%40hapi/hapi@21.3.3"},{"type":"library","name":"humanize","version":"0.0.9","purl":"pkg:npm/humanize@0.0.9","licenses":[{"expression":"MIT"}]},{"type":"library","name":"libbase64","version":"1.3.0","purl":"pkg:npm/libbase64@1.3.0"},{"type":"library","name":"nodemailer","version":"6.9.11","purl":"pkg:npm/nodemailer@6.9.11","licenses":[{"expression":"MIT-0"}]},{"type":"library","name":"prom-client","version":"15.1.0","purl":"pkg:npm/prom-client@15.1.0","licenses":[{"expression":"Apache-2.0"}]},{"type":"library","group":"@elastic","name":"elasticsearch","version":"8.12.2","purl":"pkg:npm/%40elastic/elasticsearch@8.12.2"},{"type":"library","name":"socks","version":"2.8.1","purl":"pkg:npm/socks@2.8.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"startbootstrap-sb-admin-2","version":"3.3.7","purl":"pkg:npm/startbootstrap-sb-admin-2@3.3.7","licenses":[{"expression":"MIT"}]},{"type":"library","name":"xgettext-template","version":"5.0.0","purl":"pkg:npm/xgettext-template@5.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"resedit","version":"2.0.0","purl":"pkg:npm/resedit@2.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"gettext-parser","version":"7.0.1","purl":"pkg:npm/gettext-parser@7.0.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"hapi-swagger","version":"17.2.1","purl":"pkg:npm/hapi-swagger@17.2.1"},{"type":"library","name":"ioredfour","version":"1.3.0-ioredis-07","purl":"pkg:npm/ioredfour@1.3.0-ioredis-07","licenses":[{"expression":"MIT"}]},{"type":"library","name":"jsxgettext","version":"0.11.0","purl":"pkg:npm/jsxgettext@0.11.0","licenses":[{"expression":"MPL-2.0"}]},{"type":"library","name":"bullmq","version":"5.4.2","purl":"pkg:npm/bullmq@5.4.2"},{"type":"library","name":"psl","version":"1.9.0","purl":"pkg:npm/psl@1.9.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"joi","version":"17.12.2","purl":"pkg:npm/joi@17.12.2","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"encoding-japanese","version":"2.0.0","purl":"pkg:npm/encoding-japanese@2.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"exponential-backoff","version":"3.1.1","purl":"pkg:npm/exponential-backoff@3.1.1","licenses":[{"expression":"Apache-2.0"}]},{"type":"library","name":"grunt","version":"1.6.1","purl":"pkg:npm/grunt@1.6.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"imapflow","version":"1.0.156","purl":"pkg:npm/imapflow@1.0.156"},{"type":"library","name":"msgpack5","version":"6.0.2","purl":"pkg:npm/msgpack5@6.0.2","licenses":[{"expression":"MIT"}]},{"type":"library","name":"murmurhash","version":"2.0.1","purl":"pkg:npm/murmurhash@2.0.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"punycode","version":"2.3.1","purl":"pkg:npm/punycode@2.3.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"dotenv","version":"16.4.5","purl":"pkg:npm/dotenv@16.4.5","licenses":[{"expression":"BSD-2-Clause"}]},{"type":"library","name":"timezones-list","version":"3.0.3","purl":"pkg:npm/timezones-list@3.0.3","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"vision","version":"7.0.3","purl":"pkg:npm/%40hapi/vision@7.0.3","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"ical.js","version":"1.5.0","purl":"pkg:npm/ical.js@1.5.0","licenses":[{"expression":"MPL-2.0"}]},{"type":"library","name":"speakeasy","version":"2.0.0","purl":"pkg:npm/speakeasy@2.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"cookie","version":"12.0.1","purl":"pkg:npm/%40hapi/cookie@12.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"handlebars","version":"4.7.8","purl":"pkg:npm/handlebars@4.7.8","licenses":[{"expression":"MIT"}]},{"type":"library","name":"he","version":"1.2.0","purl":"pkg:npm/he@1.2.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"iconv-lite","version":"0.6.3","purl":"pkg:npm/iconv-lite@0.6.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"pino","version":"8.19.0","purl":"pkg:npm/pino@8.19.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"uuid","version":"9.0.1","purl":"pkg:npm/uuid@9.0.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"bull-arena","version":"4.2.0","purl":"pkg:npm/bull-arena@4.2.0"},{"type":"library","name":"ioredis","version":"5.3.2","purl":"pkg:npm/ioredis@5.3.2","licenses":[{"expression":"MIT"}]},{"type":"library","name":"license-checker","version":"25.0.1","purl":"pkg:npm/license-checker@25.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"mailparser","version":"3.6.9","purl":"pkg:npm/mailparser@3.6.9"},{"type":"library","name":"mailsplit","version":"5.4.0","purl":"pkg:npm/mailsplit@5.4.0","licenses":[{"expression":"EUPL-1.1+ OR MIT OR (EUPL-1.1+ AND MIT)"}]},{"type":"library","name":"pubface","version":"1.0.9","purl":"pkg:npm/pubface@1.0.9"},{"type":"library","name":"xml2js","version":"0.6.2","purl":"pkg:npm/xml2js@0.6.2","licenses":[{"expression":"MIT"}]},{"type":"library","name":"express","version":"4.18.3","purl":"pkg:npm/express@4.18.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"eslint","version":"8.57.0","purl":"pkg:npm/eslint@8.57.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"node-gettext","version":"3.0.0","purl":"pkg:npm/node-gettext@3.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@postalsys","name":"hecks","version":"3.0.0-fork.3","purl":"pkg:npm/%40postalsys/hecks@3.0.0-fork.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"hapi-auth-bearer-token","version":"8.0.0","purl":"pkg:npm/hapi-auth-bearer-token@8.0.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"ipaddr.js","version":"2.1.0","purl":"pkg:npm/ipaddr.js@2.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"marked","version":"9.1.6","purl":"pkg:npm/marked@9.1.6","licenses":[{"expression":"MIT"}]},{"type":"library","name":"eerawlog","version":"1.5.1","purl":"pkg:npm/eerawlog@1.5.1","licenses":[{"expression":"ISC"}]},{"type":"library","name":"ace-builds","version":"1.32.7","purl":"pkg:npm/ace-builds@1.32.7"},{"type":"library","name":"grunt-eslint","version":"24.3.0","purl":"pkg:npm/grunt-eslint@24.3.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"nanoid","version":"3.3.4","purl":"pkg:npm/nanoid@3.3.4","licenses":[{"expression":"MIT"}]},{"type":"library","name":"smtp-server","version":"3.13.3","purl":"pkg:npm/smtp-server@3.13.3"},{"type":"library","group":"@postalsys","name":"templates","version":"1.0.8","purl":"pkg:npm/%40postalsys/templates@1.0.8"},{"type":"library","name":"html-to-text","version":"9.0.5","purl":"pkg:npm/html-to-text@9.0.5","licenses":[{"expression":"MIT"}]},{"type":"library","name":"qrcode","version":"1.5.3","purl":"pkg:npm/qrcode@1.5.3","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@bugsnag","name":"js","version":"7.22.4","purl":"pkg:npm/%40bugsnag/js@7.22.4"},{"type":"library","name":"libqp","version":"2.1.0","purl":"pkg:npm/libqp@2.1.0"},{"type":"library","name":"minimist","version":"1.2.8","purl":"pkg:npm/minimist@1.2.8","licenses":[{"expression":"MIT"}]},{"type":"library","name":"pino-pretty","version":"10.3.1","purl":"pkg:npm/pino-pretty@10.3.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"pkg","version":"5.8.1","purl":"pkg:npm/pkg@5.8.1","licenses":[{"expression":"MIT"}]},{"type":"library","name":"undici","version":"5.28.3","purl":"pkg:npm/undici@5.28.3","licenses":[{"expression":"MIT"}]},{"type":"library","name":"libmime","version":"5.3.4","purl":"pkg:npm/libmime@5.3.4"},{"type":"library","group":"@postalsys","name":"email-ai-tools","version":"1.8.6","purl":"pkg:npm/%40postalsys/email-ai-tools@1.8.6"},{"type":"library","name":"compare-versions","version":"6.1.0","purl":"pkg:npm/compare-versions@6.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"hapi-pino","version":"12.1.0","purl":"pkg:npm/hapi-pino@12.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"wild-config","version":"1.7.1","purl":"pkg:npm/wild-config@1.7.1","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"inert","version":"7.1.0","purl":"pkg:npm/%40hapi/inert@7.1.0","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","name":"grunt-cli","version":"1.4.3","purl":"pkg:npm/grunt-cli@1.4.3","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@phc","name":"pbkdf2","version":"1.1.14","purl":"pkg:npm/%40phc/pbkdf2@1.1.14","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@postalsys","name":"certs","version":"1.0.8","purl":"pkg:npm/%40postalsys/certs@1.0.8"},{"type":"library","name":"chai","version":"4.3.10","purl":"pkg:npm/chai@4.3.10","licenses":[{"expression":"MIT"}]},{"type":"library","name":"jquery","version":"3.7.1","purl":"pkg:npm/jquery@3.7.1","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@hapi","name":"bell","version":"13.0.1","purl":"pkg:npm/%40hapi/bell@13.0.1","licenses":[{"expression":"BSD-3-Clause"}]},{"type":"library","group":"@postalsys","name":"joi-messages","version":"1.0.1","purl":"pkg:npm/%40postalsys/joi-messages@1.0.1"},{"type":"library","name":"base32.js","version":"0.1.0","purl":"pkg:npm/base32.js@0.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"eslint-config-nodemailer","version":"1.2.0","purl":"pkg:npm/eslint-config-nodemailer@1.2.0","licenses":[{"expression":"MIT"}]},{"type":"library","name":"eslint-config-prettier","version":"9.1.0","purl":"pkg:npm/eslint-config-prettier@9.1.0","licenses":[{"expression":"MIT"}]},{"type":"library","group":"@postalsys","name":"email-text-tools","version":"2.1.7","purl":"pkg:npm/%40postalsys/email-text-tools@2.1.7"},{"type":"library","group":"actions","name":"checkout","version":"4","purl":"pkg:github/actions/checkout@4"},{"type":"library","group":"docker","name":"metadata-action","version":"5","purl":"pkg:github/docker/metadata-action@5"},{"type":"library","group":"google-github-actions","name":"release-please-action","version":"3","purl":"pkg:github/google-github-actions/release-please-action@3"},{"type":"library","group":"actions","name":"setup-node","version":"3","purl":"pkg:github/actions/setup-node@3"},{"type":"library","group":"actions","name":"setup-node","version":"1","purl":"pkg:github/actions/setup-node@1"},{"type":"library","group":"shimataro","name":"ssh-key-action","version":"2","purl":"pkg:github/shimataro/ssh-key-action@2"},{"type":"library","group":"docker","name":"build-push-action","version":"5","purl":"pkg:github/docker/build-push-action@5"},{"type":"library","group":"docker","name":"login-action","version":"3","purl":"pkg:github/docker/login-action@3"},{"type":"library","group":"docker","name":"setup-buildx-action","version":"3","purl":"pkg:github/docker/setup-buildx-action@3"},{"type":"library","group":"docker","name":"setup-qemu-action","version":"3","purl":"pkg:github/docker/setup-qemu-action@3"}]} diff --git a/static/licenses.html b/static/licenses.html index 8665a1263..5bd4c11f8 100644 --- a/static/licenses.html +++ b/static/licenses.html @@ -1,6 +1,6 @@ EmailEngine Licenses
-

EmailEngine v2.40.2

EmailEngine includes code from the following software packages:

+

EmailEngine v2.40.3

EmailEngine includes code from the following software packages:

@@ -426,7 +426,7 @@

EmailEngine v2.40.2

EmailEngine includes code from the following soft

- + @@ -3585,7 +3585,7 @@

EmailEngine v2.40.2

EmailEngine includes code from the following soft

- + @@ -5424,6 +5424,16 @@

EmailEngine v2.40.2

EmailEngine includes code from the following soft

+ + + + + + + @@ -6585,7 +6595,7 @@

EmailEngine v2.40.2

EmailEngine includes code from the following soft

- + @@ -7005,7 +7015,7 @@

EmailEngine v2.40.2

EmailEngine includes code from the following soft

- + diff --git a/translations/messages.pot b/translations/messages.pot index 04ef4b714..157980113 100644 --- a/translations/messages.pot +++ b/translations/messages.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Content-Type: text/plain; charset=ascii\n" -"POT-Creation-Date: 2024-03-08 09:05+0000\n" +"POT-Creation-Date: 2024-03-14 11:13+0000\n" #: views/config/license.hbs:48 msgid "%d day" @@ -9,10 +9,6 @@ msgid_plural "%d days" msgstr[0] "" msgstr[1] "" -#: views/redirect.hbs:1 -msgid "Click here to continue…" -msgstr "" - #: views/unsubscribe.hbs:1 #: views/unsubscribe.hbs:79 msgid "Unsubscribe" @@ -57,6 +53,10 @@ msgstr "" msgid "Enter your email address" msgstr "" +#: views/redirect.hbs:1 +msgid "Click here to continue…" +msgstr "" + #: views/accounts/register/imap.hbs:11 msgid "Your name" msgstr "" @@ -80,14 +80,6 @@ msgstr "" msgid "Continue" msgstr "" -#: views/accounts/register/index.hbs:2 -msgid "Choose your email account provider" -msgstr "" - -#: views/accounts/register/index.hbs:15 -msgid "Standard IMAP" -msgstr "" - #: views/accounts/register/imap-server.hbs:18 msgid "IMAP" msgstr "" @@ -189,6 +181,14 @@ msgstr "" msgid "HTTP error!" msgstr "" +#: views/accounts/register/index.hbs:2 +msgid "Choose your email account provider" +msgstr "" + +#: views/accounts/register/index.hbs:15 +msgid "Standard IMAP" +msgstr "" + #: lib/routes-ui.js:580 msgid "Invalid API key for OpenAI" msgstr ""
PackageVersionLicensePublisherPublisher's EmailPackage URL
@hapi/hapi21.3.321.3.6 BSD-3-Clause
hasown2.0.12.0.2 MIT Jordan Harband ljharb@gmail.com
nodemailer6.9.12MIT-0Andris Reinman +github.com/nodemailer/nodemailer +
nopt 3.0.6 ISC
set-function-length1.2.11.2.2 MIT Jordan Harband ljharb@gmail.com
swagger-ui-dist5.11.105.12.0 Apache-2.0