emailengine-app 2.61.5 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/data/google-crawlers.json +1 -1
  3. package/lib/account.js +20 -7
  4. package/lib/api-routes/account-routes.js +28 -5
  5. package/lib/api-routes/chat-routes.js +1 -1
  6. package/lib/api-routes/export-routes.js +316 -0
  7. package/lib/api-routes/message-routes.js +28 -23
  8. package/lib/api-routes/template-routes.js +28 -7
  9. package/lib/arf-detect.js +1 -1
  10. package/lib/consts.js +16 -0
  11. package/lib/db.js +3 -0
  12. package/lib/email-client/base-client.js +6 -4
  13. package/lib/email-client/gmail-client.js +204 -33
  14. package/lib/email-client/imap/mailbox.js +99 -8
  15. package/lib/email-client/imap/subconnection.js +5 -5
  16. package/lib/email-client/imap-client.js +76 -16
  17. package/lib/email-client/message-builder.js +3 -1
  18. package/lib/email-client/notification-handler.js +12 -9
  19. package/lib/email-client/outlook-client.js +362 -69
  20. package/lib/email-client/smtp-pool-manager.js +1 -1
  21. package/lib/export.js +528 -0
  22. package/lib/oauth/gmail.js +21 -13
  23. package/lib/oauth/mail-ru.js +23 -10
  24. package/lib/oauth/outlook.js +26 -16
  25. package/lib/oauth/pubsub/google.js +5 -0
  26. package/lib/routes-ui.js +235 -1
  27. package/lib/schemas.js +260 -80
  28. package/lib/stream-encrypt.js +263 -0
  29. package/lib/tools.js +30 -4
  30. package/lib/ui-routes/account-routes.js +23 -0
  31. package/lib/ui-routes/admin-config-routes.js +11 -4
  32. package/lib/ui-routes/admin-entities-routes.js +18 -0
  33. package/lib/webhooks.js +16 -20
  34. package/package.json +16 -16
  35. package/sbom.json +1 -1
  36. package/server.js +41 -5
  37. package/static/js/ace/ace.js +1 -1
  38. package/static/js/ace/ext-language_tools.js +1 -1
  39. package/static/licenses.html +52 -62
  40. package/translations/de.mo +0 -0
  41. package/translations/de.po +63 -36
  42. package/translations/en.mo +0 -0
  43. package/translations/en.po +64 -37
  44. package/translations/et.mo +0 -0
  45. package/translations/et.po +63 -36
  46. package/translations/fr.mo +0 -0
  47. package/translations/fr.po +63 -36
  48. package/translations/ja.mo +0 -0
  49. package/translations/ja.po +63 -36
  50. package/translations/messages.pot +80 -47
  51. package/translations/nl.mo +0 -0
  52. package/translations/nl.po +63 -36
  53. package/translations/pl.mo +0 -0
  54. package/translations/pl.po +63 -36
  55. package/views/accounts/account.hbs +375 -2
  56. package/views/config/service.hbs +35 -0
  57. package/workers/api.js +123 -44
  58. package/workers/documents.js +1 -0
  59. package/workers/export.js +926 -0
  60. package/workers/imap.js +29 -0
  61. package/workers/submit.js +25 -5
  62. package/workers/webhooks.js +11 -2
package/workers/api.js CHANGED
@@ -132,6 +132,7 @@ const chatRoutes = require('../lib/api-routes/chat-routes');
132
132
  const bullBoardRoutes = require('../lib/api-routes/bull-board-routes');
133
133
  const accountRoutes = require('../lib/api-routes/account-routes');
134
134
  const messageRoutes = require('../lib/api-routes/message-routes');
135
+ const exportRoutes = require('../lib/api-routes/export-routes');
135
136
 
