Skip to content

Commit ea0032f

Browse files
committed
feat: validate and filter custom response headers in SubscriptionResponseHeadersCardWidget
1 parent 45b2b4f commit ea0032f

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

src/widgets/dashboard/subscription-settings/settings/cards/subscription-response-headers-card.widget.tsx

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ interface IProps {
2121
subscriptionSettings: UpdateSubscriptionSettingsCommand.Response['response']
2222
}
2323

24+
const HEADER_NAME_REGEX = /^[!#$%&'*+\-.0-9A-Z^_`a-z|~]+$/
25+
const HEADER_VALUE_REGEX = /^[\x21-\x7E]([\x20-\x7E]*[\x21-\x7E])?$/
26+
2427
export const SubscriptionResponseHeadersCardWidget = (props: IProps) => {
2528
const { subscriptionSettings } = props
2629
const { t } = useTranslation()
@@ -61,17 +64,43 @@ export const SubscriptionResponseHeadersCardWidget = (props: IProps) => {
6164
})
6265

6366
const handleSubmit = form.onSubmit((values) => {
64-
const headersFiltered = headers.filter((header) => header.key.trim() !== '')
67+
const headersFiltered = headers
68+
.map((header) => ({
69+
key: header.key.trim(),
70+
value: header.value.trim()
71+
}))
72+
.filter((header) => header.key !== '')
73+
74+
const seen = new Set<string>()
75+
const uniqueHeaders: HeaderItem[] = []
76+
for (let i = headersFiltered.length - 1; i >= 0; i--) {
77+
const header = headersFiltered[i]
78+
if (!seen.has(header.key)) {
79+
uniqueHeaders.unshift(header)
80+
seen.add(header.key)
81+
}
82+
}
83+
84+
for (const header of uniqueHeaders) {
85+
if (!HEADER_NAME_REGEX.test(header.key)) {
86+
form.setFieldError('customResponseHeaders', `Invalid header name: ${header.key}`)
87+
return
88+
}
89+
if (!HEADER_VALUE_REGEX.test(header.value)) {
90+
form.setFieldError('customResponseHeaders', `Invalid header value: ${header.value}`)
91+
return
92+
}
93+
}
6594

66-
const customResponseHeaders: Record<string, string> = {}
67-
headersFiltered.forEach((header) => {
68-
customResponseHeaders[header.key] = header.value
95+
const responseHeaders: Record<string, string> = {}
96+
uniqueHeaders.forEach((header) => {
97+
responseHeaders[header.key] = header.value
6998
})
7099

71100
mutate({
72101
variables: {
73102
uuid: values.uuid,
74-
customResponseHeaders
103+
customResponseHeaders: responseHeaders
75104
}
76105
})
77106
})

0 commit comments

Comments
 (0)