Skip to content

Commit 2c8316c

Browse files
committed
fix(aws): restrict string consistentRead to true/false and validate SES tag parts
1 parent 5900ac3 commit 2c8316c

5 files changed

Lines changed: 26 additions & 5 deletions

File tree

‎apps/sim/lib/api/contracts/tools/aws/dynamodb-query.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const QuerySchema = z.object({
3434
}),
3535
projectionExpression: z.string().optional(),
3636
consistentRead: z
37-
.union([z.boolean(), z.string()])
37+
.union([z.boolean(), z.enum(['true', 'false'])])
3838
.optional()
3939
.transform((val) => {
4040
if (val === true || val === 'true') return true

‎apps/sim/lib/api/contracts/tools/aws/dynamodb-scan.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const ScanSchema = z
2626
exclusiveStartKey: z.record(z.string(), z.unknown()).optional(),
2727
indexName: z.string().optional(),
2828
consistentRead: z
29-
.union([z.boolean(), z.string()])
29+
.union([z.boolean(), z.enum(['true', 'false'])])
3030
.optional()
3131
.transform((val) => {
3232
if (val === true || val === 'true') return true

‎apps/sim/lib/api/contracts/tools/aws/ses-send-bulk-email.ts‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ import type {
77
import { defineRouteContract } from '@/lib/api/contracts/types'
88
import { validateAwsRegion } from '@/lib/core/security/input-validation'
99

10+
/** SES `MessageTag` name or value: 1-256 letters, digits, underscores, or hyphens. */
11+
const sesMessageTagPartSchema = z
12+
.string()
13+
.regex(/^[A-Za-z0-9_-]{1,256}$/, 'Tag names and values may contain only letters, digits, _ and -')
14+
1015
const SendBulkEmailSchema = z.object({
1116
region: z
1217
.string()
@@ -23,7 +28,9 @@ const SendBulkEmailSchema = z.object({
2328
configurationSetName: z.string().nullish(),
2429
replyToAddresses: z.string().nullish(),
2530
fromName: z.string().nullish(),
26-
emailTags: z.array(z.object({ name: z.string().min(1), value: z.string() })).nullish(),
31+
emailTags: z
32+
.array(z.object({ name: sesMessageTagPartSchema, value: sesMessageTagPartSchema }))
33+
.nullish(),
2734
})
2835

2936
const SendBulkEmailResponseSchema = z.object({

‎apps/sim/lib/api/contracts/tools/aws/ses-send-email.ts‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import { defineRouteContract } from '@/lib/api/contracts/types'
88
import { validateAwsRegion } from '@/lib/core/security/input-validation'
99
import { RawFileInputArraySchema } from '@/lib/uploads/utils/file-schemas'
1010

11+
/** SES `MessageTag` name or value: 1-256 letters, digits, underscores, or hyphens. */
12+
const sesMessageTagPartSchema = z
13+
.string()
14+
.regex(/^[A-Za-z0-9_-]{1,256}$/, 'Tag names and values may contain only letters, digits, _ and -')
15+
1116
const SendEmailSchema = z
1217
.object({
1318
region: z
@@ -28,7 +33,9 @@ const SendEmailSchema = z
2833
replyToAddresses: z.string().nullish(),
2934
configurationSetName: z.string().nullish(),
3035
fromName: z.string().nullish(),
31-
emailTags: z.array(z.object({ name: z.string().min(1), value: z.string() })).nullish(),
36+
emailTags: z
37+
.array(z.object({ name: sesMessageTagPartSchema, value: sesMessageTagPartSchema }))
38+
.nullish(),
3239
attachments: RawFileInputArraySchema.nullish(),
3340
})
3441
.refine((data) => data.bodyText || data.bodyHtml, {

‎apps/sim/lib/api/contracts/tools/aws/ses-send-templated-email.ts‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import { defineRouteContract } from '@/lib/api/contracts/types'
88
import { validateAwsRegion } from '@/lib/core/security/input-validation'
99
import { RawFileInputArraySchema } from '@/lib/uploads/utils/file-schemas'
1010

11+
/** SES `MessageTag` name or value: 1-256 letters, digits, underscores, or hyphens. */
12+
const sesMessageTagPartSchema = z
13+
.string()
14+
.regex(/^[A-Za-z0-9_-]{1,256}$/, 'Tag names and values may contain only letters, digits, _ and -')
15+
1116
const SendTemplatedEmailSchema = z.object({
1217
region: z
1318
.string()
@@ -26,7 +31,9 @@ const SendTemplatedEmailSchema = z.object({
2631
configurationSetName: z.string().nullish(),
2732
replyToAddresses: z.string().nullish(),
2833
fromName: z.string().nullish(),
29-
emailTags: z.array(z.object({ name: z.string().min(1), value: z.string() })).nullish(),
34+
emailTags: z
35+
.array(z.object({ name: sesMessageTagPartSchema, value: sesMessageTagPartSchema }))
36+
.nullish(),
3037
attachments: RawFileInputArraySchema.nullish(),
3138
})
3239

0 commit comments

Comments
 (0)