136
137
  const {
137
138
  settingsSchema,
@@ -174,7 +175,8 @@ const AccountTypeSchema = Joi.string()
174
175
  .valid(...['imap'].concat(Object.keys(OAUTH_PROVIDERS)).concat('oauth2'))
175
176
  .example('outlook')
176
177
  .description('Account type')
177
- .required();
178
+ .required()
179
+ .label('AccountType');
178
180
 
179
181
  const SUPPORTED_LOCALES = locales.map(locale => locale.locale);
180
182
 
@@ -289,7 +291,7 @@ class ResponseStream extends Transform {
289
291
  this._finalized = false;
290
292
 
291
293
  // Ensure cleanup on all stream end scenarios
292
- this.once('error', () => this.finalize());
294
+ this.on('error', () => this.finalize());
293
295
  this.once('close', () => this.finalize());
294
296
  this.once('end', () => this.finalize());
295
297
  }
@@ -297,6 +299,7 @@ class ResponseStream extends Transform {
297
299
  updateTimer() {
298
300
  clearTimeout(this.periodicKeepAliveTimer);
299
301
  this.periodicKeepAliveTimer = setTimeout(() => {
302
+ if (this._finalized || this.destroyed) return;
300
303
  this.write(': still here\n\n');
301
304
  if (this._compressor) {
302
305
  this._compressor.flush();
@@ -311,6 +314,7 @@ class ResponseStream extends Transform {
311
314
  }
312
315
 
313
316
  sendMessage(payload) {
317
+ if (this._finalized || this.destroyed) return;
314
318
  let sendData = JSON.stringify(payload);
315
319
  this.write('event: message\ndata:' + sendData + '\n\n');
316
320
  if (this._compressor) {
@@ -325,6 +329,10 @@ class ResponseStream extends Transform {
325
329
 
326
330
  clearTimeout(this.periodicKeepAliveTimer);
327
331
  registeredPublishers.delete(this);
332
+
333
+ if (!this.destroyed) {
334
+ this.destroy();
335
+ }
328
336
  }
329
337
 
330
338
  _transform(data, encoding, done) {
@@ -914,6 +922,8 @@ Include your token in requests using one of these methods:
914
922
 
915
923
  security: [{ bearerAuth: [] }],
916
924
 
925
+ definitionPrefix: 'useLabel',
926
+
917
927
  cors: !!CORS_CONFIG,
918
928
  cache: {
919
929
  expiresIn: 7 * 24 * 60 * 60 * 1000
@@ -1008,6 +1018,11 @@ Include your token in requests using one of these methods:
1008
1018
  {
1009
1019
  name: 'Multi Message Actions',
1010
1020
  description: 'Perform bulk operations on multiple messages simultaneously, such as marking as read, moving, or deleting'
1021
+ },
1022
+ {
1023
+ name: 'Export (Beta)',
1024
+ description:
1025
+ 'Bulk export messages from email accounts. This feature is in beta and the API may change in future releases. Export files are encrypted at rest when a service secret is configured.'
1011
1026
  }
1012
1027
  ],
1013
1028
 
@@ -2027,10 +2042,10 @@ Include your token in requests using one of these methods:
2027
2042
  }
2028
2043
 
2029
2044
  // Validate nonce format: 16 bytes base64url encoded = 21-22 characters
2045
+ // Also accept base64 encoding (+, /, =) for backward compatibility with old cached nonces
2030
2046
  const stateNonce = request.query.state.slice('account:add:'.length);
2031
- if (!/^[A-Za-z0-9_-]{21,22}$/.test(stateNonce)) {
2032
- let error = Boom.boomify(new Error(`Oauth failed: invalid state format`), { statusCode: 400 });
2033
- throw error;
2047
+ if (!/^[A-Za-z0-9_\-+/]{21,22}={0,2}$/.test(stateNonce)) {
2048
+ throw Boom.badRequest('Oauth failed: invalid state format');
2034
2049
  }
2035
2050
 
2036
2051
  let [[, accountData]] = await redis.multi().get(`${REDIS_PREFIX}${request.query.state}`).del(`${REDIS_PREFIX}${request.query.state}`).exec();
@@ -3314,7 +3329,7 @@ Include your token in requests using one of these methods:
3314
3329
 
3315
3330
  envelope: Joi.object({
3316
3331
  from: Joi.string().email().allow('').example('sender@example.com'),
3317
- to: Joi.array().items(Joi.string().email().required().example('recipient@example.com')).single()
3332
+ to: Joi.array().items(Joi.string().email().required().example('recipient@example.com')).single().label('SmtpEnvelopeTo')
3318
3333
  })
3319
3334
  .description(
3320
3335
  "An optional object specifying the SMTP envelope used during email transmission. If not provided, the envelope is automatically derived from the email's message headers. This is useful when you need the envelope addresses to differ from those in the email headers."
@@ -3386,7 +3401,11 @@ Include your token in requests using one of these methods:
3386
3401
  template: Joi.string().max(256).example('example').description('Stored template ID to load the email content from'),
3387
3402
 
3388
3403
  render: Joi.object({
3389
- format: Joi.string().valid('html', 'markdown').default('html').description('Markup language for HTML ("html" or "markdown")'),
3404
+ format: Joi.string()
3405
+ .valid('html', 'markdown')
3406
+ .default('html')
3407
+ .description('Markup language for HTML ("html" or "markdown")')
3408
+ .label('RenderFormat'),
3390
3409
  params: Joi.object().label('RenderValues').description('An object of variables for the template renderer')
3391
3410
  })
3392
3411
  .allow(false)
@@ -3432,9 +3451,9 @@ Include your token in requests using one of these methods:
3432
3451
  }),
3433
3452
 
3434
3453
  contentType: Joi.string().lowercase().max(256).example('image/gif'),
3435
- contentDisposition: Joi.string().lowercase().valid('inline', 'attachment'),
3454
+ contentDisposition: Joi.string().lowercase().valid('inline', 'attachment').label('AttachmentContentDisposition'),
3436
3455
  cid: Joi.string().max(256).example('unique-image-id@localhost').description('Content-ID value for embedded images'),
3437
- encoding: Joi.string().valid('base64').default('base64'),
3456
+ encoding: Joi.string().valid('base64').default('base64').label('AttachmentEncoding'),
3438
3457
 
3439
3458
  reference: Joi.string()
3440
3459
  .base64({ paddingRequired: false, urlSafe: true })
@@ -3444,6 +3463,7 @@ Include your token in requests using one of these methods:
3444
3463
  .description(
3445
3464
  'References an existing attachment by its ID instead of providing new attachment content. If this field is set, the `content` field must not be included. If not set, the `content` field is required.'
3446
3465
  )
3466
+ .label('AttachmentReference')
3447
3467
  }).label('UploadAttachment')
3448
3468
  )
3449
3469
  .description('List of attachments')
@@ -3475,7 +3495,7 @@ Include your token in requests using one of these methods:
3475
3495
  .example('Sent Mail')
3476
3496
  .description("Upload sent message to this folder. By default the account's Sent Mail folder is used."),
3477
3497
 
3478
- locale: Joi.string().empty('').max(100).example('fr').description('Optional locale'),
3498
+ locale: Joi.string().empty('').max(100).example('fr').description('Optional locale').label('MessageLocale'),
3479
3499
  tz: Joi.string().empty('').max(100).example('Europe/Tallinn').description('Optional timezone'),
3480
3500
 
3481
3501
  sendAt: Joi.date().iso().example('2021-07-08T07:06:34.336Z').description('Send message at specified time'),
@@ -3483,7 +3503,7 @@ Include your token in requests using one of these methods:
3483
3503
  .integer()
3484
3504
  .example(10)
3485
3505
  .description('How many delivery attempts to make until message is considered as failed'),
3486
- gateway: Joi.string().max(256).example('example').description('Optional SMTP gateway ID for message routing'),
3506
+ gateway: Joi.string().max(256).example('example').description('Optional SMTP gateway ID for message routing').label('MessageGateway'),
3487
3507
 
3488
3508
  listId: Joi.string()
3489
3509
  .hostname()
@@ -3505,11 +3525,13 @@ Include your token in requests using one of these methods:
3505
3525
  .empty('')
3506
3526
  .valid('headers', 'full')
3507
3527
  .required()
3508
- .description('Specifies if only headers or the entire body of the message should be included in the response (RET)'),
3528
+ .description('Specifies if only headers or the entire body of the message should be included in the response (RET)')
3529
+ .label('DsnReturn'),
3509
3530
  notify: Joi.array()
3510
3531
  .single()
3511
3532
  .items(Joi.string().valid('never', 'success', 'failure', 'delay').label('NotifyEntry'))
3512
- .description('Defines the conditions under which a DSN response should be sent'),
3533
+ .description('Defines the conditions under which a DSN response should be sent')
3534
+ .label('DsnNotify'),
3513
3535
  recipient: Joi.string().trim().empty('').email().description('The email address the DSN should be sent (ORCPT)')
3514
3536
  })
3515
3537
  .description('Request DSN notifications')
@@ -3636,7 +3658,9 @@ Include your token in requests using one of these methods:
3636
3658
  skipped: Joi.object({
3637
3659
  reason: Joi.string().example('unsubscribe').description('Why this message was skipped'),
3638
3660
  listId: Joi.string().example('test-list')
3639
- }).description('Info about skipped message. If this value is set, then the message was not sent')
3661
+ })
3662
+ .description('Info about skipped message. If this value is set, then the message was not sent')
3663
+ .label('SkippedMessageInfo')
3640
3664
  })
