diff --git a/.ncurc.js b/.ncurc.js index 9669a131..ea5dba0d 100644 --- a/.ncurc.js +++ b/.ncurc.js @@ -2,6 +2,12 @@ module.exports = { upgrade: true, reject: [ // mongodb 5.x driver does not support callbacks, only promises - 'mongodb' + 'mongodb', + + // no support for Node 16 + 'undici', + + // esm + 'chai' ] }; diff --git a/CHANGELOG.md b/CHANGELOG.md index e2d17aa8..b50af82d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,47 @@ # Changelog +## [1.41.3](https://github.com/nodemailer/wildduck/compare/v1.41.2...v1.41.3) (2023-12-19) + + +### Bug Fixes + +* **api:** Remove unnecessary required() that brakes the e-mail send ([#580](https://github.com/nodemailer/wildduck/issues/580)) ([d80ba77](https://github.com/nodemailer/wildduck/commit/d80ba77650f539a47e5a7c28cfd9c9d0de48b3e4)) + +## [1.41.2](https://github.com/nodemailer/wildduck/compare/v1.41.1...v1.41.2) (2023-12-15) + + +### Bug Fixes + +* **upload:** allow empty name field in the Upload message FROM: header ZMS-113 ([#577](https://github.com/nodemailer/wildduck/issues/577)) ([c1e28db](https://github.com/nodemailer/wildduck/commit/c1e28db0f3d37b507e7aaef6b26557b27f7ab2f3)) + +## [1.41.1](https://github.com/nodemailer/wildduck/compare/v1.41.0...v1.41.1) (2023-12-14) + + +### Bug Fixes + +* **defer:** Added new setting const:sender:defer_times ZMS 63 ([#574](https://github.com/nodemailer/wildduck/issues/574)) ([9aab242](https://github.com/nodemailer/wildduck/commit/9aab24267b8c90d7d1af30fcace8c60704e1ea27)) +* **mime-parsing:** ensure that text content for multipart nodes always ends with a newline. Fixes [#571](https://github.com/nodemailer/wildduck/issues/571) ([6f4994d](https://github.com/nodemailer/wildduck/commit/6f4994d3a00c8ec73921b443aee4c2cc65561922)) + +## [1.41.0](https://github.com/nodemailer/wildduck/compare/v1.40.10...v1.41.0) (2023-11-30) + + +### Features + +* **apidocs:** Autogenerate OpenAPI docs ZMS-100 ([#552](https://github.com/nodemailer/wildduck/issues/552)) ([ea24b93](https://github.com/nodemailer/wildduck/commit/ea24b9328b6984db841de86309f1712f100acb97)) +* **docs:** ZMS-[9x] Automatic API generation ([#535](https://github.com/nodemailer/wildduck/issues/535)) ([c1cc143](https://github.com/nodemailer/wildduck/commit/c1cc143663bc8ad81794eb9bf4cee04a37937899)) +* **mailbox-count-limit:** Set a limit for maximum number of mailbox folders ZMS-93 ([#542](https://github.com/nodemailer/wildduck/issues/542)) ([779bb11](https://github.com/nodemailer/wildduck/commit/779bb11e831eb902330db3ed9056f90aeba4234c)) + + +### Bug Fixes + +* **addressregister:** Do not add no-reply addresses to the addressregister ZMS-99 ([#551](https://github.com/nodemailer/wildduck/issues/551)) ([be24af0](https://github.com/nodemailer/wildduck/commit/be24af0d2665fb27f85ff0f0435e4480c21575fa)) +* **audit:** Fixed `find()` query for expired audits ([#547](https://github.com/nodemailer/wildduck/issues/547)) ([48b9efb](https://github.com/nodemailer/wildduck/commit/48b9efb8ca4b300597b2e8f5ef4aa307ac97dcfe)) +* **docs:** Added support for enums ZMS-104 ([#565](https://github.com/nodemailer/wildduck/issues/565)) ([28bdc76](https://github.com/nodemailer/wildduck/commit/28bdc7621e13a96965a2a24caee873cf15b8aa31)) +* **docs:** Fixed descriptions ZMS-101 ([#553](https://github.com/nodemailer/wildduck/issues/553)) ([3c9e175](https://github.com/nodemailer/wildduck/commit/3c9e17595cffd32475f51aa104ab09d721989e6f)) +* **imap-search:** rename `headerdate` to `date` (closes [#560](https://github.com/nodemailer/wildduck/issues/560)) ([#561](https://github.com/nodemailer/wildduck/issues/561)) ([fd98244](https://github.com/nodemailer/wildduck/commit/fd98244342089dc8a587e3e45b559f12f8764140)) +* **imap:** fixed string conversion to utf8 vs binary (closes [#563](https://github.com/nodemailer/wildduck/issues/563)) ([#564](https://github.com/nodemailer/wildduck/issues/564)) ([ee2708e](https://github.com/nodemailer/wildduck/commit/ee2708e4c150f79745a2a81e3e4555a7549c426d)) +* **mailbox-create:** Use correct database for loading User data when creating mailboxes ([#550](https://github.com/nodemailer/wildduck/issues/550)) ([4434cb5](https://github.com/nodemailer/wildduck/commit/4434cb5e1ff4414da874b62997da5ea41892a286)) + ## [1.40.10](https://github.com/nodemailer/wildduck/compare/v1.40.9...v1.40.10) (2023-10-16) diff --git a/Gruntfile.js b/Gruntfile.js index 98616bad..d1e0c351 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -58,4 +58,5 @@ module.exports = function (grunt) { // Tasks grunt.registerTask('default', ['eslint', 'shell:server', 'wait:server', 'mochaTest', 'shell:server:kill']); grunt.registerTask('testonly', ['shell:server', 'wait:server', 'mochaTest', 'shell:server:kill']); + grunt.registerTask('proto', ['mochaTest:imap']); }; diff --git a/docs/api/openapi.yml b/docs/api/openapi.yml index 11cf6240..c05a493e 100644 --- a/docs/api/openapi.yml +++ b/docs/api/openapi.yml @@ -1305,7 +1305,9 @@ paths: content: application/octet-stream: schema: - type: binary + type: string + description: Success + format: binary /data/import: post: @@ -1319,7 +1321,9 @@ paths: content: application/octet-stream: schema: - type: binary + type: string + description: Success + format: binary required: true responses: '200': @@ -1941,6 +1945,11 @@ paths: description: ID of the Mailbox schema: type: string + - name: id + in: query + description: Message ID values, only applies when used in combination with `mailbox`. Either comma separated numbers (1,2,3) or colon separated range (3:15), or a range from UID to end (3:*) + schema: + type: string - name: thread in: query description: Thread ID @@ -2087,6 +2096,9 @@ paths: mailbox: description: ID of the Mailbox type: string + id: + description: Message ID values, only applies when used in combination with `mailbox`. Either comma separated numbers (1,2,3) or colon separated range (3:15), or a range from UID to end (3:*) + type: string thread: description: Thread ID type: string @@ -2105,7 +2117,6 @@ paths: description: 'Partial match for the From: header line' type: string to: - in: query description: 'Partial match for the To: and Cc: header lines' type: string subject: diff --git a/imap-core/lib/imap-composer.js b/imap-core/lib/imap-composer.js index 939b024c..06dd1794 100644 --- a/imap-core/lib/imap-composer.js +++ b/imap-core/lib/imap-composer.js @@ -60,7 +60,17 @@ class IMAPComposer extends Transform { ); } - this.push(Buffer.from(compiled + '\r\n', 'binary')); + // + // = 0; i--) { + if (typeof node.body[i] === 'string' && node.body[i].length) { + lastChar = node.body[i].at(-1); + lastIndex = i; + break; + } + } + if (lastChar && lastChar !== '\n') { + // ensure that non-multipart body text always ends with a newline + node.body[lastIndex] += '\n'; + } + } + node.lineCount = node.body.length ? node.body.length - 1 : 0; node.body = Buffer.from( node.body diff --git a/imap-core/test/fixtures/no_empty_line_between_text_boundary.eml b/imap-core/test/fixtures/no_empty_line_between_text_boundary.eml new file mode 100644 index 00000000..cd18c673 --- /dev/null +++ b/imap-core/test/fixtures/no_empty_line_between_text_boundary.eml @@ -0,0 +1,22 @@ +Content-Type: multipart/mixed; boundary="------------cWFvDSey27tFG0hVYLqp9hs9" +MIME-Version: 1.0 +Message-ID: +To: foo-1@example-1.com +From: foo-1@example-1.com +Subject: test + +This is a multi-part message in MIME format. +--------------cWFvDSey27tFG0hVYLqp9hs9 +Content-Type: text/plain; charset=UTF-8; format=flowed +Content-Transfer-Encoding: 7bit + +test + +--------------cWFvDSey27tFG0hVYLqp9hs9 +Content-Type: text/plain; charset=UTF-8; name="example.txt" +Content-Disposition: attachment; filename="example.txt" +Content-Transfer-Encoding: base64 + +ZXhhbXBsZQo= + +--------------cWFvDSey27tFG0hVYLqp9hs9-- \ No newline at end of file diff --git a/imap-core/test/parse-mime-tree-test.js b/imap-core/test/parse-mime-tree-test.js index f4821a28..6d541bad 100644 --- a/imap-core/test/parse-mime-tree-test.js +++ b/imap-core/test/parse-mime-tree-test.js @@ -3,11 +3,20 @@ 'use strict'; const MIMEParser = require('../lib/indexer/parse-mime-tree').MIMEParser; +const Indexer = require('../lib/indexer/indexer'); +const indexer = new Indexer(); +const fs = require('fs'); const chai = require('chai'); const expect = chai.expect; chai.config.includeStack = true; +const fixtures = { + no_empty_line_between_text_boundary: { + eml: fs.readFileSync(__dirname + '/fixtures/no_empty_line_between_text_boundary.eml') + } +}; + describe('#parseValueParams', function () { it('should return continuation value as mime-word', function () { let parser = new MIMEParser(); @@ -44,4 +53,23 @@ describe('#parseValueParams', function () { hasParams: true }); }); + + it('should parse a file with no empty line between text and boundary', function (done) { + // parse a file and then make sure that boundary is correct + + let source = Buffer.concat([fixtures.no_empty_line_between_text_boundary.eml]); + + let parser = new MIMEParser(source); + + parser.parse(); + parser.finalizeTree(); + + let parsed = parser.tree.childNodes[0]; + + indexer.bodyQuery(parsed, '', (err, data) => { + expect(err).to.not.exist; + expect(data.toString().indexOf('This is a multi-part message in MIME format.\r\n--------------cWFvDSey27tFG0hVYLqp9hs9')).to.gt(0); + done(); + }); + }); }); diff --git a/lib/api/auth.js b/lib/api/auth.js index 6e8c0f0d..08571960 100644 --- a/lib/api/auth.js +++ b/lib/api/auth.js @@ -6,22 +6,53 @@ const ObjectId = require('mongodb').ObjectId; const tools = require('../tools'); const roles = require('../roles'); const { nextPageCursorSchema, previousPageCursorSchema, pageNrSchema, sessSchema, sessIPSchema, booleanSchema, usernameSchema } = require('../schemas'); +const { successRes } = require('../schemas/response/general-schemas'); +const { userId } = require('../schemas/request/general-schemas'); module.exports = (db, server, userHandler) => { server.post( - '/preauth', + { + path: '/preauth', + summary: 'Pre-auth check', + description: 'Check if an username exists and can be used for authentication', + tags: ['Authentication'], + validationObjs: { + requestBody: { + username: Joi.alternatives() + .try(usernameSchema, Joi.string().email({ tlds: false })) + .required() + .description('Username or E-mail address'), + + scope: Joi.string().default('master').description('Required scope. One of master, imap, smtp, pop3'), + + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: {}, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + id: userId, + username: Joi.string().required().description('Username of authenticated User'), + scope: Joi.string().required().description('The scope this authentication is valid for'), + require2fa: Joi.array().items(Joi.string()).required().description('List of enabled 2FA mechanisms') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - username: Joi.alternatives() - .try(usernameSchema, Joi.string().email({ tlds: false })) - .required(), + const { requestBody, pathParams, queryParams } = req.route.spec.validationObjs; - scope: Joi.string().default('master'), - - sess: sessSchema, - ip: sessIPSchema + const schema = Joi.object({ + ...requestBody, + ...pathParams, + ...queryParams }); const result = schema.validate(req.params, { @@ -88,28 +119,65 @@ module.exports = (db, server, userHandler) => { ); server.post( - '/authenticate', + { + path: '/authenticate', + summary: 'Authenticate a User', + tags: ['Authentication'], + validationObjs: { + requestBody: { + username: Joi.alternatives() + .try(usernameSchema, Joi.string().email({ tlds: false })) + .required() + .description('Username or E-mail address'), + password: Joi.string().max(256).required().description('Password'), + + protocol: Joi.string().default('API').description('Application identifier for security logs'), + scope: Joi.string() + .default('master') + // token can be true only if scope is master + .when('token', { is: true, then: Joi.valid('master') }) + .description('Required scope. One of master, imap, smtp, pop3'), + + appId: Joi.string().empty('').uri().description('Optional appId which is the URL of the app'), + + token: booleanSchema + .default(false) + .description( + 'If true then generates a temporary access token that is valid for this user. Only available if scope is "master". When using user tokens then you can replace user ID in URLs with "me".' + ), + + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: {}, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + id: userId, + username: Joi.string().required().description('Username of authenticated User'), + scope: Joi.string().required().description('The scope this authentication is valid for'), + require2fa: Joi.array().items(Joi.string()).required().description('List of enabled 2FA mechanisms'), + requirePasswordChange: booleanSchema.required().description('Indicates if account hassword has been reset and should be replaced'), + token: Joi.string().description( + 'If access token was requested then this is the value to use as access token when making API requests on behalf of logged in user.' + ) + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - username: Joi.alternatives() - .try(usernameSchema, Joi.string().email({ tlds: false })) - .required(), - password: Joi.string().max(256).required(), - - protocol: Joi.string().default('API'), - scope: Joi.string() - .default('master') - // token can be true only if scope is master - .when('token', { is: true, then: Joi.valid('master') }), - - appId: Joi.string().empty('').uri(), + const { requestBody, pathParams, queryParams } = req.route.spec.validationObjs; - token: booleanSchema.default(false), - - sess: sessSchema, - ip: sessIPSchema + const schema = Joi.object({ + ...requestBody, + ...pathParams, + ...queryParams }); const result = schema.validate(req.params, { @@ -203,7 +271,23 @@ module.exports = (db, server, userHandler) => { ); server.del( - '/authenticate', + { + path: '/authenticate', + summary: 'Invalidate authentication token', + description: 'This method invalidates currently used authentication token. If token is not provided then nothing happens', + tags: ['Authentication'], + validationObjs: { + requestBody: {}, + pathParams: {}, + queryParams: {}, + response: { + 200: { + description: 'Success', + model: Joi.object({ success: successRes }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); @@ -223,21 +307,71 @@ module.exports = (db, server, userHandler) => { ); server.get( - { name: 'authlog', path: '/users/:user/authlog' }, + { + name: 'authlog', + path: '/users/:user/authlog', + summary: 'List authentication Events', + tags: ['Authentication'], + validationObjs: { + requestBody: {}, + pathParams: { user: userId }, + queryParams: { + action: Joi.string().trim().lowercase().empty('').max(100).description('Limit listing only to values with specific action value'), + limit: Joi.number().default(20).min(1).max(250).description('How many records to return'), + next: nextPageCursorSchema, + previous: previousPageCursorSchema, + page: pageNrSchema, + filterip: sessIPSchema.description('Limit listing only to values with specific IP address'), + + sess: sessSchema, + ip: sessIPSchema + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + action: Joi.string().required().description('Limit listing only to values with specific action value'), + total: Joi.number().required().description('How many results were found'), + page: Joi.number().required().description('Current page number. Derived from page query argument'), + previousCursor: previousPageCursorSchema, + nextCursor: nextPageCursorSchema, + results: Joi.array() + .items( + Joi.object({ + id: Joi.string().required().description('ID of the event'), + action: Joi.string().required().description('Action identifier'), + result: Joi.string().required().description('Did the action succeed'), + sess: sessSchema, + ip: sessIPSchema, + created: Joi.date().required().description('Datestring of the Event time'), + protocol: Joi.string().description('Protocol that the authentication was made from'), + requiredScope: Joi.string().description('Scope of the auth'), + last: Joi.date().required().description('Date of the last update of data'), + events: Joi.number().required().description('Number of times same auth log has accured'), + source: Joi.string().description('Source of auth. Example: `master` if password auth was used'), + expires: Joi.date() + .required() + .description( + 'After this date the given auth log document will not be updated and instead a new one will be created' + ) + }).$_setFlag('objectName', 'GetAuthlogResult') + ) + .required() + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - action: Joi.string().trim().lowercase().empty('').max(100), - limit: Joi.number().default(20).min(1).max(250), - next: nextPageCursorSchema, - previous: previousPageCursorSchema, - page: pageNrSchema, - filterip: sessIPSchema, - - sess: sessSchema, - ip: sessIPSchema + const { requestBody, pathParams, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...requestBody, + ...pathParams, + ...queryParams }); const result = schema.validate(req.params, { @@ -359,15 +493,52 @@ module.exports = (db, server, userHandler) => { ); server.get( - '/users/:user/authlog/:event', + { + path: '/users/:user/authlog/:event', + summary: 'Request Event information', + tags: ['Authentication'], + validationObjs: { + requestBody: {}, + queryParams: { + sess: sessSchema, + ip: sessIPSchema + }, + pathParams: { + user: userId, + event: Joi.string().hex().lowercase().length(24).required().description('ID of the Event') + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + id: Joi.string().required().description('ID of the event'), + action: Joi.string().required().description('Action identifier'), + result: Joi.string().required().description('Did the action succeed'), + sess: sessSchema, + ip: sessIPSchema, + created: Joi.date().required().description('Datestring of the Event time'), + protocol: Joi.string().description('Protocol that the authentication was made from'), + requiredScope: Joi.string().description('Scope of the auth'), + last: Joi.date().required().description('Date of the last update of Event'), + events: Joi.number().required().description('Number of times same auth Event has accured'), + source: Joi.string().description('Source of auth. Example: `master` if password auth was used'), + expires: Joi.date() + .required() + .description('After this date the given auth Event will not be updated and instead a new one will be created') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - event: Joi.string().hex().lowercase().length(24).required(), - sess: sessSchema, - ip: sessIPSchema + const { requestBody, pathParams, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...requestBody, + ...pathParams, + ...queryParams }); const result = schema.validate(req.params, { diff --git a/lib/api/messages.js b/lib/api/messages.js index c56e2745..69dc3be1 100644 --- a/lib/api/messages.js +++ b/lib/api/messages.js @@ -20,12 +20,20 @@ const roles = require('../roles'); const { nextPageCursorSchema, previousPageCursorSchema, pageNrSchema, sessSchema, sessIPSchema, booleanSchema, metaDataSchema } = require('../schemas'); const { preprocessAttachments } = require('../data-url'); const TaskHandler = require('../task-handler'); -const prepareSearchFilter = require('../prepare-search-filter'); +const { prepareSearchFilter, uidRangeStringToQuery } = require('../prepare-search-filter'); const { getMongoDBQuery /*, getElasticSearchQuery*/ } = require('../search-query'); //const { getClient } = require('../elasticsearch'); const BimiHandler = require('../bimi-handler'); -const { Address, AddressOptionalNameArray, Header, Attachment, ReferenceWithAttachments, Bimi } = require('../schemas/request/messages-schemas'); +const { + Address, + AddressOptionalNameArray, + Header, + Attachment, + ReferenceWithAttachments, + Bimi, + AddressOptionalName +} = require('../schemas/request/messages-schemas'); const { userId, mailboxId, messageId } = require('../schemas/request/general-schemas'); const { MsgEnvelope } = require('../schemas/response/messages-schemas'); const { successRes } = require('../schemas/response/general-schemas'); @@ -218,41 +226,9 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti let moveTo = result.value.moveTo ? new ObjectId(result.value.moveTo) : false; let message = result.value.message; - let messageQuery; + let messageQuery = uidRangeStringToQuery(message); - if (/^\d+$/.test(message)) { - messageQuery = Number(message); - } else if (/^\d+(,\d+)*$/.test(message)) { - messageQuery = { - $in: message - .split(',') - .map(uid => Number(uid)) - .sort((a, b) => a - b) - }; - } else if (/^\d+:(\d+|\*)$/.test(message)) { - let parts = message - .split(':') - .map(uid => Number(uid)) - .sort((a, b) => { - if (a === '*') { - return 1; - } - if (b === '*') { - return -1; - } - return a - b; - }); - if (parts[0] === parts[1]) { - messageQuery = parts[0]; - } else { - messageQuery = { - $gte: parts[0] - }; - if (!isNaN(parts[1])) { - messageQuery.$lte = parts[1]; - } - } - } else { + if (!messageQuery) { res.status(404); return res.json({ error: 'Invalid message identifier', @@ -618,6 +594,13 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti q: Joi.string().trim().empty('').max(1024).optional().description('Additional query string'), mailbox: Joi.string().hex().length(24).empty('').description('ID of the Mailbox'), + id: Joi.string() + .trim() + .empty('') + .regex(/^\d+(,\d+)*$|^\d+:(\d+|\*)$/i) + .description( + 'Message ID values, only applies when used in combination with `mailbox`. Either comma separated numbers (1,2,3) or colon separated range (3:15), or a range from UID to end (3:*)' + ), thread: Joi.string().hex().length(24).empty('').description('Thread ID'), or: Joi.object({ @@ -1895,11 +1878,18 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti 'base64 encoded message source. Alternatively, you can provide this value as POST body by using message/rfc822 MIME type. If raw message is provided then it overrides any other mail configuration' ), - from: Address.description('Addres for the From: header'), + from: AddressOptionalName.description('Addres for the From: header'), - replyTo: Address.description('Address for the Reply-To: header'), + replyTo: AddressOptionalName.description('Address for the Reply-To: header'), - to: AddressOptionalNameArray.description('Addresses for the To: header'), + to: Joi.array() + .items( + Joi.object({ + name: Joi.string().empty('').max(255).description('Name of the sender'), + address: Joi.string().email({ tlds: false }).failover('').required().description('Address of the sender') + }).$_setFlag('objectName', 'AddressOptionalName') + ) + .description('Addresses for the To: header'), cc: AddressOptionalNameArray.description('Addresses for the Cc: header'), @@ -2138,7 +2128,7 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti let data = { from: result.value.from || { name: userData.name, address: userData.address }, date, - to: result.value.to, + to: result.value.to ? result.value.to.filter(toObj => toObj.address !== '') : undefined, cc: result.value.cc, bcc: result.value.bcc, subject: result.value.subject || referencedMessage.subject, @@ -2181,7 +2171,7 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti envelope.from = data.from.address = await validateFromAddress(userData, envelopeFrom); } - if (!result.value.to && !envelope.to.length && referencedMessage && ['reply', 'replyAll'].includes(result.value.reference.action)) { + if (!data.to && !envelope.to.length && referencedMessage && ['reply', 'replyAll'].includes(result.value.reference.action)) { envelope.to = envelope.to.concat(parseAddresses(referencedMessage.replyTo || [])).concat(parseAddresses(referencedMessage.replyCc || [])); data.to = [].concat(referencedMessage.replyTo || []); data.cc = [].concat(referencedMessage.replyCc || []); diff --git a/lib/api/users.js b/lib/api/users.js index 10bf48ff..5eb121eb 100644 --- a/lib/api/users.js +++ b/lib/api/users.js @@ -26,6 +26,9 @@ const { const TaskHandler = require('../task-handler'); const { publish, FORWARD_ADDED } = require('../events'); const { ExportStream, ImportStream } = require('../export'); +const { successRes, totalRes, pageRes, previousCursorRes, nextCursorRes, quotaRes } = require('../schemas/response/general-schemas'); +const { GetUsersResult } = require('../schemas/response/users-schemas'); +const { userId } = require('../schemas/request/general-schemas'); const FEATURE_FLAGS = ['indexing']; @@ -33,23 +36,57 @@ module.exports = (db, server, userHandler, settingsHandler) => { const taskHandler = new TaskHandler({ database: db.database }); server.get( - { name: 'users', path: '/users' }, + { + name: 'users', + path: '/users', + summary: 'List registered Users', + tags: ['Users'], + validationObjs: { + pathParams: {}, + requestBody: {}, + queryParams: { + query: Joi.string().empty('').lowercase().max(255).description('Partial match of username or default email address'), + forward: Joi.string().empty('').lowercase().max(255).description('Partial match of a forward email address or URL'), + tags: Joi.string().trim().empty('').max(1024).description('Comma separated list of tags. The User must have at least one to be set'), + requiredTags: Joi.string() + .trim() + .empty('') + .max(1024) + .description('Comma separated list of tags. The User must have all listed tags to be set'), + metaData: booleanSchema.description('If true, then includes metaData in the response'), + internalData: booleanSchema.description('If true, then includes internalData in the response. Not shown for user-role tokens.'), + limit: Joi.number().default(20).min(1).max(250).description('How many records to return'), + next: nextPageCursorSchema, + previous: previousPageCursorSchema, + page: pageNrSchema, + sess: sessSchema, + ip: sessIPSchema + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + total: totalRes, + page: pageRes, + previousCursor: previousCursorRes, + nextCursor: nextCursorRes, + query: Joi.string().required().description('Partial match of username or default email address'), + results: Joi.array().items(GetUsersResult).required().description('User listing') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - query: Joi.string().empty('').lowercase().max(255), - forward: Joi.string().empty('').lowercase().max(255), - tags: Joi.string().trim().empty('').max(1024), - requiredTags: Joi.string().trim().empty('').max(1024), - metaData: booleanSchema, - internalData: booleanSchema, - limit: Joi.number().default(20).min(1).max(250), - next: nextPageCursorSchema, - previous: previousPageCursorSchema, - page: pageNrSchema, - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -262,91 +299,166 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.post( - '/users', + { + path: '/users', + summary: 'Create new user', + tags: ['Users'], + validationObjs: { + requestBody: { + username: usernameSchema + .required() + .description('Username of the User. Dots are allowed but informational only ("user.name" is the same as "username").'), + password: Joi.string() + .max(256) + .allow(false, '') + .required() + .description( + 'Password for the account. Set to boolean false to disable password usage for the master scope, Application Specific Passwords would still be allowed' + ), + hashedPassword: booleanSchema + .default(false) + .description( + 'If true then password is already hashed, so store as is. Supported hashes: pbkdf2, bcrypt ($2a, $2y, $2b), md5 ($1), sha512 ($6), sha256 ($5), argon2 ($argon2d, $argon2i, $argon2id). Stored hashes are rehashed to pbkdf2 on first successful password check.' + ), + allowUnsafe: booleanSchema + .default(true) + .description( + 'If false then validates provided passwords against Have I Been Pwned API. Experimental, so validation is disabled by default but will be enabled automatically in some future version of WildDuck.' + ), + + address: Joi.string().email({ tlds: false }).description('Default email address for the User (autogenerated if not set)'), + emptyAddress: booleanSchema + .default(false) + .description( + 'If true then do not autogenerate missing email address for the User. Only needed if you want to create a user account that does not have any email address associated' + ), + + language: Joi.string().empty('').max(20).description('Language code for the User'), + + retention: Joi.number().min(0).default(0).description('Default retention time (in ms). Set to 0 to disable'), + + name: Joi.string().max(256).description('Name of the User'), + targets: Joi.array() + .items( + Joi.string().email({ tlds: false }), + Joi.string().uri({ + scheme: [/smtps?/, /https?/], + allowRelative: false, + relativeOnly: false + }) + ) + .description( + 'An array of forwarding targets. The value could either be an email address or a relay url to next MX server ("smtp://mx2.zone.eu:25") or an URL where mail contents are POSTed to' + ), + + spamLevel: Joi.number() + .min(0) + .max(100) + .default(50) + .description('Relative scale for detecting spam. 0 means that everything is spam, 100 means that nothing is spam'), + + quota: Joi.number().min(0).default(0).description('Allowed quota of the user in bytes'), + recipients: Joi.number().min(0).default(0).description('How many messages per 24 hour can be sent'), + forwards: Joi.number().min(0).default(0).description('How many messages per 24 hour can be forwarded'), + + filters: Joi.number().min(0).default(0).description('How many filters are allowed for this account'), + + requirePasswordChange: booleanSchema + .default(false) + .description('If true then requires the user to change password, useful if password for the account was autogenerated'), + + imapMaxUpload: Joi.number().min(0).default(0).description('How many bytes can be uploaded via IMAP during 24 hour'), + imapMaxDownload: Joi.number().min(0).default(0).description('How many bytes can be downloaded via IMAP during 24 hour'), + pop3MaxDownload: Joi.number().min(0).default(0).description('How many bytes can be downloaded via POP3 during 24 hour'), + pop3MaxMessages: Joi.number().min(0).default(0).description('How many latest messages to list in POP3 session'), + imapMaxConnections: Joi.number().min(0).default(0).description('How many parallel IMAP connections are alowed'), + receivedMax: Joi.number().min(0).default(0).description('How many messages can be received from MX during 60 seconds'), + + fromWhitelist: Joi.array() + .items(Joi.string().trim().max(128)) + .description('A list of additional email addresses this user can send mail from. Wildcard is allowed.'), + + tags: Joi.array().items(Joi.string().trim().max(128)).description('A list of tags associated with this user'), + addTagsToAddress: booleanSchema.default(false).description('If true then autogenerated address gets the same tags as the user'), + + uploadSentMessages: booleanSchema + .default(false) + .description( + 'If true then all messages sent through MSA are also uploaded to the Sent Mail folder. Might cause duplicates with some email clients, so disabled by default.' + ), + + mailboxes: Joi.object() + .keys({ + sent: Joi.string() + .empty('') + .regex(/\/{2,}|\/$/, { invert: true }), + trash: Joi.string() + .empty('') + .regex(/\/{2,}|\/$/, { invert: true }), + junk: Joi.string() + .empty('') + .regex(/\/{2,}|\/$/, { invert: true }), + drafts: Joi.string() + .empty('') + .regex(/\/{2,}|\/$/, { invert: true }) + }) + .description('Optional names for special mailboxes') + .$_setFlag('objectName', 'Mailboxes'), + + disabledScopes: Joi.array() + .items( + Joi.string() + .valid(...consts.SCOPES) + .$_setFlag('objectName', 'DisabledScopes') + ) + .unique() + .default([]) + .description('List of scopes that are disabled for this user ("imap", "pop3", "smtp")'), + + metaData: metaDataSchema.label('metaData').description('Optional metadata, must be an object or JSON formatted string'), + internalData: metaDataSchema + .label('internalData') + .description( + 'Optional metadata for internal use, must be an object or JSON formatted string of an object. Not available for user-role tokens' + ), + + pubKey: Joi.string() + .empty('') + .trim() + .regex(/^-----BEGIN PGP PUBLIC KEY BLOCK-----/, 'PGP key format') + .description('Public PGP key for the User that is used for encryption. Use empty string to remove the key'), + encryptMessages: booleanSchema.default(false).description('If true then received messages are encrypted'), + encryptForwarded: booleanSchema.default(false).description('If true then forwarded messages are encrypted'), + + featureFlags: Joi.object(Object.fromEntries(FEATURE_FLAGS.map(flag => [flag, booleanSchema.default(false)]))).description( + 'Feature flags to specify' + ), + + sess: sessSchema, + ip: sessIPSchema + }, + pathParams: {}, + queryParams: {}, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + id: userId + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - username: usernameSchema.required(), - password: Joi.string().max(256).allow(false, '').required(), - hashedPassword: booleanSchema.default(false), - allowUnsafe: booleanSchema.default(true), - - address: Joi.string().email({ tlds: false }), - emptyAddress: booleanSchema.default(false), - - language: Joi.string().empty('').max(20), - - retention: Joi.number().min(0).default(0), - - name: Joi.string().max(256), - targets: Joi.array().items( - Joi.string().email({ tlds: false }), - Joi.string().uri({ - scheme: [/smtps?/, /https?/], - allowRelative: false, - relativeOnly: false - }) - ), - - spamLevel: Joi.number().min(0).max(100).default(50), - - quota: Joi.number().min(0).default(0), - recipients: Joi.number().min(0).default(0), - forwards: Joi.number().min(0).default(0), - - filters: Joi.number().min(0).default(0), - - requirePasswordChange: booleanSchema.default(false), - - imapMaxUpload: Joi.number().min(0).default(0), - imapMaxDownload: Joi.number().min(0).default(0), - pop3MaxDownload: Joi.number().min(0).default(0), - pop3MaxMessages: Joi.number().min(0).default(0), - imapMaxConnections: Joi.number().min(0).default(0), - receivedMax: Joi.number().min(0).default(0), - - fromWhitelist: Joi.array().items(Joi.string().trim().max(128)), - - tags: Joi.array().items(Joi.string().trim().max(128)), - addTagsToAddress: booleanSchema.default(false), - - uploadSentMessages: booleanSchema.default(false), - - mailboxes: Joi.object().keys({ - sent: Joi.string() - .empty('') - .regex(/\/{2,}|\/$/, { invert: true }), - trash: Joi.string() - .empty('') - .regex(/\/{2,}|\/$/, { invert: true }), - junk: Joi.string() - .empty('') - .regex(/\/{2,}|\/$/, { invert: true }), - drafts: Joi.string() - .empty('') - .regex(/\/{2,}|\/$/, { invert: true }) - }), + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; - disabledScopes: Joi.array() - .items(Joi.string().valid(...consts.SCOPES)) - .unique() - .default([]), - - metaData: metaDataSchema.label('metaData'), - internalData: metaDataSchema.label('internalData'), - - pubKey: Joi.string() - .empty('') - .trim() - .regex(/^-----BEGIN PGP PUBLIC KEY BLOCK-----/, 'PGP key format'), - encryptMessages: booleanSchema.default(false), - encryptForwarded: booleanSchema.default(false), - - featureFlags: Joi.object(Object.fromEntries(FEATURE_FLAGS.map(flag => [flag, booleanSchema.default(false)]))), - - sess: sessSchema, - ip: sessIPSchema + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -534,14 +646,43 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.get( - '/users/resolve/:username', + { + path: '/users/resolve/:username', + summary: 'Resolve ID for a username', + tags: ['Users'], + validationObjs: { + requestBody: {}, + queryParams: { + sess: sessSchema, + ip: sessIPSchema + }, + pathParams: { + username: usernameSchema + .required() + .description( + 'Username of the User. Alphanumeric value. Must start with a letter, dots are allowed but informational only ("user.name" is the same as "username")' + ) + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes.example(true), + id: userId.description('Unique ID (24 byte hex)').example('609d201236d1d936948f23b1') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - username: usernameSchema.required(), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -609,14 +750,163 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.get( - '/users/:user', + { + path: '/users/:user', + summary: 'Request User information', + tags: ['Users'], + validationObjs: { + requestBody: {}, + queryParams: { + sess: sessSchema, + ip: sessIPSchema + }, + pathParams: { + user: userId + }, + repsonse: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + id: userId.description('Users unique ID (24 byte hex)'), + username: Joi.string().required().description('Username of the User'), + name: Joi.string().required().description('Name of the User'), + address: Joi.string().required().description('Main email address of the User'), + retention: Joi.number().required().description('Default retention time (in ms). false if not enabled'), + enabled2fa: Joi.array().items(Joi.string()).required().description('List of enabled 2FA methods'), + autoreply: booleanSchema + .required() + .description('Is autoreply enabled or not (start time may still be in the future or end time in the past)'), + encryptMessages: booleanSchema.required().description('If true then received messages are encrypted'), + encryptForwarded: booleanSchema.required().description('If true then forwarded messages are encrypted'), + pubKey: Joi.string().required().description('Public PGP key for the User that is used for encryption'), + keyInfo: Joi.object({ + name: Joi.string().required().description('Name listed in public key'), + address: Joi.string().required().description('E-mail address listed in public key'), + fingerprint: Joi.string().required().description('Fingerprint of the public key') + }) + .$_setFlag('objectName', 'KeyInfo') + .required() + .description('Information about public key or false if key is not available'), + metaData: metaDataSchema.required().description('Custom metadata object set for this user'), + internalData: Joi.object({}) + .required() + .description('Custom internal metadata object set for this user. Not available for user-role tokens'), + targets: Joi.array().items(Joi.string()).required().description('List of forwarding targets'), + spamLevel: Joi.number() + .required() + .description('Relative scale for detecting spam. 0 means that everything is spam, 100 means that nothing is spam'), + limits: Joi.object({ + quota: quotaRes, + recipients: Joi.object({ + allowed: Joi.number().required().description('How many messages per 24 hours can be send'), + used: Joi.number().required().description('How many messages are sent during current 24 hour period'), + ttl: Joi.number().required().description('Time until the end of current 24 hour period') + }) + .required() + .$_setFlag('objectName', 'Recipients') + .description('Sending quota'), + filters: Joi.object({ + allowed: Joi.number().required().description('How many filters are allowed'), + used: Joi.number().required().description('How many filters have been created') + }) + .required() + .$_setFlag('objectName', 'Filters') + .description('Sending quota'), + forwards: Joi.object({ + allowed: Joi.number().required().description('How many messages per 24 hours can be forwarded'), + used: Joi.number().required().description('How many messages are forwarded during current 24 hour period'), + ttl: Joi.number().required().description('Time until the end of current 24 hour period') + }) + .required() + .$_setFlag('objectName', 'Forwards') + .description('Forwarding quota'), + received: Joi.object({ + allowed: Joi.number().required().description('How many messages per 1 hour can be received'), + used: Joi.number().required().description('How many messages are received during current 1 hour period'), + ttl: Joi.number().required().description('Time until the end of current 1 hour period') + }) + .required() + .$_setFlag('objectName', 'Received') + .description('Receiving quota'), + imapUpload: Joi.object({ + allowed: Joi.number() + .required() + .description( + 'How many bytes per 24 hours can be uploaded via IMAP. Only message contents are counted, not protocol overhead.' + ), + used: Joi.number().required().description('How many bytes are uploaded during current 24 hour period'), + ttl: Joi.number().required().description('Time until the end of current 24 hour period') + }) + .required() + .description('IMAP upload quota') + .$_setFlag('objectName', 'ImapUpload'), + imapDownload: Joi.object({ + allowed: Joi.number() + .required() + .description( + 'How many bytes per 24 hours can be downloaded via IMAP. Only message contents are counted, not protocol overhead.' + ), + used: Joi.number().required().description('How many bytes are downloaded during current 24 hour period'), + ttl: Joi.number().required().description('Time until the end of current 24 hour period') + }) + .required() + .description('IMAP download quota') + .$_setFlag('objectName', 'ImapDownload'), + pop3Download: Joi.object({ + allowed: Joi.number() + .required() + .description( + 'How many bytes per 24 hours can be downloaded via POP3. Only message contents are counted, not protocol overhead.' + ), + used: Joi.number().required().description('How many bytes are downloaded during current 24 hour period'), + ttl: Joi.number().required().description('Time until the end of current 24 hour period') + }) + .required() + .description('POP3 download quota') + .$_setFlag('objectName', 'Pop3Download'), + imapMaxConnections: Joi.object({ + allowed: Joi.number().required().description('How many parallel IMAP connections are permitted'), + used: Joi.number().required().description('How many parallel IMAP connections are currenlty in use') + }) + .description('a') + .$_setFlag('objectName', 'ImapMaxConnections') + }) + .required() + .description('Account limits and usage') + .$_setFlag('objectName', 'UserLimits'), + tags: Joi.array().items(Joi.string()).required().description('List of tags associated with the User'), + fromWhitelist: Joi.array() + .items(Joi.string()) + .description('A list of additional email addresses this user can send mail from. Wildcard is allowed.'), + disabledScopes: Joi.array() + .items( + Joi.string() + .valid(...consts.SCOPES) + .$_setFlag('objectName', 'DisabledScopes') + ) + .unique() + .required() + .default([]) + .description('Disabled scopes for this user'), + hasPasswordSet: booleanSchema.required().description('If true then the User has a password set and can authenticate'), + activated: booleanSchema.required().description('Is the account activated'), + disabled: booleanSchema.required().description('If true then the user can not authenticate or receive any new mail'), + suspended: booleanSchema.required().description('If true then the user can not authenticate') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -855,78 +1145,137 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.put( - '/users/:user', - tools.responseWrapper(async (req, res) => { - res.charSet('utf-8'); - - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - - existingPassword: Joi.string().empty('').min(1).max(256), - - password: Joi.string().max(256).allow(false, ''), - hashedPassword: booleanSchema.default(false), - allowUnsafe: booleanSchema.default(true), - - language: Joi.string().empty('').max(20), - - name: Joi.string().empty('').max(256), - targets: Joi.array().items( - Joi.string().email({ tlds: false }), - Joi.string().uri({ - scheme: [/smtps?/, /https?/], - allowRelative: false, - relativeOnly: false - }) - ), - - spamLevel: Joi.number().min(0).max(100), - - uploadSentMessages: booleanSchema.default(false), - - fromWhitelist: Joi.array().items(Joi.string().trim().max(128)), + { + path: '/users/:user', + summary: 'Update User information', + tags: ['Users'], + validationObjs: { + requestBody: { + existingPassword: Joi.string() + .empty('') + .min(1) + .max(256) + .description('If provided then validates against account password before applying any changes'), + + password: Joi.string() + .max(256) + .allow(false, '') + .description( + 'New password for the account. Set to boolean false to disable password usage for the master scope, Application Specific Passwords would still be allowed' + ), + hashedPassword: booleanSchema + .default(false) + .description( + 'If true then password is already hashed, so store as is. Supported hashes: pbkdf2, bcrypt ($2a, $2y, $2b), md5 ($1), sha512 ($6), sha256 ($5), argon2 ($argon2d, $argon2i, $argon2id). Stored hashes are rehashed to pbkdf2 on first successful password check.' + ), + allowUnsafe: booleanSchema + .default(true) + .description( + 'If false then validates provided passwords against Have I Been Pwned API. Experimental, so validation is disabled by default but will be enabled automatically in some future version of WildDuck.' + ), + + language: Joi.string().empty('').max(20).description('Language code for the User'), + + name: Joi.string().empty('').max(256).description('Name of the User'), + targets: Joi.array() + .items( + Joi.string().email({ tlds: false }), + Joi.string().uri({ + scheme: [/smtps?/, /https?/], + allowRelative: false, + relativeOnly: false + }) + ) + .description( + 'An array of forwarding targets. The value could either be an email address or a relay url to next MX server ("smtp://mx2.zone.eu:25") or an URL where mail contents are POSTed to' + ), + + spamLevel: Joi.number() + .min(0) + .max(100) + .description('Relative scale for detecting spam. 0 means that everything is spam, 100 means that nothing is spam'), + + uploadSentMessages: booleanSchema + .default(false) + .description( + 'If true then all messages sent through MSA are also uploaded to the Sent Mail folder. Might cause duplicates with some email clients, so disabled by default.' + ), + + fromWhitelist: Joi.array() + .items(Joi.string().trim().max(128)) + .description('A list of additional email addresses this user can send mail from. Wildcard is allowed.'), + + metaData: metaDataSchema.label('metaData').description('Optional metadata, must be an object or JSON formatted string'), + internalData: metaDataSchema + .label('internalData') + .description('Optional internal metadata, must be an object or JSON formatted string of an object. Not available for user-role tokens'), + + pubKey: Joi.string() + .empty('') + .trim() + .regex(/^-----BEGIN PGP PUBLIC KEY BLOCK-----/, 'PGP key format') + .description('Public PGP key for the User that is used for encryption. Use empty string to remove the key'), + encryptMessages: booleanSchema.description('If true then received messages are encrypted'), + encryptForwarded: booleanSchema.description('If true then forwarded messages are encrypted'), + retention: Joi.number().min(0).description('Default retention time (in ms). Set to 0 to disable'), - metaData: metaDataSchema.label('metaData'), - internalData: metaDataSchema.label('internalData'), + quota: Joi.number().min(0).description('Allowed quota of the user in bytes'), + recipients: Joi.number().min(0).description('How many messages per 24 hour can be sent'), + forwards: Joi.number().min(0).description('How many messages per 24 hour can be forwarded'), - pubKey: Joi.string() - .empty('') - .trim() - .regex(/^-----BEGIN PGP PUBLIC KEY BLOCK-----/, 'PGP key format'), - encryptMessages: booleanSchema, - encryptForwarded: booleanSchema, - retention: Joi.number().min(0), + filters: Joi.number().min(0).description('How many filters are allowed for this account'), - quota: Joi.number().min(0), - recipients: Joi.number().min(0), - forwards: Joi.number().min(0), + imapMaxUpload: Joi.number().min(0).description('How many bytes can be uploaded via IMAP during 24 hour'), + imapMaxDownload: Joi.number().min(0).description('How many bytes can be downloaded via IMAP during 24 hour'), + pop3MaxDownload: Joi.number().min(0).description('How many bytes can be downloaded via POP3 during 24 hour'), + pop3MaxMessages: Joi.number().min(0).description('How many latest messages to list in POP3 session'), + imapMaxConnections: Joi.number().min(0).description('How many parallel IMAP connections are alowed'), - filters: Joi.number().min(0), + receivedMax: Joi.number().min(0).description('How many messages can be received from MX during 60 seconds'), - imapMaxUpload: Joi.number().min(0), - imapMaxDownload: Joi.number().min(0), - pop3MaxDownload: Joi.number().min(0), - pop3MaxMessages: Joi.number().min(0), - imapMaxConnections: Joi.number().min(0), + disable2fa: booleanSchema.description('If true, then disables 2FA for this user'), - receivedMax: Joi.number().min(0), + tags: Joi.array().items(Joi.string().trim().max(128)).description('A list of tags associated with this user'), - disable2fa: booleanSchema, + disabledScopes: Joi.array() + .items(Joi.string().valid(...consts.SCOPES)) + .unique() + .description('List of scopes that are disabled for this user ("imap", "pop3", "smtp")'), - tags: Joi.array().items(Joi.string().trim().max(128)), + disabled: booleanSchema.description('If true then disables user account (can not login, can not receive messages)'), - disabledScopes: Joi.array() - .items(Joi.string().valid(...consts.SCOPES)) - .unique(), + featureFlags: Joi.object(Object.fromEntries(FEATURE_FLAGS.map(flag => [flag, booleanSchema.default(false)]))).description( + 'Enabled feature flags' + ), - disabled: booleanSchema, + suspended: booleanSchema.description('If true then disables authentication'), - featureFlags: Joi.object(Object.fromEntries(FEATURE_FLAGS.map(flag => [flag, booleanSchema.default(false)]))), + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: { + user: userId + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes + }) + } + } + } + }, + tools.responseWrapper(async (req, res) => { + res.charSet('utf-8'); - suspended: booleanSchema, + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; - sess: sessSchema, - ip: sessIPSchema + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1124,15 +1473,39 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.put( - '/users/:user/logout', + { + path: '/users/:user/logout', + summary: 'Log out User', + tags: ['Users'], + validationObjs: { + requestBody: { + reason: Joi.string().empty('').max(128).description('Message to be shown to connected IMAP client'), + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: { + user: userId + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - reason: Joi.string().empty('').max(128), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1174,14 +1547,42 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.post( - '/users/:user/quota/reset', + { + path: '/users/:user/quota/reset', + description: + 'This method recalculates quota usage for a User. Normally not needed, only use it if quota numbers are way off. This method is not transactional, so if the user is currently receiving new messages then the resulting value is not exact.', + summary: 'Recalculate User quota', + tags: ['Users'], + validationObjs: { + requestBody: { + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: { + user: userId + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + storageUsed: Joi.number().description('Calculated quota usage for the user').required(), + previousStorageUsed: Joi.number().description('Previous storage used').required() + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1322,13 +1723,36 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.post( - '/quota/reset', + { + path: '/quota/reset', + description: + 'This method recalculates quota usage for all Users. Normally not needed, only use it if quota numbers are way off. This method is not transactional, so if the user is currently receiving new messages then the resulting value is not exact.', + summary: 'Recalculate Quota for all Users', + tags: ['Users'], + validationObjs: { + requestBody: { + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: {}, + response: { + 200: { + description: 'Success', + model: Joi.object({ success: successRes, task: Joi.string().required().description('Task ID') }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1367,15 +1791,42 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.post( - '/data/export', + { + path: '/data/export', + tags: ['Export'], + summary: 'Export data', + description: + 'Export data for matching users. Export dump does not include emails, only account structure (user data, password hashes, mailboxes, filters, etc.). A special "export"-role access token is required for exporting and importing.', + validationObjs: { + requestBody: { + users: Joi.array().single().items(Joi.string().hex().lowercase().length(24).required()).description('An array of User ID values to export'), + tags: Joi.array() + .single() + .items(Joi.string().trim().empty('').max(1024)) + .description('An array of user tags to export. If set then at least one tag must exist on an user.'), + sess: sessSchema, + ip: sessIPSchema + }, + pathParams: {}, + queryParams: {}, + response: { + 200: { + description: 'Success', + model: Joi.binary() + } + } + }, + responseType: 'application/octet-stream' + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - users: Joi.array().single().items(Joi.string().hex().lowercase().length(24).required()), - tags: Joi.array().single().items(Joi.string().trim().empty('').max(1024)), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1487,7 +1938,30 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.post( - '/data/import', + { + path: '/data/import', + summary: 'Import user data', + description: + 'Import data from an export dump. If a database entry already exists, it is not modified. A special "export"-role access token is required for exporting and importing.', + tags: ['Export'], + applicationType: 'application/octet-stream', + validationObjs: { + requestBody: {}, + pathParams: {}, + queryParams: {}, + response: { + 200: { + description: 'Success', + model: Joi.object({ + entries: Joi.number().description('How many database entries were found from the export file'), + imported: Joi.number().description('How many database entries were imported from the export file'), + failed: Joi.number().description('How many database entries were not imported due to some error'), + existing: Joi.number().description('How many database existing entries were not imported') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); @@ -1657,15 +2131,42 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.post( - '/users/:user/password/reset', + { + path: '/users/:user/password/reset', + summary: 'Reset password for a User', + description: 'This method generates a new temporary password for a User. Additionally it removes all two-factor authentication settings', + tags: ['Users'], + validationObjs: { + requestBody: { + validAfter: Joi.date().empty('').allow(false).description('Allow using the generated password not earlier than provided time'), + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: { + user: userId + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + password: Joi.string().required().description('Temporary password'), + validAfter: Joi.date().empty('').description('The date password is valid after') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - validAfter: Joi.date().empty('').allow(false), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1707,15 +2208,54 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.del( - '/users/:user', + { + path: '/users/:user', + summary: 'Delete a User', + description: + 'This method deletes user and address entries from DB and schedules a background task to delete messages. You can call this method several times even if the user has already been deleted, in case there are still some pending messages.', + tags: ['Users'], + validationObjs: { + requestBody: {}, + queryParams: { + deleteAfter: Joi.date() + .empty('') + .allow(false) + .default(false) + .description( + 'Delete user entry from registry but keep all user data until provided date. User account is fully recoverable up to that date.' + ), + sess: sessSchema, + ip: sessIPSchema + }, + pathParams: { + user: userId + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + code: Joi.string().example('TaskScheduled').description('Task code. Should be TaskScheduled'), + user: Joi.string().description('User ID'), + addresses: Joi.object({ + deleted: Joi.number().description('Number of deleted addresses') + }), + deleteAfter: Joi.date().description('Delete after date'), + task: Joi.string().description('Task ID') + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - deleteAfter: Joi.date().empty('').allow(false).default(false), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1761,14 +2301,44 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.get( - '/users/:user/restore', + { + path: '/users/:user/restore', + summary: 'Return recovery info for a deleted user', + tags: ['Users'], + validationObjs: { + requestBody: {}, + queryParams: { + sess: sessSchema, + ip: sessIPSchema + }, + pathParams: { + user: userId + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + user: Joi.string().description('ID of the deleted User').required(), + username: Joi.string().description('Username of the User').required(), + storageUsed: Joi.number().description('Calculated quota usage for the user').required(), + tags: Joi.array().items(Joi.string()).description('List of tags associated with the User').required(), + deleted: Joi.date().description('Datestring of the time the user was deleted').required(), + recoverableAddresses: Joi.array().items(Joi.string()).description('List of email addresses that can be restored').required() + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { @@ -1817,14 +2387,47 @@ module.exports = (db, server, userHandler, settingsHandler) => { ); server.post( - '/users/:user/restore', + { + path: '/users/:user/restore', + summary: 'Cancel user deletion task', + description: + 'Use this endpoint to cancel a timed deletion task scheduled by DELETE /user/{id}. If user data is not yet deleted then the account is fully recovered, except any email addresses that might have been already recycled', + tags: ['Users'], + validationObjs: { + requestBody: { + sess: sessSchema, + ip: sessIPSchema + }, + queryParams: {}, + pathParams: { + user: userId + }, + response: { + 200: { + description: 'Success', + model: Joi.object({ + success: successRes, + code: Joi.string().required().description('Task status code'), + user: Joi.string().description('User ID'), + task: Joi.string().description('Existing task id'), + addresses: Joi.object({ + recovered: Joi.number().description('Number of recovered addresses'), + main: Joi.string().description('Main address') + }) + }) + } + } + } + }, tools.responseWrapper(async (req, res) => { res.charSet('utf-8'); - const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - sess: sessSchema, - ip: sessIPSchema + const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs; + + const schema = Joi.object({ + ...pathParams, + ...requestBody, + ...queryParams }); const result = schema.validate(req.params, { diff --git a/lib/handlers/on-search.js b/lib/handlers/on-search.js index 8e7dd34a..1a97422a 100644 --- a/lib/handlers/on-search.js +++ b/lib/handlers/on-search.js @@ -244,7 +244,7 @@ module.exports = server => (mailbox, options, session, callback) => { } break; - case 'headerdate': + case 'date': { let op = false; let value = new Date(term.value + ' GMT'); diff --git a/lib/message-handler.js b/lib/message-handler.js index e04acada..088d52c9 100644 --- a/lib/message-handler.js +++ b/lib/message-handler.js @@ -19,6 +19,7 @@ const { SettingsHandler } = require('./settings-handler'); // index only the following headers for SEARCH const INDEXED_HEADERS = ['to', 'cc', 'subject', 'from', 'sender', 'reply-to', 'message-id', 'thread-index', 'list-id', 'delivered-to']; +const DISALLOWED_HEADERS_FOR_ADDRESS_REGISTER = ['list-id', 'auto-submitted', 'x-auto-response-suppress']; openpgp.config.commentstring = 'Plaintext message encrypted by WildDuck Mail Server'; openpgp.config.versionString = `WildDuck v${packageData.version}`; @@ -525,9 +526,21 @@ class MessageHandler { if (parsed) { let keyList = mailboxData.specialUse === '\\Sent' ? ['to', 'cc', 'bcc'] : ['from']; + + for (const disallowedHeader of DISALLOWED_HEADERS_FOR_ADDRESS_REGISTER) { + // if email contains headers that we do not want, + // don't add any emails to address register + if (parsed[disallowedHeader]) { + return next(); + } + } + for (let key of keyList) { if (parsed[key] && parsed[key].length) { for (let addr of parsed[key]) { + if (/no-?reply/i.test(addr.address)) { + continue; + } if (!addresses.some(a => a.address === addr.address)) { addresses.push(addr); } diff --git a/lib/pop3/connection.js b/lib/pop3/connection.js index b553b73a..9b7ba5a1 100644 --- a/lib/pop3/connection.js +++ b/lib/pop3/connection.js @@ -390,6 +390,11 @@ class POP3Connection extends EventEmitter { }, this.session, (err, response) => { + if (!this.session) { + // already closed, do nothing + return; + } + if (err) { this.logger.info( { @@ -438,6 +443,7 @@ class POP3Connection extends EventEmitter { username, 'USER' ); + this.session.user = response.user; this.openMailbox(err => { diff --git a/lib/prepare-search-filter.js b/lib/prepare-search-filter.js index 81fe0753..65158071 100644 --- a/lib/prepare-search-filter.js +++ b/lib/prepare-search-filter.js @@ -3,8 +3,52 @@ const ObjectId = require('mongodb').ObjectId; const { escapeRegexStr } = require('./tools'); +const uidRangeStringToQuery = uidRange => { + if (!uidRange) { + return; + } + + let query; + + if (/^\d+$/.test(uidRange)) { + query = Number(uidRange); + } else if (/^\d+(,\d+)*$/.test(uidRange)) { + query = { + $in: uidRange + .split(',') + .map(uid => Number(uid)) + .sort((a, b) => a - b) + }; + } else if (/^\d+:(\d+|\*)$/.test(uidRange)) { + let parts = uidRange + .split(':') + .map(uid => Number(uid)) + .sort((a, b) => { + if (a === '*') { + return 1; + } + if (b === '*') { + return -1; + } + return a - b; + }); + if (parts[0] === parts[1]) { + query = parts[0]; + } else { + query = { + $gte: parts[0] + }; + if (!isNaN(parts[1])) { + query.$lte = parts[1]; + } + } + } + return query; +}; + const prepareSearchFilter = async (db, user, payload) => { let mailbox = payload.mailbox ? new ObjectId(payload.mailbox) : false; + let idQuery = uidRangeStringToQuery(payload.id); let thread = payload.thread ? new ObjectId(payload.thread) : false; let orTerms = payload.or || {}; @@ -62,7 +106,7 @@ const prepareSearchFilter = async (db, user, payload) => { filter.$text = { $search: query }; } else if (orTerms.query) { filter.searchable = true; - orQuery.push({ $text: { $search: query } }); + orQuery.push({ $text: { $search: orTerms.query } }); } if (mailbox) { @@ -87,6 +131,10 @@ const prepareSearchFilter = async (db, user, payload) => { filter.mailbox = { $nin: mailboxes.map(m => m._id) }; } + if (filter.mailbox && idQuery) { + filter.uid = idQuery; + } + if (thread) { filter.thread = thread; } @@ -267,4 +315,4 @@ const prepareSearchFilter = async (db, user, payload) => { return { filter, query }; }; -module.exports = prepareSearchFilter; +module.exports = { uidRangeStringToQuery, prepareSearchFilter }; diff --git a/lib/schemas/request/messages-schemas.js b/lib/schemas/request/messages-schemas.js index d4226e60..48de170c 100644 --- a/lib/schemas/request/messages-schemas.js +++ b/lib/schemas/request/messages-schemas.js @@ -2,57 +2,64 @@ const Joi = require('joi'); const { booleanSchema } = require('../../schemas'); +const { mailboxId, messageId } = require('./general-schemas'); const Address = Joi.object({ - name: Joi.string().empty('').max(255), - address: Joi.string().email({ tlds: false }).required() + name: Joi.string().empty('').max(255).required().description('Name of the sender/recipient'), + address: Joi.string().email({ tlds: false }).required().description('Address of the sender/recipient') }).$_setFlag('objectName', 'Address'); const AddressOptionalName = Joi.object({ - name: Joi.string().empty('').max(255), - address: Joi.string().email({ tlds: false }).required() + name: Joi.string().empty('').max(255).description('Name of the sender'), + address: Joi.string().email({ tlds: false }).required().description('Address of the sender') }).$_setFlag('objectName', 'AddressOptionalName'); const AddressOptionalNameArray = Joi.array().items(AddressOptionalName); const Header = Joi.object({ - key: Joi.string().empty('').max(255), + key: Joi.string().empty('').max(255).description("Header key ('X-Mailer')"), value: Joi.string() .empty('') .max(100 * 1024) + .description("Header value ('My Awesome Mailing Service')") }).$_setFlag('objectName', 'Header'); const Attachment = Joi.object({ - filename: Joi.string().empty('').max(255), - contentType: Joi.string().empty('').max(255), - encoding: Joi.string().empty('').default('base64'), - contentTransferEncoding: Joi.string().empty(''), - content: Joi.string().required(), - cid: Joi.string().empty('').max(255) + filename: Joi.string().empty('').max(255).description('Attachment filename'), + contentType: Joi.string().empty('').max(255).description('MIME type for the attachment file'), + encoding: Joi.string().empty('').default('base64').description('Encoding to use to store the attachments'), + contentTransferEncoding: Joi.string().empty('').description('Transfer encoding'), + content: Joi.string().required().description('Base64 encoded attachment content'), + cid: Joi.string().empty('').max(255).description('Content-ID value if you want to reference to this attachment from HTML formatted message') }).$_setFlag('objectName', 'Attachment'); const ReferenceWithAttachments = Joi.object({ - mailbox: Joi.string().hex().lowercase().length(24).required(), - id: Joi.number().required(), - action: Joi.string().valid('reply', 'replyAll', 'forward').required(), - attachments: Joi.alternatives().try( - booleanSchema, - Joi.array().items( - Joi.string() - .regex(/^ATT\d+$/i) - .uppercase() + mailbox: mailboxId, + id: messageId, + action: Joi.string().valid('reply', 'replyAll', 'forward').required().description('Either reply, replyAll or forward'), + attachments: Joi.alternatives() + .try( + booleanSchema, + Joi.array().items( + Joi.string() + .regex(/^ATT\d+$/i) + .uppercase() + ) + ) + .description( + "If true, then includes all attachments from the original message. If it is an array of attachment ID's includes attachments from the list" ) - ) }).$_setFlag('objectName', 'ReferenceWithAttachments'); const Bimi = Joi.object({ - domain: Joi.string().domain().required(), - selector: Joi.string().empty('').max(255) + domain: Joi.string().domain().required().description('Domain name for the BIMI record. It does not have to be the same as the From address.'), + selector: Joi.string().empty('').max(255).description('Optional BIMI selector') }).$_setFlag('objectName', 'Bimi'); module.exports = { Address, AddressOptionalNameArray, + AddressOptionalName, Header, Attachment, ReferenceWithAttachments, diff --git a/lib/schemas/response/general-schemas.js b/lib/schemas/response/general-schemas.js index 208eebd7..1b969349 100644 --- a/lib/schemas/response/general-schemas.js +++ b/lib/schemas/response/general-schemas.js @@ -1,9 +1,32 @@ 'use strict'; +const Joi = require('joi'); const { booleanSchema } = require('../../schemas'); const successRes = booleanSchema.required().description('Indicates successful response'); +const totalRes = Joi.number().required().description('How many results were found'); +const pageRes = Joi.number().required().description('Current page number. Derived from page query argument'); +const previousCursorRes = Joi.alternatives() + .try(Joi.string(), booleanSchema) + .required() + .description('Either a cursor string or false if there are not any previous results'); +const nextCursorRes = Joi.alternatives() + .try(Joi.string(), booleanSchema) + .required() + .description('Either a cursor string or false if there are not any next results'); + +const quotaRes = Joi.object({ + allowed: Joi.number().required().description('Allowed quota of the user in bytes'), + used: Joi.number().required().description('Space used in bytes') +}) + .$_setFlag('objectName', 'Quota') + .description('Quota usage limits'); module.exports = { - successRes + successRes, + totalRes, + pageRes, + previousCursorRes, + nextCursorRes, + quotaRes }; diff --git a/lib/schemas/response/users-schemas.js b/lib/schemas/response/users-schemas.js new file mode 100644 index 00000000..4e2ababe --- /dev/null +++ b/lib/schemas/response/users-schemas.js @@ -0,0 +1,29 @@ +'use strict'; + +const Joi = require('joi'); +const { booleanSchema } = require('../../schemas'); +const { quotaRes } = require('./general-schemas'); + +const GetUsersResult = Joi.object({ + id: Joi.string().required().description('Users unique ID (24byte hex)'), + username: Joi.string().required().description('Username of the User'), + name: Joi.string().required().description('Name of the User'), + address: Joi.string().required().description('Main email address of the User'), + tags: Joi.array().items(Joi.string()).required().description('List of tags associated with the User'), + targets: Joi.array().items(Joi.string()).required().description('List of forwarding targets'), + enabled2fa: Joi.array().items(Joi.string()).required().description('List of enabled 2FA methods'), + autoreply: booleanSchema.required().description('Is autoreply enabled or not (start time may still be in the future or end time in the past)'), + encryptMessages: booleanSchema.required().description('If true then received messages are encrypted'), + encryptForwarded: booleanSchema.required().description('If true then forwarded messages are encrypted'), + quota: quotaRes, + metaData: Joi.object().description('Custom metadata value. Included if metaData query argument was true'), + internalData: Joi.object().description( + 'Custom metadata value for internal use. Included if internalData query argument was true and request was not made using user-role token' + ), + hasPasswordSet: booleanSchema.required().description('If true then the User has a password set and can authenticate'), + activated: booleanSchema.required().description('Is the account activated'), + disabled: booleanSchema.required().description('If true then user can not authenticate or receive any new mail'), + suspended: booleanSchema.required().description('If true then user can not authenticate') +}).$_setFlag('objectName', 'GetUsersResult'); + +module.exports = { GetUsersResult }; diff --git a/lib/settings-handler.js b/lib/settings-handler.js index 84018e61..70eceda3 100644 --- a/lib/settings-handler.js +++ b/lib/settings-handler.js @@ -125,6 +125,18 @@ const SETTING_KEYS = [ type: 'number', constKey: 'MAX_FILTERS', schema: Joi.number() + }, + + { + key: 'const:sender:defer_times', + name: 'Deferred email delay', + description: 'Comma separated list of times between deferred delivery attempts. Eg. "5m, 15m, 20m, 1h, 1h, 1h"', + type: 'string', + confValue: '5m, 7m, 8m, 25m, 75m, 2h, 4h, 4h, 4h, 4h, 4h, 4h, 4h, 4h, 4h, 4h, 4h', + schema: Joi.string() + .allow('') + .trim() + .pattern(/^\d+\s*[a-z]*(\s*,\s*\d+\s*[a-z]*)*$/) } ]; diff --git a/lib/tasks/search-apply.js b/lib/tasks/search-apply.js index 5561ccaa..70dc5fc0 100644 --- a/lib/tasks/search-apply.js +++ b/lib/tasks/search-apply.js @@ -3,7 +3,7 @@ const log = require('npmlog'); const db = require('../db'); const util = require('util'); -const prepareSearchFilter = require('../prepare-search-filter'); +const { prepareSearchFilter } = require('../prepare-search-filter'); const { getMongoDBQuery } = require('../search-query'); const ObjectId = require('mongodb').ObjectId; diff --git a/lib/tools.js b/lib/tools.js index 85f59d3c..ee7eab45 100644 --- a/lib/tools.js +++ b/lib/tools.js @@ -17,6 +17,8 @@ const ObjectId = require('mongodb').ObjectId; const log = require('npmlog'); const addressparser = require('nodemailer/lib/addressparser'); +const Joi = require('joi'); + let templates = false; const structuredCloneWrapper = typeof structuredClone === 'function' ? structuredClone : obj => JSON.parse(JSON.stringify(obj)); @@ -627,7 +629,7 @@ function replaceWithRefs(reqBodyData) { if (reqBodyData.objectName) { const objectName = reqBodyData.objectName; Object.keys(reqBodyData).forEach(key => { - if (key !== '$ref') { + if (key !== '$ref' || key !== 'description') { delete reqBodyData[key]; } }); @@ -765,6 +767,28 @@ function parseJoiObject(path, joiObject, requestBodyProperties) { const data = { type: openApiType, description, required: isRequired }; if (format) { data.format = format; + + if (data.format === 'date') { + data.format = 'date-time'; + } + } + + // enum check + if (joiObject._valids) { + const enumValues = []; + for (const validEnumValue of joiObject._valids._values) { + enumValues.push(validEnumValue); + } + if (enumValues.length > 0) { + data.enum = enumValues; + } + } + + // example check + if (joiObject.$_terms && joiObject.$_terms.examples && joiObject.$_terms.examples.length > 0) { + const example = joiObject.$_terms.examples[0]; + + data.example = example; } if (path) { @@ -956,22 +980,19 @@ module.exports = { // 5) add requestBody const applicationType = spec.applicationType || 'application/json'; - operationObj.requestBody = { - content: { - [applicationType]: { - schema: { - type: 'object', - properties: {} - } - } - }, - required: true - }; - for (const reqBodyKey in spec.validationObjs?.requestBody) { - const reqBodyKeyData = spec.validationObjs.requestBody[reqBodyKey]; + if (spec.validationObjs?.requestBody && Object.keys(spec.validationObjs.requestBody).length > 0) { + operationObj.requestBody = { + content: { + [applicationType]: { + schema: {} + } + }, + required: true + }; - parseJoiObject(reqBodyKey, reqBodyKeyData, operationObj.requestBody.content[applicationType].schema.properties); + // convert to Joi object for easier parsing + parseJoiObject('schema', Joi.object(spec.validationObjs?.requestBody), operationObj.requestBody.content[applicationType]); } // 6) add parameters (queryParams + pathParams). @@ -997,6 +1018,25 @@ module.exports = { obj.description = paramKeyData._flags.description; obj.required = paramKeyData._flags.presence === 'required'; obj.schema = { type: paramKeyData.type }; + + // enum check + if (paramKeyData._valids) { + const enumValues = []; + for (const validEnumValue of paramKeyData._valids._values) { + enumValues.push(validEnumValue); + } + if (enumValues.length > 0) { + obj.schema.enum = enumValues; + } + } + + // example check + if (paramKeyData.$_terms && paramKeyData.$_terms.examples && paramKeyData.$_terms.examples.length > 0) { + const example = paramKeyData.$_terms.examples[0]; + + obj.schema.example = example; + } + operationObj.parameters.push(obj); } @@ -1033,7 +1073,7 @@ module.exports = { const innerData = pathData[httpMethod]; // for every requestBody obj - for (const key in innerData.requestBody.content[Object.keys(innerData.requestBody.content)[0]].schema.properties) { + for (const key in innerData?.requestBody?.content[Object.keys(innerData.requestBody.content)[0]].schema.properties) { const reqBodyData = innerData.requestBody.content[Object.keys(innerData.requestBody.content)[0]].schema.properties[key]; parseComponetsDecoupled(reqBodyData, components.components.schemas); @@ -1057,25 +1097,26 @@ module.exports = { const finalObj = { paths: mapPathToMethods }; + components.components.securitySchemes = { + AccessTokenAuth: { + name: 'X-Access-Token', + type: 'apiKey', + in: 'header', + description: `If authentication is enabled in the WildDuck configuration, you will need to supply an access token in the \`X-Access-Token\` header.\n + \`\`\`json + { + "X-Access-Token": "59fc66a03e54454869460e45" + } + \`\`\` + ` + } + }; + docs = { ...docs, ...finalObj }; docs = { ...docs, ...components }; docs = { ...docs, - securitySchemes: { - AccessTokenAuth: { - name: 'X-Access-Token', - type: 'apiKey', - in: 'header', - description: `If authentication is enabled in the WildDuck configuration, you will need to supply an access token in the \`X-Access-Token\` header. - \`\`\`json - { - "X-Access-Token": "59fc66a03e54454869460e45" - } - \`\`\` - ` - } - }, security: [{ AccessTokenAuth: [] }] }; diff --git a/package-lock.json b/package-lock.json index c11474b1..7ca150b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wildduck", - "version": "1.40.10", + "version": "1.41.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wildduck", - "version": "1.40.10", + "version": "1.41.3", "license": "EUPL-1.2", "dependencies": { "@fidm/x509": "1.2.1", @@ -16,15 +16,15 @@ "@root/acme": "3.1.0", "@root/csr": "0.8.1", "accesscontrol": "2.2.1", - "axios": "1.5.1", + "axios": "1.6.3", "base32.js": "0.1.0", "bcryptjs": "2.4.3", - "bson": "6.1.0", - "bullmq": "4.12.4", - "fido2-lib": "3.4.1", + "bson": "6.2.0", + "bullmq": "5.1.1", + "fido2-lib": "3.4.4", "gelf": "2.0.1", - "generate-password": "1.7.0", - "hash-wasm": "4.10.0", + "generate-password": "1.7.1", + "hash-wasm": "4.11.0", "he": "1.2.0", "html-to-text": "9.0.5", "humanname": "0.2.2", @@ -40,7 +40,7 @@ "libmime": "5.2.1", "libqp": "2.0.1", "logic-query-parser": "0.0.5", - "mailauth": "4.5.2", + "mailauth": "4.6.0", "mailsplit": "5.4.0", "mobileconfig": "2.4.0", "mongo-cursor-pagination": "8.1.3", @@ -48,12 +48,12 @@ "mongodb-extended-json": "1.11.1", "msgpack5": "6.0.2", "node-forge": "1.3.1", - "node-html-parser": "6.1.10", - "nodemailer": "6.9.6", + "node-html-parser": "6.1.12", + "nodemailer": "6.9.8", "npmlog": "7.0.1", - "openpgp": "5.10.2", + "openpgp": "5.11.0", "pem-jwk": "2.0.0", - "punycode": "2.3.0", + "punycode": "2.3.1", "pwnedpasswords": "1.0.6", "qrcode": "1.5.3", "restify": "11.1.0", @@ -64,28 +64,28 @@ "seq-index": "1.1.0", "smtp-server": "3.13.0", "speakeasy": "2.0.0", - "undici": "5.26.3", + "undici": "5.28.2", "unix-crypt-td-js": "1.1.4", "unixcrypt": "1.2.0", "uuid": "9.0.1", "wild-config": "1.7.1", "yargs": "17.7.2", - "zone-mta": "3.6.13" + "zone-mta": "3.7.0" }, "devDependencies": { "ajv": "8.12.0", "chai": "4.3.10", "docsify-cli": "4.4.4", - "eslint": "8.51.0", + "eslint": "8.56.0", "eslint-config-nodemailer": "1.2.0", - "eslint-config-prettier": "9.0.0", + "eslint-config-prettier": "9.1.0", "grunt": "1.6.1", "grunt-cli": "1.4.3", "grunt-eslint": "24.3.0", "grunt-mocha-test": "0.13.3", "grunt-shell-spawn": "0.4.0", "grunt-wait": "0.3.0", - "imapflow": "1.0.144", + "imapflow": "1.0.147", "mailparser": "3.6.5", "mocha": "10.2.0", "request": "2.88.2", @@ -208,47 +208,50 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.428.0.tgz", - "integrity": "sha512-uj296JRU0LlMVtv7oS9cBTutAya1Gl171BJOl9s/SotMgybUAxnmE+hQdXv2HQP8qwy95wAptbcpDDh4kuOiYQ==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.484.0.tgz", + "integrity": "sha512-xjibqYYx8I8lYM17q3THMC8WpJihzio3+Wd6oAMdcaw+EBsgUcphsRHL5YO8wNEzNiMeXrXOPPUBapxpBmFPBA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.428.0", - "@aws-sdk/credential-provider-node": "3.428.0", - "@aws-sdk/middleware-host-header": "3.428.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-signing": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/region-config-resolver": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.428.0", - "@smithy/config-resolver": "^2.0.14", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.0", - "@smithy/middleware-retry": "^2.0.16", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", + "@aws-sdk/client-sts": "3.484.0", + "@aws-sdk/core": "3.481.0", + "@aws-sdk/credential-provider-node": "3.484.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.478.0", + "@aws-sdk/region-config-resolver": "3.484.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.478.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.22", + "@smithy/core": "^1.2.1", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.25", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.19", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.31", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -256,44 +259,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.428.0.tgz", - "integrity": "sha512-6BuY7cd1licnCZTKuI/IK3ycKATIgsG53TuaK1hZcikwUB2Oiu2z6K+aWpmO9mJuJ6qAoE4dLlAy6lBBBkG6yQ==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.484.0.tgz", + "integrity": "sha512-eHKXDHqgPt99977hNissa1y/efwXZ9kg3EKPLK13b6VzTC8s0+Ih+YZemNE22ahw6SYnRiGglYdkdypJ/uPHkg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.428.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/region-config-resolver": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.428.0", - "@smithy/config-resolver": "^2.0.14", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.0", - "@smithy/middleware-retry": "^2.0.16", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", + "@aws-sdk/core": "3.481.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.478.0", + "@aws-sdk/region-config-resolver": "3.484.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.478.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.22", + "@smithy/core": "^1.2.1", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.25", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.19", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.31", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -301,47 +307,49 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.428.0.tgz", - "integrity": "sha512-ko9hgmIkS5FNPYtT3pntGGmp+yi+VXBEgePUBoplEKjCxsX/aTgFcq2Rs9duD9/CzkThd42Z0l0fWsVAErVxWQ==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.484.0.tgz", + "integrity": "sha512-psQxH0mYhTVvZhfca3s9NbXgnuOM8l+5LtF7fZBF5y4xaPpfAPicPWp6po69J3ynwyXi/MpHNXd/13d/L09TTA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.428.0", - "@aws-sdk/middleware-host-header": "3.428.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-sdk-sts": "3.428.0", - "@aws-sdk/middleware-signing": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/region-config-resolver": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.428.0", - "@smithy/config-resolver": "^2.0.14", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.0", - "@smithy/middleware-retry": "^2.0.16", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", + "@aws-sdk/core": "3.481.0", + "@aws-sdk/credential-provider-node": "3.484.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.478.0", + "@aws-sdk/region-config-resolver": "3.484.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.478.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.22", + "@smithy/core": "^1.2.1", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.25", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.19", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.31", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, @@ -371,16 +379,33 @@ "fxparser": "src/cli/cli.js" } }, + "node_modules/@aws-sdk/core": { + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.481.0.tgz", + "integrity": "sha512-UeyAc2FnWQDts81vPVBWKEj0WagYK4SVAgNfGcg6zCzzqsUG4unr4NPKQoca2L+XOU55yMCy+5l2K6R3YsFGKg==", + "optional": true, + "dependencies": { + "@smithy/core": "^1.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/signature-v4": "^2.0.0", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.428.0.tgz", - "integrity": "sha512-amq+gnybLBOyX1D+GdcjEvios8VBL4TaTyuXPnAjkhinv2e6GHQ0/7QeaI5v4dd4YT76+Nz7a577VXfMf/Ijog==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.484.0.tgz", + "integrity": "sha512-kIusxi5f9jcNfLjNv/fv6eNRHN1bSQhN8nS31jBRemQL3zBuUePk50MqbciZUh29Rf/ATOVvH6UStaxnV6ivlg==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.428.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/client-cognito-identity": "3.484.0", + "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -388,14 +413,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.428.0.tgz", - "integrity": "sha512-e6fbY174Idzw0r5ZMT1qkDh+dpOp1DX3ickhr7J6ipo3cUGLI45Y5lnR9nYXWfB5o/wiNv4zXgN+Y3ORJJHzyA==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", + "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -403,17 +428,19 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.428.0.tgz", - "integrity": "sha512-aLrsmLVRTuO/Gx8AYxIUkZ12DdsFnVK9lbfNpeNOisVjM6ZvjCHqMgDsh12ydkUpmb7C0v+ALj8bHzwKcpyMdA==", + "version": "3.481.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.481.0.tgz", + "integrity": "sha512-A2DJKLc37orM9w/Y9kajZWQ4qK6KD+5QKowXwh5/suhrJjNPKKomHFhAvnqPjJAYaSlES2+wk9O+Mfj0t9X2dw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/node-http-handler": "^2.1.7", + "@aws-sdk/types": "3.468.0", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", "tslib": "^2.5.0" }, "engines": { @@ -421,20 +448,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.428.0.tgz", - "integrity": "sha512-JPc0pVAsP8fOfMxhmPhp7PjddqHaPGBwgVI+wgbkFRUDOmeKCVhoxCB8Womx0R07qRqD5ZCUKBS2NHQ2b3MFRQ==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.484.0.tgz", + "integrity": "sha512-BbvU7seI0RPPwpujnz4LA1lC53Cj4BOSRpYYZbrxA6C7SzW0D/IQBZQP3JBbrxIhqewSROSsYGDjvYbyi5aDEw==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.428.0", - "@aws-sdk/credential-provider-process": "3.428.0", - "@aws-sdk/credential-provider-sso": "3.428.0", - "@aws-sdk/credential-provider-web-identity": "3.428.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.484.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -442,21 +469,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.428.0.tgz", - "integrity": "sha512-o8toLXf6/sklBpw2e1mzAUq6SvXQzT6iag7Xbg9E0Z2EgVeXLTnWeVto3ilU3cmhTHXBp6wprwUUq2jbjTxMcg==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.484.0.tgz", + "integrity": "sha512-Ylqej3FqRwUD3I7929k214LRH1bUz7f2hfV4ZqY7teM9hQC5Ov5SpVtOtLKNfgaaxAkhD2ffMNfmq8TAg824+g==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.428.0", - "@aws-sdk/credential-provider-ini": "3.428.0", - "@aws-sdk/credential-provider-process": "3.428.0", - "@aws-sdk/credential-provider-sso": "3.428.0", - "@aws-sdk/credential-provider-web-identity": "3.428.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-ini": "3.484.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.484.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -464,15 +491,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.428.0.tgz", - "integrity": "sha512-UG2S2/4Wrskbkbgt9fBlnzwQ2hfTXvLJwUgGOluSOf6+mGCcoDku4zzc9EQdk1MwN5Us+ziyMrIMNY5sbdLg6g==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", + "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -480,17 +507,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.428.0.tgz", - "integrity": "sha512-sW2+kSlICSNntsNhLV5apqJkIOXH5hFISCjwVfyB9JXJQDAj8rzkiFfRsKwQ3aTlTYCysrGesIn46+GRP5AgZw==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.484.0.tgz", + "integrity": "sha512-Fl7+YhrlU2icZkz18z9aj4SiWb2aQlWp5LsVqMfSzTlJFc9yPlD9e7F33gnL7kKLVSnAVxsr5v4y4pFC6FZUSw==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.428.0", - "@aws-sdk/token-providers": "3.428.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/client-sso": "3.484.0", + "@aws-sdk/token-providers": "3.484.0", + "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -498,14 +525,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.428.0.tgz", - "integrity": "sha512-ueuUPPlrJFvtDUVTGnClUGt1wxCbEiKArknah/w9cfcc/c1HtFd/M7x/z2Sm0gSItR45sVcK54qjzmhm29DMzg==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", + "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -513,26 +540,26 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.428.0.tgz", - "integrity": "sha512-BpCrxjiZ4H5PC4vYA7SdTbmvLLrkuaudzHuoPMZ55RGFGfl9xN8caCtXktohzX8+Dn0jutsXuclPwazHOVz9cg==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.484.0.tgz", + "integrity": "sha512-Yl4YPlML79TUir6QPUsgBWFwDu3FOiQGdAnN2eei4ce76ZI5JwPIiBNP0S2qK63R40CeoBqRlSIveBX9v10jjQ==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.428.0", - "@aws-sdk/client-sso": "3.428.0", - "@aws-sdk/client-sts": "3.428.0", - "@aws-sdk/credential-provider-cognito-identity": "3.428.0", - "@aws-sdk/credential-provider-env": "3.428.0", - "@aws-sdk/credential-provider-http": "3.428.0", - "@aws-sdk/credential-provider-ini": "3.428.0", - "@aws-sdk/credential-provider-node": "3.428.0", - "@aws-sdk/credential-provider-process": "3.428.0", - "@aws-sdk/credential-provider-sso": "3.428.0", - "@aws-sdk/credential-provider-web-identity": "3.428.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/client-cognito-identity": "3.484.0", + "@aws-sdk/client-sso": "3.484.0", + "@aws-sdk/client-sts": "3.484.0", + "@aws-sdk/credential-provider-cognito-identity": "3.484.0", + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-http": "3.481.0", + "@aws-sdk/credential-provider-ini": "3.484.0", + "@aws-sdk/credential-provider-node": "3.484.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.484.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -540,14 +567,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.428.0.tgz", - "integrity": "sha512-iIHbW5Ym60ol9Q6vsLnaiNdeUIa9DA0OuoOe9LiHC8SYUYVAAhE+xJXUhn1qk/J7z+4qGOkDnVyEvnSaqRPL/w==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", + "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -555,13 +582,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.428.0.tgz", - "integrity": "sha512-1P0V0quL9u2amdNOn6yYT7/ToQUmkLJqCKHPxsRyDB829vBThWndvvH5MkoItj/VgE1zWqMtrzN3xtzD7zx6Qg==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", + "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -569,29 +596,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.428.0.tgz", - "integrity": "sha512-xC0OMduCByyRdiQz324RXy4kunnCG4LUJCfvdoegM33Elp9ex0D3fcfO1mUgV8qiLwSennIsSRVXHuhNxE2HZA==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", + "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.428.0.tgz", - "integrity": "sha512-Uutl2niYXTnNP8v84v6umWDHD5no7d5/OqkZE1DsmeKR/dje90J5unJWf7MOsqvYm0JGDEWF4lk9xGVyqsw+Aw==", - "optional": true, - "dependencies": { - "@aws-sdk/middleware-signing": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -599,17 +611,17 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.428.0.tgz", - "integrity": "sha512-oMSerTPwtsQAR7fIU/G0b0BA30wF+MC4gZSrJjbypF8MK8nPC2yMfKLR8+QavGOGEW7rUMQ0uklThMTTwQEXNQ==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", + "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.7", + "@smithy/protocol-http": "^3.0.11", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.3.5", - "@smithy/util-middleware": "^2.0.4", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", "tslib": "^2.5.0" }, "engines": { @@ -617,15 +629,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.428.0.tgz", - "integrity": "sha512-+GAhObeHRick2D5jr3YkPckjcggt5v6uUVtEUQW2AdD65cE5PjIvmksv6FuM/mME/9nNA+wufQnHbLI8teLeaw==", + "version": "3.478.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz", + "integrity": "sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.478.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -633,15 +645,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.428.0.tgz", - "integrity": "sha512-VqyHZ/Hoz3WrXXMx8cAhFBl8IpjodbRsTjBI117QPq1YRCegxNdGvqmGZnJj8N2Ef9MP1iU30ZWQB+sviDcogA==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.484.0.tgz", + "integrity": "sha512-qfYSwSIc9GasHFrJidydlQE433mB93d31dfypFWhrJPXRv1fhopO72NSfsY2WCcbaRkADc4AajLZFly4J96abw==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.1", - "@smithy/types": "^2.3.5", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.1.0", + "@smithy/util-middleware": "^2.0.8", "tslib": "^2.5.0" }, "engines": { @@ -649,45 +661,47 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.428.0.tgz", - "integrity": "sha512-Jciofr//rB1v1FLxADkXoHOCmYyiv2HVNlOq3z5Zkch9ipItOfD6X7f4G4n+IZzElIFzwe4OKoBtJfcnnfo3Pg==", + "version": "3.484.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.484.0.tgz", + "integrity": "sha512-9Eb7X0sNhJANfYCeEYWCvfeD4shMZEse3YUz5EALzbpzi/So56ZaeA/lWWeh0fkYiByq74eA2QkC/tXZkHw6EQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.428.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.428.0", - "@smithy/config-resolver": "^2.0.14", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.0", - "@smithy/middleware-retry": "^2.0.16", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/node-http-handler": "^2.1.7", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.478.0", + "@aws-sdk/region-config-resolver": "3.484.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.478.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.22", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.25", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.7", + "@smithy/protocol-http": "^3.0.11", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.19", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.23", + "@smithy/util-defaults-mode-node": "^2.0.31", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -695,12 +709,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.428.0.tgz", - "integrity": "sha512-4T0Ps2spjg3qbWE6ZK13Vd3FnzpfliaiotqjxUK5YhjDrKXeT36HJp46JhDupElQuHtTkpdiJOSYk2lvY2H4IA==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", + "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -708,12 +722,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.428.0.tgz", - "integrity": "sha512-ToKMhYlUWJ0YrbggpJLZeyZZNDXtQ4NITxqo/oeGltTT9KG4o/LqVY59EveV0f8P32ObDyj9Vh1mnjxeo3DxGw==", + "version": "3.478.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz", + "integrity": "sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.468.0", + "@smithy/util-endpoints": "^1.0.7", "tslib": "^2.5.0" }, "engines": { @@ -721,9 +736,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "version": "3.465.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.465.0.tgz", + "integrity": "sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -733,26 +748,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.428.0.tgz", - "integrity": "sha512-qlc2UoGsmCpuh1ErY3VayZuAGl74TWWcLmhhQMkeByFSb6KooBlwOmDpDzJRtgwJoe0KXnyHBO6lzl9iczcozg==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", + "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.428.0.tgz", - "integrity": "sha512-s721C3H8TkNd0usWLPEAy7yW2lEglR8QAYojdQGzE0e0wymc671nZAFePSZFRtmqZiFOSfk0R602L5fDbP3a8Q==", + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", + "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.468.0", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -777,9 +792,9 @@ } }, "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.1.1.tgz", - "integrity": "sha512-blVBy5MXz6m36Vx0DfLd7PChOQKEs8lK2bD1WJn/vVgG4FXZiZmZb2GECHFvVPA5T7OnODd9xZiL3nMCv6QUhA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", "cpu": [ "arm64" ], @@ -789,9 +804,9 @@ ] }, "node_modules/@cbor-extract/cbor-extract-darwin-x64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.1.1.tgz", - "integrity": "sha512-h6KFOzqk8jXTvkOftyRIWGrd7sKQzQv2jVdTL9nKSf3D2drCvQB/LHUxAOpPXo3pv2clDtKs3xnHalpEh3rDsw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", "cpu": [ "x64" ], @@ -801,9 +816,9 @@ ] }, "node_modules/@cbor-extract/cbor-extract-linux-arm": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.1.1.tgz", - "integrity": "sha512-ds0uikdcIGUjPyraV4oJqyVE5gl/qYBpa/Wnh6l6xLE2lj/hwnjT2XcZCChdXwW/YFZ1LUHs6waoYN8PmK0nKQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", "cpu": [ "arm" ], @@ -813,9 +828,9 @@ ] }, "node_modules/@cbor-extract/cbor-extract-linux-arm64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.1.1.tgz", - "integrity": "sha512-SxAaRcYf8S0QHaMc7gvRSiTSr7nUYMqbUdErBEu+HYA4Q6UNydx1VwFE68hGcp1qvxcy9yT5U7gA+a5XikfwSQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", "cpu": [ "arm64" ], @@ -825,9 +840,9 @@ ] }, "node_modules/@cbor-extract/cbor-extract-linux-x64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.1.1.tgz", - "integrity": "sha512-GVK+8fNIE9lJQHAlhOROYiI0Yd4bAZ4u++C2ZjlkS3YmO6hi+FUxe6Dqm+OKWTcMpL/l71N6CQAmaRcb4zyJuA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", "cpu": [ "x64" ], @@ -837,9 +852,9 @@ ] }, "node_modules/@cbor-extract/cbor-extract-win32-x64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.1.1.tgz", - "integrity": "sha512-2Niq1C41dCRIDeD8LddiH+mxGlO7HJ612Ll3D/E73ZWBmycued+8ghTr/Ho3CMOWPUEr08XtyBMVXAjqF+TcKw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", "cpu": [ "x64" ], @@ -864,18 +879,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -918,18 +933,18 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", "engines": { "node": ">=14" } @@ -973,12 +988,12 @@ "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -1000,9 +1015,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@ioredis/commands": { @@ -1019,9 +1034,9 @@ } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", "optional": true, "dependencies": { "sparse-bitfield": "^3.0.3" @@ -1169,9 +1184,9 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", - "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", "engines": { "node": ">=8.0.0" } @@ -1236,13 +1251,13 @@ } }, "node_modules/@peculiar/webcrypto/node_modules/@peculiar/asn1-schema": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", - "integrity": "sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", + "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", "dependencies": { "asn1js": "^3.0.5", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.0" + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" } }, "node_modules/@phc/format": { @@ -1385,12 +1400,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.11.tgz", - "integrity": "sha512-MSzE1qR2JNyb7ot3blIOT3O3H0Jn06iNDEgHRaqZUwBgx5EG+VIx24Y21tlKofzYryIOcWpIohLrIIyocD6LMA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", + "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1398,15 +1413,34 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.14.tgz", - "integrity": "sha512-K1K+FuWQoy8j/G7lAmK85o03O89s2Vvh6kMFmzEmiHUoQCRH1rzbDtMnGNiaMHeSeYJ6y79IyTusdRG+LuWwtg==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.22.tgz", + "integrity": "sha512-YuPjsLnq6I5ZQBTx6BL5NsCLtcLel5YIMf3gDeEa+GSCXn5mgRXm+8XO8HtjR3Xf69b88aY4c7bwKQQS2i8vtA==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.1", - "@smithy/types": "^2.3.5", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.1.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz", + "integrity": "sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw==", + "optional": true, + "dependencies": { + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.25", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", "tslib": "^2.5.0" }, "engines": { @@ -1414,15 +1448,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.16.tgz", - "integrity": "sha512-tKa2xF+69TvGxJT+lnJpGrKxUuAZDLYXFhqnPEgnHz+psTpkpcB4QRjHj63+uj83KaeFJdTfW201eLZeRn6FfA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", + "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.1", - "@smithy/property-provider": "^2.0.12", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", "tslib": "^2.5.0" }, "engines": { @@ -1430,39 +1464,39 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.11.tgz", - "integrity": "sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", + "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.3.tgz", - "integrity": "sha512-0G9sePU+0R+8d7cie+OXzNbbkjnD4RfBlVCs46ZEuQAMcxK8OniemYXSSkOc80CCk8Il4DnlYZcUSvsIs2OB2w==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", + "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.7", - "@smithy/querystring-builder": "^2.0.11", - "@smithy/types": "^2.3.5", - "@smithy/util-base64": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.11.tgz", - "integrity": "sha512-PbleVugN2tbhl1ZoNWVrZ1oTFFas/Hq+s6zGO8B9bv4w/StTriTKA9W+xZJACOj9X7zwfoTLbscM+avCB1KqOQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", + "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -1470,12 +1504,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.11.tgz", - "integrity": "sha512-zazq99ujxYv/NOf9zh7xXbNgzoVLsqE0wle8P/1zU/XdhPi/0zohTPKWUzIxjGdqb5hkkwfBkNkl5H+LE0mvgw==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", + "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" } }, @@ -1492,13 +1526,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.13.tgz", - "integrity": "sha512-Md2kxWpaec3bXp1oERFPQPBhOXCkGSAF7uc1E+4rkwjgw3/tqAXRtbjbggu67HJdwaif76As8AV6XxbD1HzqTQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", + "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1506,17 +1540,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.1.tgz", - "integrity": "sha512-YAqGagBvHqDEew4EGz9BrQ7M+f+u7ck9EL4zzYirOhIcXeBS/+q4A5+ObHDDwEp38lD6t88YUtFy3OptqEaDQg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", + "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.11", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/shared-ini-file-loader": "^2.2.0", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-middleware": "^2.0.4", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-middleware": "^2.0.8", "tslib": "^2.5.0" }, "engines": { @@ -1524,17 +1558,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.16.tgz", - "integrity": "sha512-Br5+0yoiMS0ugiOAfJxregzMMGIRCbX4PYo1kDHtLgvkA/d++aHbnHB819m5zOIAMPvPE7AThZgcsoK+WOsUTA==", + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz", + "integrity": "sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.1", - "@smithy/protocol-http": "^3.0.7", - "@smithy/service-error-classification": "^2.0.4", - "@smithy/types": "^2.3.5", - "@smithy/util-middleware": "^2.0.4", - "@smithy/util-retry": "^2.0.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/protocol-http": "^3.0.11", + "@smithy/service-error-classification": "^2.0.8", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-retry": "^2.0.8", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -1552,12 +1587,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.11.tgz", - "integrity": "sha512-NuxnjMyf4zQqhwwdh0OTj5RqpnuT6HcH5Xg5GrPijPcKzc2REXVEVK4Yyk8ckj8ez1XSj/bCmJ+oNjmqB02GWA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", + "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1565,12 +1600,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.5.tgz", - "integrity": "sha512-bVQU/rZzBY7CbSxIrDTGZYnBWKtIw+PL/cRc9B7etZk1IKSOe0NvKMJyWllfhfhrTeMF6eleCzOihIQympAvPw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", + "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1578,14 +1613,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.1.tgz", - "integrity": "sha512-1lF6s1YWBi1LBu2O30tD3jyTgMtuvk/Z1twzXM4GPYe4dmZix4nNREPJIPOcfFikNU2o0eTYP80+izx5F2jIJA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", + "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.12", - "@smithy/shared-ini-file-loader": "^2.2.0", - "@smithy/types": "^2.3.5", + "@smithy/property-provider": "^2.0.16", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1593,15 +1628,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.7.tgz", - "integrity": "sha512-PQIKZXlp3awCDn/xNlCSTFE7aYG/5Tx33M05NfQmWYeB5yV1GZZOSz4dXpwiNJYTXb9jPqjl+ueXXkwtEluFFA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", + "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.11", - "@smithy/protocol-http": "^3.0.7", - "@smithy/querystring-builder": "^2.0.11", - "@smithy/types": "^2.3.5", + "@smithy/abort-controller": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1609,12 +1644,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.12.tgz", - "integrity": "sha512-Un/OvvuQ1Kg8WYtoMCicfsFFuHb/TKL3pCA6ZIo/WvNTJTR94RtoRnL7mY4XkkUAoFMyf6KjcQJ76y1FX7S5rw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", + "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1622,12 +1657,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.7.tgz", - "integrity": "sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", + "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1635,12 +1670,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.11.tgz", - "integrity": "sha512-b4kEbVMxpmfv2VWUITn2otckTi7GlMteZQxi+jlwedoATOGEyrCJPfRcYQJjbCi3fZ2QTfh3PcORvB27+j38Yg==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", + "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -1649,12 +1684,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.11.tgz", - "integrity": "sha512-YXe7jhi7s3dQ0Fu9dLoY/gLu6NCyy8tBWJL/v2c9i7/RLpHgKT+uT96/OqZkHizCJ4kr0ZD46tzMjql/o60KLg==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", + "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1662,24 +1697,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.4.tgz", - "integrity": "sha512-77506l12I5gxTZqBkx3Wb0RqMG81bMYLaVQ+EqIWFwQDJRs5UFeXogKxSKojCmz1wLUziHZQXm03MBzPQiumQw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", + "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5" + "@smithy/types": "^2.7.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.0.tgz", - "integrity": "sha512-xFXqs4vAb5BdkzHSRrTapFoaqS4/3m/CGZzdw46fBjYZ0paYuLAoMY60ICCn1FfGirG+PiJ3eWcqJNe4/SkfyA==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", + "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1687,18 +1722,18 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.11.tgz", - "integrity": "sha512-EFVU1dT+2s8xi227l1A9O27edT/GNKvyAK6lZnIZ0zhIHq/jSLznvkk15aonGAM1kmhmZBVGpI7Tt0odueZK9A==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.18.tgz", + "integrity": "sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.11", + "@smithy/eventstream-codec": "^2.0.15", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.4", + "@smithy/util-middleware": "^2.0.8", "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -1706,14 +1741,16 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.11.tgz", - "integrity": "sha512-okjMbuBBCTiieK665OFN/ap6u9+Z9z55PMphS5FYCsS6Zfp137Q3qlnt0OgBAnUVnH/mNGyoJV0LBX9gkTWptg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz", + "integrity": "sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q==", "optional": true, "dependencies": { - "@smithy/middleware-stack": "^2.0.5", - "@smithy/types": "^2.3.5", - "@smithy/util-stream": "^2.0.16", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", "tslib": "^2.5.0" }, "engines": { @@ -1721,9 +1758,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.5.tgz", - "integrity": "sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", + "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -1733,20 +1770,20 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.11.tgz", - "integrity": "sha512-h89yXMCCF+S5k9XIoKltMIWTYj+FcEkU/IIFZ6RtE222fskOTL4Iak6ZRG+ehSvZDt8yKEcxqheTDq7JvvtK3g==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", + "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.11", - "@smithy/types": "^2.3.5", + "@smithy/querystring-parser": "^2.0.15", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/util-base64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", - "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", "optional": true, "dependencies": { "@smithy/util-buffer-from": "^2.0.0", @@ -1757,9 +1794,9 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", + "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -1791,9 +1828,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.1.0.tgz", + "integrity": "sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -1803,14 +1840,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.15.tgz", - "integrity": "sha512-2raMZOYKSuke7QlDg/HDcxQdrp0zteJ8z+S0B9Rn23J55ZFNK1+IjG4HkN6vo/0u3Xy/JOdJ93ibiBSB8F7kOw==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz", + "integrity": "sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.12", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1819,23 +1856,37 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.19.tgz", - "integrity": "sha512-7pScU4jBFADB2MBYKM3zb5onMh6Nn0X3IfaFVLYPyCarTIZDLUtUl1GtruzEUJPmDzP+uGeqOtU589HDY0Ni6g==", + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.31.tgz", + "integrity": "sha512-ZwdjAJAFkkQQ4hdE8HOcxFAWC3GPFXQ3yQ8IBwHH5nQBlr9q+p5eRQ7Y8iRRORJe4vksR+NASRXZ+E81Us1aXQ==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.14", - "@smithy/credential-provider-imds": "^2.0.16", - "@smithy/node-config-provider": "^2.1.1", - "@smithy/property-provider": "^2.0.12", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", + "@smithy/config-resolver": "^2.0.22", + "@smithy/credential-provider-imds": "^2.1.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.2.0", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", + "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@smithy/util-hex-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", @@ -1849,12 +1900,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.4.tgz", - "integrity": "sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", + "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1862,13 +1913,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.4.tgz", - "integrity": "sha512-b+n1jBBKc77C1E/zfBe1Zo7S9OXGBiGn55N0apfhZHxPUP/fMH5AhFUUcWaJh7NAnah284M5lGkBKuhnr3yK5w==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", + "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", "optional": true, "dependencies": { - "@smithy/service-error-classification": "^2.0.4", - "@smithy/types": "^2.3.5", + "@smithy/service-error-classification": "^2.0.8", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -1876,18 +1927,18 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.16.tgz", - "integrity": "sha512-b5ZSRh1KzUzC7LoJcpfk7+iXGoRr3WylEfmPd4FnBLm90OwxSB9VgK1fDZwicfYxSEvWHdYXgvvjPtenEYBBhw==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", + "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/types": "^2.3.5", - "@smithy/util-base64": "^2.0.0", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -1907,9 +1958,9 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", - "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", "optional": true, "dependencies": { "@smithy/util-buffer-from": "^2.0.0", @@ -1932,17 +1983,17 @@ } }, "node_modules/@types/node": { - "version": "20.8.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", - "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/@types/webidl-conversions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.1.tgz", - "integrity": "sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", @@ -1953,6 +2004,12 @@ "@types/webidl-conversions": "*" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1979,9 +2036,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2084,9 +2141,9 @@ } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -2210,9 +2267,9 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -2477,9 +2534,9 @@ "dev": true }, "node_modules/bson": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.1.0.tgz", - "integrity": "sha512-yiQ3KxvpVoRpx1oD1uPz4Jit9tAVTJgjdmjDKtUErkOoL9VNoF8Dd58qtAOL5E40exx2jvAT9sqdRSK/r+SHlA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", "engines": { "node": ">=16.20.1" } @@ -2508,9 +2565,9 @@ } }, "node_modules/bullmq": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-4.12.4.tgz", - "integrity": "sha512-t+vMfvc2gVZUZWXd0jMh3vr5K83ZEfwwaiLW2HlL+W76ktWzOpwDqkWHmLwu98xylpPI1YcZ2WoGcqG6RsnKiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.1.1.tgz", + "integrity": "sha512-j3zbNEQWsyHjpqGWiem2XBfmxAjYcArbwsmGlkM1E9MAVcrqB5hQUsXmyy9gEBAdL+PVotMICr7xTquR4Y2sKQ==", "dependencies": { "cron-parser": "^4.6.0", "glob": "^8.0.3", @@ -2523,17 +2580,6 @@ "uuid": "^9.0.0" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/bytestreamjs": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", @@ -2600,12 +2646,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2634,32 +2681,32 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/cbor-extract": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.1.1.tgz", - "integrity": "sha512-1UX977+L+zOJHsp0mWFG13GLwO6ucKgSmSW6JTl8B9GUvACvHeIVpFqhU92299Z6PfD09aTXDell5p+lp1rUFA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", "hasInstallScript": true, "optional": true, "dependencies": { - "node-gyp-build-optional-packages": "5.0.3" + "node-gyp-build-optional-packages": "5.1.1" }, "bin": { "download-cbor-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@cbor-extract/cbor-extract-darwin-arm64": "2.1.1", - "@cbor-extract/cbor-extract-darwin-x64": "2.1.1", - "@cbor-extract/cbor-extract-linux-arm": "2.1.1", - "@cbor-extract/cbor-extract-linux-arm64": "2.1.1", - "@cbor-extract/cbor-extract-linux-x64": "2.1.1", - "@cbor-extract/cbor-extract-win32-x64": "2.1.1" + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" } }, "node_modules/cbor-x": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.5.4.tgz", - "integrity": "sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==", + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.5.7.tgz", + "integrity": "sha512-i6JEJLOXTK++wCpBI1EZUCE5tXxkA1N7Y0NZbPJ0XBcz0vRQlWESOhxb6EDST7SgP2uUf81UnB2Qv3VcxKvjoA==", "optionalDependencies": { - "cbor-extract": "^2.1.1" + "cbor-extract": "^2.2.0" } }, "node_modules/chai": { @@ -2840,10 +2887,13 @@ } }, "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -3019,33 +3069,33 @@ } }, "node_modules/csv": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.5.tgz", - "integrity": "sha512-Y+KTCAUljtq2JaGP42ZL1bymqlU5BkfnFpZhxRczGFDZox2VXhlRHnG5DRshyUrwQzmCdEiLjSqNldCfm1OVCA==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.6.tgz", + "integrity": "sha512-jsEsX2HhGp7xiwrJu5srQavKsh+HUJcCi78Ar3m4jlmFKRoTkkMy7ZZPP+LnQChmaztW+uj44oyfMb59daAs/Q==", "dependencies": { - "csv-generate": "^4.3.0", - "csv-parse": "^5.5.2", - "csv-stringify": "^6.4.4", - "stream-transform": "^3.2.10" + "csv-generate": "^4.3.1", + "csv-parse": "^5.5.3", + "csv-stringify": "^6.4.5", + "stream-transform": "^3.3.0" }, "engines": { "node": ">= 0.1.90" } }, "node_modules/csv-generate": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.3.0.tgz", - "integrity": "sha512-7KdVId/2RgwPIKfWHaHtjBq7I9mgdi8ICzsUyIhP8is6UwpwVGGSC/aPnrZ8/SkgBcCP20lXrdPuP64Irs1VBg==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.3.1.tgz", + "integrity": "sha512-7YeeJq+44/I/O5N2sr2qBMcHZXhpfe38eh7DOFxyMtYO+Pir7kIfgFkW5MPksqKqqR6+/wX7UGoZm1Ot11151w==" }, "node_modules/csv-parse": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.2.tgz", - "integrity": "sha512-YRVtvdtUNXZCMyK5zd5Wty1W6dNTpGKdqQd4EQ8tl/c6KW1aMBB1Kg1ppky5FONKmEqGJ/8WjLlTNLPne4ioVA==" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.3.tgz", + "integrity": "sha512-v0KW6C0qlZzoGjk6u5tLmVfyZxNgPGXZsWTXshpAgKVGmGXzaVWGdlCFxNx5iuzcXT/oJN1HHM9DZKwtAtYa+A==" }, "node_modules/csv-stringify": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.4.tgz", - "integrity": "sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==" + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.5.tgz", + "integrity": "sha512-SPu1Vnh8U5EnzpNOi1NDBL5jU5Rx7DVHr15DNg9LXDTAbQlAVAmEbVt16wZvEW9Fu9Qt4Ji8kmeCJ2B1+4rFTQ==" }, "node_modules/dashdash": { "version": "1.14.1", @@ -3152,6 +3202,19 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3199,6 +3262,15 @@ "node": ">=0.10.0" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -3666,18 +3738,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3726,9 +3799,9 @@ "dev": true }, "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -4071,17 +4144,17 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz", - "integrity": "sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", + "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } ], "dependencies": { @@ -4092,18 +4165,18 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fido2-lib": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/fido2-lib/-/fido2-lib-3.4.1.tgz", - "integrity": "sha512-efNrRbckp48AW7Q43o6gcp8/wnoBM7hwKikQntdiR2/NqVMPaCXFQs8kJ9wQqfv5V3PxZdg4kD9DpxdqYl6jxQ==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/fido2-lib/-/fido2-lib-3.4.4.tgz", + "integrity": "sha512-qbw/dauRg2lO8h3xt5KndTSUh/WgnZ8rf7km1jkaa3BQfqp8abthgMCr0FhnbOz8xCwvPC/CRw8pLYcT9yIqww==", "dependencies": { "@hexagon/base64": "~1.1.26", "@peculiar/webcrypto": "~1.4.3", @@ -4118,9 +4191,9 @@ } }, "node_modules/figlet": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.6.0.tgz", - "integrity": "sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", + "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", "dev": true, "bin": { "figlet": "bin/index.js" @@ -4265,9 +4338,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -4275,7 +4348,7 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -4285,9 +4358,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -4438,9 +4511,9 @@ } }, "node_modules/generate-password": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/generate-password/-/generate-password-1.7.0.tgz", - "integrity": "sha512-WPCtlfy0jexf7W5IbwxGUgpIDvsZIohbI2DAq2Q6TSlKKis+G4GT9sxvPxrZUGL8kP6WUXMWNqYnxY6DDKAdFA==" + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/generate-password/-/generate-password-1.7.1.tgz", + "integrity": "sha512-9bVYY+16m7W7GczRBDqXE+VVuCX+bWNrfYKC/2p2JkZukFb2sKxT6E3zZ3mJGz7GMe5iRK0A/WawSL3jQfJuNQ==" }, "node_modules/get-caller-file": { "version": "2.0.5", @@ -4460,14 +4533,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4627,9 +4700,9 @@ } }, "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4641,6 +4714,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -4949,9 +5033,9 @@ } }, "node_modules/grunt-legacy-util/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, "node_modules/grunt-mocha-test": { @@ -5124,14 +5208,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -5162,6 +5238,17 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", @@ -5199,9 +5286,20 @@ } }, "node_modules/hash-wasm": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.10.0.tgz", - "integrity": "sha512-a0NjBNWjavvMalm/pPSEJ00MPDjRG8rv9D5BK7dBQTLGwAOVWqnTEUggaYs5szATB5UK5ULeIQr7QJXbczAZYA==" + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.11.0.tgz", + "integrity": "sha512-HVusNXlVqHe0fzIzdQOGolnFN6mX/fqcrSAOcTBXdvzrXVHwTz11vXeKRmkR5gTuwVpvHZEIyKoePDvuAR+XwQ==" + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/he": { "version": "1.2.0", @@ -5407,18 +5505,18 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/imapflow": { - "version": "1.0.144", - "resolved": "https://registry.npmjs.org/imapflow/-/imapflow-1.0.144.tgz", - "integrity": "sha512-pJENOyIn3oaJwtMbIty4cYcxguNR4oWz+izTo267jcLOpBXrjwnQG2jU7+yEDESxaPazVXlcbr/5ZzBRglT51Q==", + "version": "1.0.147", + "resolved": "https://registry.npmjs.org/imapflow/-/imapflow-1.0.147.tgz", + "integrity": "sha512-ICMPIkgQ0ysrjj4uQyz6JN8e4hUFpDMZJaNHvRW52uZCTIEGDNmH6IoIAfsdErwsn5z/1g+86e7v/n09A/0XmA==", "dev": true, "dependencies": { "encoding-japanese": "2.0.0", @@ -5427,15 +5525,15 @@ "libmime": "5.2.1", "libqp": "2.0.1", "mailsplit": "5.4.0", - "nodemailer": "6.9.5", - "pino": "8.15.1", + "nodemailer": "6.9.7", + "pino": "8.16.1", "socks": "2.7.1" } }, "node_modules/imapflow/node_modules/nodemailer": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", - "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", + "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", "dev": true, "engines": { "node": ">=6.0.0" @@ -5611,12 +5709,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6257,27 +6355,27 @@ } }, "node_modules/luxon": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", - "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } }, "node_modules/mailauth": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/mailauth/-/mailauth-4.5.2.tgz", - "integrity": "sha512-6gBaJpYZZviI4OM51pZPLDZ3Tc9U0ENIbhNtR4ZkKCKHi11oiVKJLZek0R5m7Z2TieF+xkOpy3uz56vuxsXqdQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/mailauth/-/mailauth-4.6.0.tgz", + "integrity": "sha512-NI6wkVKm1xA/RmWCDSgLD3719Cxc0czJLV2dIFL2GzLF8ASswABV9CZdB9qArYiF/3nfKHZFCBr79Iq2IWh8iw==", "dependencies": { "@postalsys/vmc": "1.0.6", - "fast-xml-parser": "4.2.7", + "fast-xml-parser": "4.3.2", "ipaddr.js": "2.1.0", - "joi": "17.9.2", + "joi": "17.11.0", "libmime": "5.2.1", - "nodemailer": "6.9.4", + "nodemailer": "6.9.7", "psl": "1.9.0", - "punycode": "2.3.0", - "undici": "5.23.0", + "punycode": "2.3.1", + "undici": "5.27.0", "yargs": "17.7.2" }, "bin": { @@ -6287,32 +6385,20 @@ "node": ">=16.0.0" } }, - "node_modules/mailauth/node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, "node_modules/mailauth/node_modules/nodemailer": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", - "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", + "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", "engines": { "node": ">=6.0.0" } }, "node_modules/mailauth/node_modules/undici": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", - "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.0.tgz", + "integrity": "sha512-l3ydWhlhOJzMVOYkymLykcRRXqbUaQriERtR70B9LzNkZ4bX52Fc8wbTDneMiwo8T+AemZXvXaTx+9o5ROxrXg==", "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" @@ -6428,9 +6514,9 @@ } }, "node_modules/medium-zoom": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.8.tgz", - "integrity": "sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", + "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", "dev": true }, "node_modules/memory-pager": { @@ -6733,9 +6819,9 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } @@ -6841,9 +6927,9 @@ } }, "node_modules/mongodb-extended-json/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/mongodb-extended-json/node_modules/bson": { "version": "1.1.6", @@ -6940,9 +7026,9 @@ } }, "node_modules/msgpackr": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.9.tgz", - "integrity": "sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.1.tgz", + "integrity": "sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==", "optionalDependencies": { "msgpackr-extract": "^3.0.2" } @@ -7053,6 +7139,14 @@ "node": ">=6.0.0" } }, + "node_modules/mx-connect/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, "node_modules/mx-connect/node_modules/yargs": { "version": "17.7.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", @@ -7177,10 +7271,13 @@ } }, "node_modules/node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", @@ -7188,18 +7285,18 @@ } }, "node_modules/node-html-parser": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.10.tgz", - "integrity": "sha512-6/uWdWxjQWQ7tMcFK2wWlrflsQUzh1HsEzlIf2j5+TtzfhT2yUvg3DwZYAmjEHeR3uX74ko7exjHW69J0tOzIg==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz", + "integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==", "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "node_modules/nodemailer": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.6.tgz", - "integrity": "sha512-s7pDtWwe5fLMkQUhw8TkWB/wnZ7SRdd9HRZslq/s24hlZvBP3j32N/ETLmnqTpmj4xoBZL9fOWyCIZ7r2HORHg==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", + "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==", "engines": { "node": ">=6.0.0" } @@ -7273,9 +7370,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7390,9 +7487,9 @@ } }, "node_modules/openpgp": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.10.2.tgz", - "integrity": "sha512-nRqMp4o31rBagWB02tgfKCsocXWq4uYobZf9GDVlD5rQXBq/wRIZHiDhGX1dlDAI2inkZcPd2dSZOqmtGnsK1A==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.11.0.tgz", + "integrity": "sha512-hytHsxIPtRhuh6uAmoBUThHSwHSX3imLu7x4453T+xkVqIw49rl22MRD4KQIAQdCDoVdouejzYgcuLmMA/2OAA==", "dependencies": { "asn1.js": "^5.0.0" }, @@ -7744,9 +7841,9 @@ } }, "node_modules/pino": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.15.1.tgz", - "integrity": "sha512-Cp4QzUQrvWCRJaQ8Lzv0mJzXVk4z2jlq8JNKMGaixC2Pz5L4l2p95TkuRvYbrEbe85NQsDKrAd4zalf7Ml6WiA==", + "version": "8.16.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.1.tgz", + "integrity": "sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -7757,7 +7854,7 @@ "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", + "sonic-boom": "^3.7.0", "thread-stream": "^2.0.0" }, "bin": { @@ -7774,9 +7871,9 @@ } }, "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -7870,9 +7967,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", + "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==" }, "node_modules/projection-utils": { "version": "1.1.0", @@ -7912,9 +8009,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -8488,13 +8585,13 @@ } }, "node_modules/restify/node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "sshpk": "^1.18.0" }, "engines": { "node": ">=0.10" @@ -8838,6 +8935,20 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -9031,9 +9142,9 @@ "integrity": "sha512-4KAl/FUDqHm4En4cwtNKHSXCztmqkEstGkFs0yofQ5NkC6zK8C3cSuIFmK/aswsCfx+IBlM1uwYFuYE7UT80Rw==" }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -9083,17 +9194,9 @@ } }, "node_modules/stream-transform": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.2.10.tgz", - "integrity": "sha512-Yu+x7zcWbWdyB0Td8dFzHt2JEyD6694CNq2lqh1rbuEBVxPtjb/GZ7xDnZcdYiU5E/RtufM54ClSEOzZDeWguA==" - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.3.0.tgz", + "integrity": "sha512-pG1NeDdmErNYKtvTpFayrEueAmL0xVU5wd22V7InGnatl4Ocq3HY7dcXIKj629kXvYQvglCC7CeDIGAlx1RNGA==" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -9314,20 +9417,20 @@ } }, "node_modules/tldts": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.0.16.tgz", - "integrity": "sha512-TkEq38COU640mzOKPk4D1oH3FFVvwEtMaKIfw/+F/umVsy7ONWu8PPQH0c11qJ/Jq/zbcQGprXGsT8GcaDSmJg==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.0.23.tgz", + "integrity": "sha512-LaA60X7J9mts1EliB7Nq/OBqicaI7TgsheWeQ8RR1uqwcVLjvRVHTGOkWjKAPa/XF+0t2ZBy1oF6OW8ufqOsKA==", "dependencies": { - "tldts-core": "^6.0.16" + "tldts-core": "^6.0.23" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.0.16.tgz", - "integrity": "sha512-/ypKV6FdiDpXnVEUmPy9s5xfoSAyNPvj1r6V/3FqQBWi0ay3asObLX4Hn8eLwkHB0+VEr2bneu3CnX4uT3fO0w==" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.1.tgz", + "integrity": "sha512-xBHFfOO2YmEwogupGTKR0IBXe1IJe1/GleNeXpO294Fk90aQSvrop41BKA66CkfNLVOuomJDZ304KxwovT04Vw==" }, "node_modules/to-readable-stream": { "version": "1.0.0", @@ -9517,9 +9620,9 @@ } }, "node_modules/undici": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", - "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -9528,9 +9631,9 @@ } }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unique-string": { "version": "2.0.0", @@ -9772,13 +9875,13 @@ } }, "node_modules/webcrypto-core/node_modules/@peculiar/asn1-schema": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", - "integrity": "sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", + "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", "dependencies": { "asn1js": "^3.0.5", - "pvtsutils": "^1.3.2", - "tslib": "^2.4.0" + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" } }, "node_modules/webidl-conversions": { @@ -10174,9 +10277,9 @@ } }, "node_modules/zone-mta": { - "version": "3.6.13", - "resolved": "https://registry.npmjs.org/zone-mta/-/zone-mta-3.6.13.tgz", - "integrity": "sha512-we+vhQeXw1S7CzerErqHy9nj8XxTzV08/KCvFeORabe74wGRdQSZs7Y0RmQBpuyODQSO2nbeCY4uVyCKvJSYaQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/zone-mta/-/zone-mta-3.7.0.tgz", + "integrity": "sha512-5k/wWxM+egeVE7mhfOvjgZxzu9hWk1LCG28B2jz2N3VV2wo2pu+qNO18PUaZYFhn4TH9/Vyo0ph0kUYVC9/1ZA==", "dependencies": { "base32.js": "0.1.0", "crc-32": "1.2.2", @@ -10191,10 +10294,10 @@ "mongodb": "4.17.0", "msgpack-js": "0.3.0", "mx-connect": "1.4.4", - "nodemailer": "6.9.6", + "nodemailer": "6.9.7", "npmlog": "7.0.1", "prom-client": "15.0.0", - "punycode": "2.3.0", + "punycode": "2.3.1", "request": "2.88.2", "restify": "11.1.0", "seq-index": "1.1.0", @@ -10209,6 +10312,14 @@ "engines": { "node": ">=16.0.0" } + }, + "node_modules/zone-mta/node_modules/nodemailer": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", + "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", + "engines": { + "node": ">=6.0.0" + } } } } diff --git a/package.json b/package.json index 368e6770..2d863309 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,18 @@ { "name": "wildduck", - "version": "1.40.10", + "version": "1.41.3", "description": "IMAP/POP3 server built with Node.js and MongoDB", "main": "server.js", "scripts": { "test": "mongo --eval 'db.dropDatabase()' wildduck-test && redis-cli -n 13 flushdb && npm run runtest", + "test:proto": "NODE_ENV=test grunt proto", "printconf": "NODE_CONFIG_ONLY=true npm start", "runtest": "NODE_ENV=test grunt", "runci": "npm run printconf && npm run runtest", "apidoc": "apidoc -i lib/api/ -o docs/api/", "show": "NODE_CONFIG_ONLY=true node server.js", - "start": "node server.js" + "start": "node server.js", + "update": "rm -rf node_modules package-lock.json && ncu -u && npm install" }, "keywords": [ "imap", @@ -26,16 +28,16 @@ "ajv": "8.12.0", "chai": "4.3.10", "docsify-cli": "4.4.4", - "eslint": "8.51.0", + "eslint": "8.56.0", "eslint-config-nodemailer": "1.2.0", - "eslint-config-prettier": "9.0.0", + "eslint-config-prettier": "9.1.0", "grunt": "1.6.1", "grunt-cli": "1.4.3", "grunt-eslint": "24.3.0", "grunt-mocha-test": "0.13.3", "grunt-shell-spawn": "0.4.0", "grunt-wait": "0.3.0", - "imapflow": "1.0.144", + "imapflow": "1.0.147", "mailparser": "3.6.5", "mocha": "10.2.0", "request": "2.88.2", @@ -49,15 +51,15 @@ "@root/acme": "3.1.0", "@root/csr": "0.8.1", "accesscontrol": "2.2.1", - "axios": "1.5.1", + "axios": "1.6.3", "base32.js": "0.1.0", "bcryptjs": "2.4.3", - "bson": "6.1.0", - "bullmq": "4.12.4", - "fido2-lib": "3.4.1", + "bson": "6.2.0", + "bullmq": "5.1.1", + "fido2-lib": "3.4.4", "gelf": "2.0.1", - "generate-password": "1.7.0", - "hash-wasm": "4.10.0", + "generate-password": "1.7.1", + "hash-wasm": "4.11.0", "he": "1.2.0", "html-to-text": "9.0.5", "humanname": "0.2.2", @@ -73,7 +75,7 @@ "libmime": "5.2.1", "libqp": "2.0.1", "logic-query-parser": "0.0.5", - "mailauth": "4.5.2", + "mailauth": "4.6.0", "mailsplit": "5.4.0", "mobileconfig": "2.4.0", "mongo-cursor-pagination": "8.1.3", @@ -81,12 +83,12 @@ "mongodb-extended-json": "1.11.1", "msgpack5": "6.0.2", "node-forge": "1.3.1", - "node-html-parser": "6.1.10", - "nodemailer": "6.9.6", + "node-html-parser": "6.1.12", + "nodemailer": "6.9.8", "npmlog": "7.0.1", - "openpgp": "5.10.2", + "openpgp": "5.11.0", "pem-jwk": "2.0.0", - "punycode": "2.3.0", + "punycode": "2.3.1", "pwnedpasswords": "1.0.6", "qrcode": "1.5.3", "restify": "11.1.0", @@ -97,13 +99,13 @@ "seq-index": "1.1.0", "smtp-server": "3.13.0", "speakeasy": "2.0.0", - "undici": "5.26.3", + "undici": "5.28.2", "unix-crypt-td-js": "1.1.4", "unixcrypt": "1.2.0", "uuid": "9.0.1", "wild-config": "1.7.1", "yargs": "17.7.2", - "zone-mta": "3.6.13" + "zone-mta": "3.7.0" }, "repository": { "type": "git", diff --git a/public/public/config.html b/public/public/config.html index a901d3a2..e545955f 100644 --- a/public/public/config.html +++ b/public/public/config.html @@ -191,8 +191,18 @@ if (setting.default) { let defaultTextElm = document.createElement('code'); - defaultTextElm.textContent = formatNumber(setting.default, setting.type); - defaultTdElm.title = setting.description; + + let formattedValue = formatNumber(setting.default, setting.type); + let settingTitle = setting.description; + + if (typeof formattedValue !== 'string' || formattedValue.length < 12) { + defaultTextElm.textContent = formattedValue; + } else { + defaultTextElm.textContent = formattedValue.substr(0, 8) + '…'; + settingTitle += '\nDefault: "' + formattedValue + '"'; + } + + defaultTdElm.title = settingTitle; defaultTdElm.appendChild(defaultTextElm); } else { defaultTdElm.textContent = ' '; diff --git a/setup/01_install_commits.sh b/setup/01_install_commits.sh index 99677dd1..3f1b3a84 100755 --- a/setup/01_install_commits.sh +++ b/setup/01_install_commits.sh @@ -3,17 +3,17 @@ OURNAME=01_install_commits.sh apt-get update -apt-get install -y lsb-release curl gnupg +apt-get install -y lsb-release ca-certificates curl gnupg -NODEREPO="node_20.x" +NODE_MAJOR="20" MONGODB="7.0" CODENAME=`lsb_release -c -s` -WILDDUCK_COMMIT="38d80e49b2c4502aa7c873de6c2acdc2986835ce" -ZONEMTA_COMMIT="f6397a69e8d2f3b69bd4cfe7477c3086e8926762" # zone-mta-template -WEBMAIL_COMMIT="6e89e0e926798bfd04bc47f605df76129c067ac9" -WILDDUCK_ZONEMTA_COMMIT="4f46298b03ddf0120981b58e11357b88aaffb249" -WILDDUCK_HARAKA_COMMIT="7778d141cb1ca4e8cacfff7d7f50639d68feede5" +WILDDUCK_COMMIT="cd3d52959e654af0e1cb56b612a2d4886f28e777" +ZONEMTA_COMMIT="0037bcd93c5147426c13a57794037f08840929ee" # zone-mta-template +WEBMAIL_COMMIT="40ee1ef973de33de5bdf3e6b7e877d156d87436a" +WILDDUCK_ZONEMTA_COMMIT="c9c50892f805f6871532a0f5329c0bcbb02e2c43" +WILDDUCK_HARAKA_COMMIT="ca3ac7626fc4f3db1587049bc4b1d1a1213cfd23" HARAKA_VERSION="3.0.2" echo -e "\n-- Executing ${ORANGE}${OURNAME}${NC} subscript --" diff --git a/setup/04_install_import_keys.sh b/setup/04_install_import_keys.sh index c206cccd..63a995be 100755 --- a/setup/04_install_import_keys.sh +++ b/setup/04_install_import_keys.sh @@ -23,12 +23,12 @@ export DEBIAN_FRONTEND=noninteractive keyring="/usr/share/keyrings" # nodejs -node_key_url="https://deb.nodesource.com/gpgkey/nodesource.gpg.key" +node_key_url="https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" local_node_key="${keyring}/nodesource.gpg" curl -fsSL $node_key_url | gpg --dearmor | tee $local_node_key >/dev/null -echo "deb [signed-by=${local_node_key}] https://deb.nodesource.com/$NODEREPO $CODENAME main" > /etc/apt/sources.list.d/nodesource.list -echo "deb-src [signed-by=${local_node_key}] https://deb.nodesource.com/$NODEREPO $CODENAME main" >> /etc/apt/sources.list.d/nodesource.list +echo "deb [signed-by=${local_node_key}] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" > /etc/apt/sources.list.d/nodesource.list +echo "deb-src [signed-by=${local_node_key}] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" >> /etc/apt/sources.list.d/nodesource.list # mongodb mongo_key_url="https://pgp.mongodb.com/server-${MONGODB}.asc"