From d6763af1ad7b43a74c738643d587eaaeef02683a Mon Sep 17 00:00:00 2001
From: Ria <123465523+riascho@users.noreply.github.com>
Date: Thu, 27 Feb 2025 17:31:49 +0100
Subject: [PATCH 1/4] encodes params correctly
---
packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
index 1482c0aa08..b50ab1c717 100644
--- a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
+++ b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
@@ -1176,13 +1176,15 @@ export class AwsSes implements INodeType {
const additionalFields = this.getNodeParameter('additionalFields', i);
const params = [
- `Template.TemplateName=${templateName}`,
- `Template.SubjectPart=${subjectPart}`,
- `Template.HtmlPart=
${htmlPart}
`,
+ `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(
From f7abb1b637b37cb64958d8631147bef96fb72ba3 Mon Sep 17 00:00:00 2001
From: Ria <123465523+riascho@users.noreply.github.com>
Date: Thu, 27 Feb 2025 17:46:10 +0100
Subject: [PATCH 2/4] encodes params for updating templates
---
packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
index b50ab1c717..1faddad8a8 100644
--- a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
+++ b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
@@ -1258,18 +1258,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(
From 487aa0822f2757f65c145641a523f12af137bfc8 Mon Sep 17 00:00:00 2001
From: Ria <123465523+riascho@users.noreply.github.com>
Date: Sun, 2 Mar 2025 13:04:29 +0100
Subject: [PATCH 3/4] fixes encoding for sending templates
---
packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
index 1faddad8a8..c01a3b4b0e 100644
--- a/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
+++ b/packages/nodes-base/nodes/Aws/SES/AwsSes.node.ts
@@ -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))}`);
}
}
From 477170174b42deb059eeced943971fe45e959fbd Mon Sep 17 00:00:00 2001
From: Ria <123465523+riascho@users.noreply.github.com>
Date: Sun, 2 Mar 2025 14:01:14 +0100
Subject: [PATCH 4/4] adds test setup with nock
---
.../nodes/Aws/SES/test/AwsSes.node.test.ts | 90 +++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts b/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts
index dfd4005fe3..68d4855698 100644
--- a/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts
+++ b/packages/nodes-base/nodes/Aws/SES/test/AwsSes.node.test.ts
@@ -90,6 +90,96 @@ 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 SES4',
+ credentials: {
+ aws: {
+ id: 'Nz0QZhzu3MvfK4TQ',
+ name: 'AWS account',
+ },
+ },
+ },
+ ],
+ connections: {
+ "When clicking 'Test workflow'": {
+ main: [
+ [
+ {
+ node: 'AWS SES4',
+ 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: '/',
+ requestBody: (body: any) => {
+ assert.deepEqual(qs.parse(body), {
+ Action: 'SendTemplatedEmail',
+ TemplateName: '=Template11',
+ Source: encodeURIComponent('test+user@example.com'),
+ Destination: {
+ ToAddresses: [encodeURIComponent('test+user@example.com')],
+ },
+ TemplateData: encodeURIComponent(
+ JSON.stringify({
+ Name: '=Special. Characters @#$%^&*()_-',
+ }),
+ ),
+ });
+ return true;
+ },
+ statusCode: 200,
+ responseBody:
+ 'true',
+ },
+ ],
+ },
+ },
];
const nodeTypes = Helpers.setup(tests);