3641
3665
  .label('BulkResponseEntry')
3642
3666
  .example({
@@ -3856,13 +3880,27 @@ Include your token in requests using one of these methods:
3856
3880
  failAction,
3857
3881
 
3858
3882
  params: Joi.object({
3859
- queue: Joi.string().empty('').trim().valid('notify', 'submit', 'documents').required().example('notify').description('Queue ID')
3883
+ queue: Joi.string()
3884
+ .empty('')
3885
+ .trim()
3886
+ .valid('notify', 'submit', 'documents')
3887
+ .required()
3888
+ .example('notify')
3889
+ .description('Queue ID')
3890
+ .label('QueueId')
3860
3891
  })
3861
3892
  },
3862
3893
 
3863
3894
  response: {
3864
3895
  schema: Joi.object({
3865
- queue: Joi.string().empty('').trim().valid('notify', 'submit', 'documents').required().example('notify').description('Queue ID'),
3896
+ queue: Joi.string()
3897
+ .empty('')
3898
+ .trim()
3899
+ .valid('notify', 'submit', 'documents')
3900
+ .required()
3901
+ .example('notify')
3902
+ .description('Queue ID')
3903
+ .label('QueueIdResponse'),
3866
3904
  jobs: Joi.object({
3867
3905
  active: Joi.number().integer().example(123).description('Jobs that are currently being processed'),
3868
3906
  delayed: Joi.number().integer().example(123).description('Jobs that are processed in the future'),
@@ -3946,7 +3984,14 @@ Include your token in requests using one of these methods:
3946
3984
  failAction,
3947
3985
 
3948
3986
  params: Joi.object({
3949
- queue: Joi.string().empty('').trim().valid('notify', 'submit', 'documents').required().example('notify').description('Queue ID')
3987
+ queue: Joi.string()
3988
+ .empty('')
3989
+ .trim()
3990
+ .valid('notify', 'submit', 'documents')
3991
+ .required()
3992
+ .example('notify')
3993
+ .description('Queue ID')
3994
+ .label('QueueIdParam')
3950
3995
  }),
3951
3996
 
3952
3997
  payload: Joi.object({
@@ -3956,7 +4001,14 @@ Include your token in requests using one of these methods:
3956
4001
 
3957
4002
  response: {
3958
4003
  schema: Joi.object({
3959
- queue: Joi.string().empty('').trim().valid('notify', 'submit', 'documents').required().example('notify').description('Queue ID'),
4004
+ queue: Joi.string()
4005
+ .empty('')
4006
+ .trim()
4007
+ .valid('notify', 'submit', 'documents')
4008
+ .required()
4009
+ .example('notify')
4010
+ .description('Queue ID')
4011
+ .label('QueueIdPutResponse'),
3960
4012
  paused: Joi.boolean().example(false).description('Is the queue paused or not')
3961
4013
  }).label('SettingsPutQueueResponse'),
3962
4014
  failAction: 'log'
@@ -4108,7 +4160,7 @@ Include your token in requests using one of these methods:
4108
4160
  failAction,
4109
4161
 
4110
4162
  payload: Joi.object({
4111
- mailboxes: Joi.boolean().example(false).description('Include mailbox listing in response').default(false),
4163
+ mailboxes: Joi.boolean().example(false).description('Include mailbox listing in response').default(false).label('IncludeMailboxes'),
4112
4164
  imap: Joi.object(imapSchema).allow(false).description('IMAP configuration').label('ImapConfiguration'),
4113
4165
  smtp: Joi.object(smtpSchema).allow(false).description('SMTP configuration').label('SmtpConfiguration'),
4114
4166
  proxy: settingsSchema.proxyUrl,
@@ -4127,7 +4179,7 @@ Include your token in requests using one of these methods:
4127
4179
  .example('ERR_SSL_WRONG_VERSION_NUMBER')
4128
4180
  .description('Error code. Only present if success=false')
4129
4181
  .label('VerifyImapCode')
4130
- }),
4182
+ }).label('VerifyImapResult'),
4131
4183
  smtp: Joi.object({
4132
4184
  success: Joi.boolean().example(true).description('Was SMTP account verified').label('VerifySmtpSuccess'),
4133
4185
  error: Joi.string()
@@ -4138,7 +4190,7 @@ Include your token in requests using one of these methods:
4138
4190
  .example('ERR_SSL_WRONG_VERSION_NUMBER')
4139
4191
  .description('Error code. Only present if success=false')
4140
4192
  .label('VerifySmtpCode')
4141
- }),
4193
+ }).label('VerifySmtpResult'),
4142
4194
  mailboxes: shortMailboxesSchema
4143
4195
  }).label('VerifyAccountResponse'),
4144
4196
  failAction: 'log'
@@ -4597,6 +4649,12 @@ Include your token in requests using one of these methods:
4597
4649
  MAX_PAYLOAD_TIMEOUT
4598
4650
  });
4599
4651
 
4652
+ // setup export routes
4653
+ await exportRoutes({
4654
+ server,
4655
+ CORS_CONFIG
4656
+ });
4657
+
4600
4658
  server.route({
4601
4659
  method: 'GET',
4602
4660
  path: '/v1/webhookRoutes',
@@ -4867,7 +4925,8 @@ Include your token in requests using one of these methods:
4867
4925
 
4868
4926
  clientId: Joi.string()
4869
4927
  .example('4f05f488-d858-4f2c-bd12-1039062612fe')
4870
- .description('Client or Application ID for 3-legged OAuth2 applications'),
4928
+ .description('Client or Application ID for 3-legged OAuth2 applications')
4929
+ .label('OAuth2AppListClientId'),
4871
4930
  clientSecret: Joi.string()
4872
4931
  .example('******')
4873
4932
  .description('Client secret for 3-legged OAuth2 applications. Actual value is not revealed.'),
@@ -4878,9 +4937,13 @@ Include your token in requests using one of these methods:
4878
4937
  allowRelative: false
4879
4938
  })
4880
4939
  .example('https://myservice.com/oauth')
4881
- .description('Redirect URL for 3-legged OAuth2 applications'),
4940
+ .description('Redirect URL for 3-legged OAuth2 applications')
4941
+ .label('OAuth2AppListRedirectUrl'),
4882
4942
 
4883
- serviceClient: Joi.string().example('9103965568215821627203').description('Service client ID for 2-legged OAuth2 applications'),
4943
+ serviceClient: Joi.string()
4944
+ .example('9103965568215821627203')
4945
+ .description('Service client ID for 2-legged OAuth2 applications')
4946
+ .label('OAuth2AppListServiceClient'),
4884
4947
 
4885
4948
  googleProjectId: googleProjectIdSchema,
4886
4949
  googleWorkspaceAccounts: googleWorkspaceAccountsSchema,
@@ -5002,7 +5065,8 @@ Include your token in requests using one of these methods:
5002
5065
 
5003
5066
  clientId: Joi.string()
5004
5067
  .example('4f05f488-d858-4f2c-bd12-1039062612fe')
5005
- .description('Client or Application ID for 3-legged OAuth2 applications'),
5068
+ .description('Client or Application ID for 3-legged OAuth2 applications')
5069
+ .label('OAuth2AppGetClientId'),
5006
5070
  clientSecret: Joi.string().example('******').description('Client secret for 3-legged OAuth2 applications. Actual value is not revealed.'),
5007
5071
  authority: Joi.string().example('common').description('Authorization tenant value for Outlook OAuth2 applications'),
5008
5072
  redirectUrl: Joi.string()
@@ -5011,7 +5075,8 @@ Include your token in requests using one of these methods:
5011
5075
  allowRelative: false
5012
5076
  })
