fix(AWS SES Node): Encode template parameters properly (#13570)

Co-authored-by: Shireen Missi <shireen@n8n.io>
This commit is contained in:
Ria Scholz
2025-03-11 16:38:29 +01:00
committed by GitHub
parent b6d5092258
commit ca8d249700
2 changed files with 96 additions and 15 deletions

View File

@@ -1081,16 +1081,11 @@ export class AwsSes implements INodeType {
if (operation === 'sendTemplate') {
const toAddresses = this.getNodeParameter('toAddresses', i) as string[];
const template = this.getNodeParameter('templateName', i) as string;
const fromEmail = this.getNodeParameter('fromEmail', i) as string;
const additionalFields = this.getNodeParameter('additionalFields', i);
const templateDataUi = this.getNodeParameter('templateDataUi', i) as IDataObject;
const params = [`Template=${template}`, `Source=${fromEmail}`];
const params = [`Template=${template}`, `Source=${encodeURIComponent(fromEmail)}`];
if (toAddresses.length) {
setParameter(params, 'Destination.ToAddresses.member', toAddresses);
@@ -1150,7 +1145,7 @@ export class AwsSes implements INodeType {
//@ts-ignore
templateData[templateDataValue.key] = templateDataValue.value;
}
params.push(`TemplateData=${JSON.stringify(templateData)}`);
params.push(`TemplateData=${encodeURIComponent(JSON.stringify(templateData))}`);
}
}
@@ -1176,13 +1171,15 @@ export class AwsSes implements INodeType {
const additionalFields = this.getNodeParameter('additionalFields', i);
const params = [
`Template.TemplateName=${templateName}`,
`Template.SubjectPart=${subjectPart}`,
`Template.HtmlPart=<h1>${htmlPart}</h1>`,
`Template.TemplateName=${encodeURIComponent(templateName)}`,
`Template.SubjectPart=${encodeURIComponent(subjectPart)}`,
`Template.HtmlPart=${encodeURIComponent(htmlPart)}`,
];
if (additionalFields.textPart) {
params.push(`Template.TextPart=${additionalFields.textPart}`);
params.push(
`Template.TextPart=${encodeURIComponent(additionalFields.textPart as string)}`,
);
}
responseData = await awsApiRequestSOAP.call(
@@ -1256,18 +1253,24 @@ export class AwsSes implements INodeType {
const updateFields = this.getNodeParameter('updateFields', i);
const params = [`Template.TemplateName=${templateName}`];
const params = [`Template.TemplateName=${encodeURIComponent(templateName)}`];
if (updateFields.textPart) {
params.push(`Template.TextPart=${updateFields.textPart}`);
params.push(
`Template.TextPart=${encodeURIComponent(updateFields.textPart as string)}`,
);
}
if (updateFields.subjectPart) {
params.push(`Template.SubjectPart=${updateFields.subjectPart}`);
params.push(
`Template.SubjectPart=${encodeURIComponent(updateFields.subjectPart as string)}`,
);
}
if (updateFields.subjectPart) {
params.push(`Template.HtmlPart=${updateFields.htmlPart}`);
params.push(
`Template.HtmlPart=${encodeURIComponent(updateFields.htmlPart as string)}`,
);
}
responseData = await awsApiRequestSOAP.call(

View File

@@ -7,6 +7,10 @@ import * as Helpers from '@test/nodes/Helpers';
import type { WorkflowTestData } from '@test/nodes/types';
describe('AwsSes Node', () => {
const email = 'test+user@example.com';
const templateData = {
Name: 'Special. Characters @#$%^&*()_-',
};
const tests: WorkflowTestData[] = [
{
description: 'should create customVerificationEmail',
@@ -90,6 +94,80 @@ describe('AwsSes Node', () => {
],
},
},
{
description: 'should URIencode params for sending email with template',
input: {
workflowData: {
nodes: [
{
parameters: {},
type: 'n8n-nodes-base.manualTrigger',
typeVersion: 1,
position: [-180, 520],
id: '363e874a-9054-4a64-bc3f-786719dde626',
name: "When clicking 'Test workflow'",
},
{
parameters: {
operation: 'sendTemplate',
templateName: '=Template11',
fromEmail: 'test+user@example.com',
toAddresses: ['test+user@example.com'],
templateDataUi: {
templateDataValues: [
{
key: 'Name',
value: '=Special. Characters @#$%^&*()_-',
},
],
},
additionalFields: {},
},
type: 'n8n-nodes-base.awsSes',
typeVersion: 1,
position: [60, 520],
id: '13bbf4ef-8320-45d1-9210-61b62794a108',
name: 'AWS SES',
credentials: {
aws: {
id: 'Nz0QZhzu3MvfK4TQ',
name: 'AWS account',
},
},
},
],
connections: {
"When clicking 'Test workflow'": {
main: [
[
{
node: 'AWS SES',
type: NodeConnectionType.Main,
index: 0,
},
],
],
},
},
},
},
output: {
nodeExecutionOrder: ['Start'],
nodeData: { 'AWS SES': [[{ json: { success: 'true' } }]] },
},
nock: {
baseUrl: 'https://email.eu-central-1.amazonaws.com',
mocks: [
{
method: 'post',
path: `/?Action=SendTemplatedEmail&Template=Template11&Source=${encodeURIComponent(email)}&Destination.ToAddresses.member.1=${encodeURIComponent(email)}&TemplateData=${encodeURIComponent(JSON.stringify(templateData))}`,
statusCode: 200,
responseBody:
'<SendTemplatedEmailResponse><success>true</success></SendTemplatedEmailResponse>',
},
],
},
},
];
const nodeTypes = Helpers.setup(tests);