Skip to content

Commit 18ebdad

Browse files
committed
fix(hex): guard JSON.parse on user-supplied array/object params
Wrap JSON.parse calls for memberUserIds, addUserIds, removeUserIds, inputParams, and notifications in try/catch so malformed input throws a clear error instead of an opaque parse exception.
1 parent 736e765 commit 18ebdad

3 files changed

Lines changed: 35 additions & 15 deletions

File tree

apps/sim/tools/hex/create_group.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,16 @@ export const createGroupTool: ToolConfig<HexCreateGroupParams, HexCreateGroupRes
3939
body: (params) => {
4040
const body: Record<string, unknown> = { name: params.name }
4141
if (params.memberUserIds) {
42-
const userIds =
43-
typeof params.memberUserIds === 'string'
44-
? JSON.parse(params.memberUserIds)
45-
: params.memberUserIds
46-
body.members = { users: (userIds as string[]).map((id) => ({ id })) }
42+
let userIds: string[]
43+
try {
44+
userIds =
45+
typeof params.memberUserIds === 'string'
46+
? JSON.parse(params.memberUserIds)
47+
: (params.memberUserIds as string[])
48+
} catch {
49+
throw new Error('memberUserIds must be a valid JSON array of user UUID strings')
50+
}
51+
body.members = { users: userIds.map((id) => ({ id })) }
4752
}
4853
return body
4954
},

apps/sim/tools/hex/run_project.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,14 @@ export const runProjectTool: ToolConfig<HexRunProjectParams, HexRunProjectRespon
7878
const body: Record<string, unknown> = {}
7979

8080
if (params.inputParams) {
81-
body.inputParams =
82-
typeof params.inputParams === 'string'
83-
? JSON.parse(params.inputParams)
84-
: params.inputParams
81+
try {
82+
body.inputParams =
83+
typeof params.inputParams === 'string'
84+
? JSON.parse(params.inputParams)
85+
: params.inputParams
86+
} catch {
87+
throw new Error('inputParams must be valid JSON')
88+
}
8589
}
8690
if (params.dryRun !== undefined) body.dryRun = params.dryRun
8791
if (params.updateCache !== undefined) body.updateCache = params.updateCache
@@ -91,10 +95,14 @@ export const runProjectTool: ToolConfig<HexRunProjectParams, HexRunProjectRespon
9195
body.useCachedSqlResults = params.useCachedSqlResults
9296
if (params.viewId) body.viewId = params.viewId
9397
if (params.notifications) {
94-
body.notifications =
95-
typeof params.notifications === 'string'
96-
? JSON.parse(params.notifications)
97-
: params.notifications
98+
try {
99+
body.notifications =
100+
typeof params.notifications === 'string'
101+
? JSON.parse(params.notifications)
102+
: params.notifications
103+
} catch {
104+
throw new Error('notifications must be a valid JSON array')
105+
}
98106
}
99107

100108
return body

apps/sim/tools/hex/update_group.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,15 @@ export const updateGroupTool: ToolConfig<HexUpdateGroupParams, HexUpdateGroupRes
5151
const body: Record<string, unknown> = {}
5252
if (params.name) body.name = params.name
5353

54-
const parseIds = (value: unknown) =>
55-
(typeof value === 'string' ? JSON.parse(value) : value) as string[]
54+
const parseIds = (value: unknown): string[] => {
55+
try {
56+
return (typeof value === 'string' ? JSON.parse(value) : value) as string[]
57+
} catch {
58+
throw new Error(
59+
'addUserIds/removeUserIds must be a valid JSON array of user UUID strings'
60+
)
61+
}
62+
}
5663

5764
if (params.addUserIds || params.removeUserIds) {
5865
const members: Record<string, unknown> = {}

0 commit comments

Comments
 (0)