5013
5077
  .example('https://myservice.com/oauth')
5014
- .description('Redirect URL for 3-legged OAuth2 applications'),
5078
+ .description('Redirect URL for 3-legged OAuth2 applications')
5079
+ .label('OAuth2AppGetRedirectUrl'),
5015
5080
 
5016
5081
  googleProjectId: googleProjectIdSchema,
5017
5082
  googleWorkspaceAccounts: googleWorkspaceAccountsSchema,
@@ -5023,7 +5088,10 @@ Include your token in requests using one of these methods:
5023
5088
  .example('name@project-123.iam.gserviceaccount.com')
5024
5089
  .description('Service Client Email for 2-legged OAuth2 applications'),
5025
5090
 
5026
- serviceClient: Joi.string().example('9103965568215821627203').description('Service client ID for 2-legged OAuth2 applications'),
5091
+ serviceClient: Joi.string()
5092
+ .example('9103965568215821627203')
5093
+ .description('Service client ID for 2-legged OAuth2 applications')
5094
+ .label('OAuth2AppGetServiceClient'),
5027
5095
 
5028
5096
  serviceKey: Joi.string()
5029
5097
  .example('******')
@@ -5163,7 +5231,8 @@ Include your token in requests using one of these methods:
5163
5231
  .allow('', null, false)
