Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,12 @@ const AttachmentSchemaProps = {
};
export const AttachmentSchema = z.object(AttachmentSchemaProps).strict();

export const emailSchema = z.array(z.string().max(512)).max(100);

export const ParamsSchemaProps = {
to: z.array(z.string()).default([]),
cc: z.array(z.string()).default([]),
bcc: z.array(z.string()).default([]),
to: emailSchema.default([]),
cc: emailSchema.default([]),
bcc: emailSchema.default([]),
subject: z.string(),
message: z.string(),
messageHTML: z.string().nullable().default(null),
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,73 @@ describe('params validation', () => {
)
).not.toThrowError();
});

test('throws for too long "to" address ', async () => {
const configUtils = actionsConfigMock.create();
configUtils.validateEmailAddresses.mockImplementation(validateEmailAddressesImpl);

const longEmailAddress = 'a'.repeat(513 - '@example.com'.length) + '@example.com';

expect(() => {
validateParams(
connectorType,
{
to: [longEmailAddress],
cc: ['cc@example.com'],
bcc: ['bcc@example.com'],
subject: 'this is a test',
message: 'this is the message',
},
{ configurationUtilities: configUtils }
);
}).toThrowErrorMatchingInlineSnapshot(
`"error validating action params: Field \\"to.0\\": String must contain at most 512 character(s)"`
);
});
test('throws for too long "cc" address ', async () => {
const configUtils = actionsConfigMock.create();
configUtils.validateEmailAddresses.mockImplementation(validateEmailAddressesImpl);

const longEmailAddress = 'a'.repeat(513 - '@example.com'.length) + '@example.com';

expect(() => {
validateParams(
connectorType,
{
to: ['to@example.com'],
cc: [longEmailAddress],
bcc: ['bcc@example.com'],
subject: 'this is a test',
message: 'this is the message',
},
{ configurationUtilities: configUtils }
);
}).toThrowErrorMatchingInlineSnapshot(
`"error validating action params: Field \\"cc.0\\": String must contain at most 512 character(s)"`
);
});
test('throws for too long "bcc" address ', async () => {
const configUtils = actionsConfigMock.create();
configUtils.validateEmailAddresses.mockImplementation(validateEmailAddressesImpl);

const longEmailAddress = 'a'.repeat(513 - '@example.com'.length) + '@example.com';

expect(() => {
validateParams(
connectorType,
{
to: ['to@example.com'],
cc: ['cc@example.com'],
bcc: [longEmailAddress],
subject: 'this is a test',
message: 'this is the message',
},
{ configurationUtilities: configUtils }
);
}).toThrowErrorMatchingInlineSnapshot(
`"error validating action params: Field \\"bcc.0\\": String must contain at most 512 character(s)"`
);
});
});

describe('execute()', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import {
import { ActionExecutionSourceType } from '@kbn/actions-plugin/server/types';
import { TaskErrorSource } from '@kbn/task-manager-plugin/common';
import type { ActionsConfigurationUtilities } from '@kbn/actions-plugin/server/actions_config';
import { emailSchema } from '@kbn/connector-schemas/email/schemas/latest';
import { AdditionalEmailServices } from '../../../common';
import type { SendEmailOptions, Transport } from './send_email';
import { sendEmail, JSON_TRANSPORT_SERVICE } from './send_email';
Expand Down Expand Up @@ -173,7 +174,6 @@ function validateConfig(

function validateParams(paramsObject: unknown, validatorServices: ValidatorServices) {
const { configurationUtilities } = validatorServices;

// avoids circular reference ...
const params = paramsObject as ActionParamsType;

Expand All @@ -184,6 +184,14 @@ function validateParams(paramsObject: unknown, validatorServices: ValidatorServi
throw new Error('no [to], [cc], or [bcc] entries');
}

try {
emailSchema.parse(to);
emailSchema.parse(cc);
emailSchema.parse(bcc);
} catch (error) {
throw new Error(`Invalid email addresses: ${error}`);
}

const emails = withoutMustacheTemplate(to.concat(cc).concat(bcc));
const invalidEmailsMessage = configurationUtilities.validateEmailAddresses(emails, {
treatMustacheTemplatesAsValid: true,
Expand Down