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.
- package/CHANGELOG.md +78 -0
- package/data/google-crawlers.json +1 -1
- package/lib/account.js +20 -7
- package/lib/api-routes/account-routes.js +28 -5
- package/lib/api-routes/chat-routes.js +1 -1
- package/lib/api-routes/export-routes.js +316 -0
- package/lib/api-routes/message-routes.js +28 -23
- package/lib/api-routes/template-routes.js +28 -7
- package/lib/arf-detect.js +1 -1
- package/lib/consts.js +16 -0
- package/lib/db.js +3 -0
- package/lib/email-client/base-client.js +6 -4
- package/lib/email-client/gmail-client.js +204 -33
- package/lib/email-client/imap/mailbox.js +99 -8
- package/lib/email-client/imap/subconnection.js +5 -5
- package/lib/email-client/imap-client.js +76 -16
- package/lib/email-client/message-builder.js +3 -1
- package/lib/email-client/notification-handler.js +12 -9
- package/lib/email-client/outlook-client.js +362 -69
- package/lib/email-client/smtp-pool-manager.js +1 -1
- package/lib/export.js +528 -0
- package/lib/oauth/gmail.js +21 -13
- package/lib/oauth/mail-ru.js +23 -10
- package/lib/oauth/outlook.js +26 -16
- package/lib/oauth/pubsub/google.js +5 -0
- package/lib/routes-ui.js +235 -1
- package/lib/schemas.js +260 -80
- package/lib/stream-encrypt.js +263 -0
- package/lib/tools.js +30 -4
- package/lib/ui-routes/account-routes.js +23 -0
- package/lib/ui-routes/admin-config-routes.js +11 -4
- package/lib/ui-routes/admin-entities-routes.js +18 -0
- package/lib/webhooks.js +16 -20
- package/package.json +16 -16
- package/sbom.json +1 -1
- package/server.js +41 -5
- package/static/js/ace/ace.js +1 -1
- package/static/js/ace/ext-language_tools.js +1 -1
- package/static/licenses.html +52 -62
- package/translations/de.mo +0 -0
- package/translations/de.po +63 -36
- package/translations/en.mo +0 -0
- package/translations/en.po +64 -37
- package/translations/et.mo +0 -0
- package/translations/et.po +63 -36
- package/translations/fr.mo +0 -0
- package/translations/fr.po +63 -36
- package/translations/ja.mo +0 -0
- package/translations/ja.po +63 -36
- package/translations/messages.pot +80 -47
- package/translations/nl.mo +0 -0
- package/translations/nl.po +63 -36
- package/translations/pl.mo +0 -0
- package/translations/pl.po +63 -36
- package/views/accounts/account.hbs +375 -2
- package/views/config/service.hbs +35 -0
- package/workers/api.js +123 -44
- package/workers/documents.js +1 -0
- package/workers/export.js +926 -0
- package/workers/imap.js +29 -0
- package/workers/submit.js +25 -5
- 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.
|
|
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_
|
|
2032
|
-
|
|
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()
|
|
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
|
-
})
|
|
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()
|
|
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()
|
|
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()
|
|
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()
|
|
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()
|
|
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()
|
|
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()
|
|
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()
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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
|
}
|