5164
5232
  .max(256)
5165
5233
  .example('52422112755-3uov8bjwlrullq122rdm6l8ui25ho7qf.apps.googleusercontent.com')
5166
- .description('Client or Application ID for 3-legged OAuth2 applications'),
5234
+ .description('Client or Application ID for 3-legged OAuth2 applications')
5235
+ .label('UpdateOAuth2ClientId'),
5167
5236
 
5168
5237
  clientSecret: Joi.string()
5169
5238
  .trim()
@@ -5177,18 +5246,26 @@ Include your token in requests using one of these methods:
5177
5246
  .base64({ paddingRequired: false, urlSafe: true })
5178
5247
  .max(512)
5179
5248
  .example('AAAAAQAACnA')
5180
- .description('Cloud Pub/Sub app for Gmail API webhooks'),
5249
+ .description('Cloud Pub/Sub app for Gmail API webhooks')
5250
+ .label('UpdatePubSubAppId'),
5181
5251
 
5182
- extraScopes: Joi.array().items(Joi.string().trim().max(255).example('User.Read')).description('OAuth2 Extra Scopes'),
5252
+ extraScopes: Joi.array()
5253
+ .items(Joi.string().trim().max(255).example('User.Read').label('UpdateExtraScopeEntry'))
5254
+ .description('OAuth2 Extra Scopes')
5255
+ .label('UpdateOAuth2ExtraScopes'),
5183
5256
 
5184
- skipScopes: Joi.array().items(Joi.string().trim().max(255).example('SMTP.Send')).description('OAuth2 scopes to skip from the base set'),
5257
+ skipScopes: Joi.array()
5258
+ .items(Joi.string().trim().max(255).example('SMTP.Send').label('UpdateSkipScopeEntry'))
5259
+ .description('OAuth2 scopes to skip from the base set')
5260
+ .label('UpdateOAuth2SkipScopes'),
5185
5261
 
5186
5262
  serviceClient: Joi.string()
5187
5263
  .trim()
5188
5264
  .allow('', null, false)
5189
5265
  .max(256)
5190
5266
  .example('7103296518315821565203')
5191
- .description('Service client ID for 2-legged OAuth2 applications'),
5267
+ .description('Service client ID for 2-legged OAuth2 applications')
5268
+ .label('UpdateServiceClient'),
5192
5269
 
5193
5270
  googleProjectId: googleProjectIdSchema,
5194
5271
  googleWorkspaceAccounts: googleWorkspaceAccountsSchema,
@@ -5230,6 +5307,7 @@ Include your token in requests using one of these methods:
5230
5307
  .uri({ scheme: ['http', 'https'], allowRelative: false })
5231
5308
  .example('https://myservice.com/oauth')
5232
5309
  .description('Redirect URL for 3-legged OAuth2 applications')
5310
+ .label('UpdateOAuth2RedirectUrl')
5233
5311
  }).label('UpdateOAuthApp')
5234
5312
  },
5235
5313
 
@@ -5465,7 +5543,7 @@ Include your token in requests using one of these methods:
5465
5543
  .default(false)
5466
5544
  .example(true)
5467
5545
  .description('Should connection use TLS. Usually true for port 465')
5468
- .label('TLS'),
5546
+ .label('GatewayTlsOptions'),
5469
5547
 
5470
5548
  lastError: lastErrorSchema.allow(null)
5471
5549
  }).label('GatewayResponse'),
@@ -5542,7 +5620,7 @@ Include your token in requests using one of these methods:
5542
5620
  .default(false)
5543
5621
  .example(true)
5544
5622
  .description('Should connection use TLS. Usually true for port 465')
5545
- .label('TLS')
5623
+ .label('GatewayCreateTlsOptions')
5546
5624
  }).label('CreateGateway')
5547
5625
  },
5548
5626
 
@@ -5628,7 +5706,7 @@ Include your token in requests using one of these methods:
5628
5706
  .falsy('N', 'false', 0, '')
5629
5707
  .example(true)
5630
5708
  .description('Should connection use TLS. Usually true for port 465')
5631
- .label('TLS')
5709
+ .label('GatewayUpdateTlsOptions')
5632
5710
  }).label('UpdateGateway')
5633
5711
  },
5634
5712
 
@@ -5696,7 +5774,7 @@ Include your token in requests using one of these methods:
5696
5774
  schema: Joi.object({
5697
5775
  gateway: Joi.string().max(256).required().example('example').description('Gateway ID'),
5698
5776
  deleted: Joi.boolean().truthy('Y', 'true', '1').falsy('N', 'false', 0).default(true).description('Was the gateway deleted')
5699
- }).label('DeleteRequestResponse'),
5777
+ }).label('DeleteGatewayResponse'),
5700
5778
  failAction: 'log'
5701
5779
  }
5702
5780
  }
@@ -5778,7 +5856,7 @@ Include your token in requests using one of these methods:
5778
5856
  schema: Joi.object({
5779
5857
  account: accountIdSchema.required(),
5780
5858
  user: Joi.string().max(256).required().example('user@example.com').description('Username'),
5781
- accessToken: Joi.string().max(256).required().example('aGVsbG8gd29ybGQ=').description('Access Token'),
5859
+ accessToken: Joi.string().max(256).required().example('aGVsbG8gd29ybGQ=').description('Access Token').label('OAuthAccessToken'),
5782
5860
  provider: OAuth2ProviderSchema
5783
5861
  }).label('AccountTokenResponse'),
5784
5862
  failAction: 'log'
@@ -5848,7 +5926,7 @@ Include your token in requests using one of these methods:
5848
5926
  }).label('SignatureResponseItem')
5849
5927
  )
5850
5928
  .label('SignatureEntries')
5851
- }).label('AccountTokenResponse'),
5929
+ }).label('AccountSignaturesResponse'),
5852
5930
  failAction: 'log'
5853
5931
  }
5854
5932
  }
@@ -5995,7 +6073,7 @@ ${now}`,
5995
6073
  }),
5996
6074
 
5997
6075
  payload: Joi.object({
5998
- gateway: Joi.string().allow(false, null).empty('').max(256).example(false).description('Optional gateway ID')
6076
+ gateway: Joi.string().allow(false, null).empty('').max(256).example(false).description('Optional gateway ID').label('DeliveryTestGateway')
5999
6077
  }).label('DeliveryStartRequest')
6000
6078
  },
6001
6079
 
@@ -6141,14 +6219,15 @@ ${now}`,
6141
6219
  response: {
6142
6220
  schema: Joi.object({
6143
6221
  success: Joi.boolean().example(true).description('Was the test completed').label('ResponseDeliveryCheckSuccess'),
6144
- dkim: Joi.object().unknown().description('DKIM results'),
6145
- spf: Joi.object().unknown().description('SPF results'),
6146
- dmarc: Joi.object().unknown().description('DMARC results'),
6147
- bimi: Joi.object().unknown().description('BIMI results'),
6148
- arc: Joi.object().unknown().description('ARC results'),
6222
+ dkim: Joi.object().unknown().description('DKIM results').label('DkimResults'),
6223
+ spf: Joi.object().unknown().description('SPF results').label('SpfResults'),
6224
+ dmarc: Joi.object().unknown().description('DMARC results').label('DmarcResults'),
6225
+ bimi: Joi.object().unknown().description('BIMI results').label('BimiResults'),
6226
+ arc: Joi.object().unknown().description('ARC results').label('ArcResults'),
6149
6227
  mainSig: Joi.object()
6150
6228
  .unknown()
6151
6229
  .description('Primary DKIM signature. `status.aligned` should be set, otherwise DKIM check should not be considered as passed.')
6230
+ .label('MainSignature')
6152
6231
  }).label('DeliveryCheckResponse'),
6153
6232
  failAction: 'log'
6154
6233
  }
@@ -912,6 +912,7 @@ if( ctx._source.bounces != null) {
912
912
  Object.assign(
913
913
  {
914
914
  concurrency: 1,
915
+ lockDuration: 2 * 60 * 1000, // 2 minutes for ES operations
915
916
  maxStalledCount: 5,
916
917
  stalledInterval: 60 * 1000
917
918
  },