@teleporthq/teleport-plugin-next-workflows 0.43.33 → 0.43.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/client-config-redaction.test.ts +192 -0
- package/__tests__/data-api-boolean-checkbox-coercion.test.ts +143 -0
- package/__tests__/data-api-safe-query.test.ts +3 -1
- package/__tests__/data-update-item-runtime.test.ts +116 -0
- package/__tests__/global-workflows-handler-map-integrity.test.ts +85 -0
- package/__tests__/raw-query-param-binding.test.ts +216 -0
- package/__tests__/runtime-template-token-resolution.test.ts +38 -0
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +39 -2
- package/dist/cjs/data-api-route-generator.js.map +1 -1
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +31 -0
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/nodes/data/data-delete-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-delete-item.js +15 -4
- package/dist/cjs/nodes/data/data-delete-item.js.map +1 -1
- package/dist/cjs/nodes/data/data-raw-query.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-raw-query.js +7 -1
- package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
- package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-select.js +9 -0
- package/dist/cjs/nodes/data/data-select.js.map +1 -1
- package/dist/cjs/nodes/data/data-update-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-update-item.js +58 -5
- package/dist/cjs/nodes/data/data-update-item.js.map +1 -1
- package/dist/cjs/segment-splitter.d.ts +26 -2
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +45 -1
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/sql-query-validator.d.ts +40 -0
- package/dist/cjs/sql-query-validator.d.ts.map +1 -1
- package/dist/cjs/sql-query-validator.js +49 -1
- package/dist/cjs/sql-query-validator.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-component-plugin.js +22 -8
- package/dist/cjs/workflow-component-plugin.js.map +1 -1
- package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-project-plugin.js +29 -3
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +39 -2
- package/dist/esm/data-api-route-generator.js.map +1 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +31 -0
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/nodes/data/data-delete-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-delete-item.js +15 -4
- package/dist/esm/nodes/data/data-delete-item.js.map +1 -1
- package/dist/esm/nodes/data/data-raw-query.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-raw-query.js +7 -1
- package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
- package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-select.js +9 -0
- package/dist/esm/nodes/data/data-select.js.map +1 -1
- package/dist/esm/nodes/data/data-update-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-update-item.js +58 -5
- package/dist/esm/nodes/data/data-update-item.js.map +1 -1
- package/dist/esm/segment-splitter.d.ts +26 -2
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +42 -0
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/sql-query-validator.d.ts +40 -0
- package/dist/esm/sql-query-validator.d.ts.map +1 -1
- package/dist/esm/sql-query-validator.js +47 -0
- package/dist/esm/sql-query-validator.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-component-plugin.js +23 -9
- package/dist/esm/workflow-component-plugin.js.map +1 -1
- package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-project-plugin.js +30 -4
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/package.json +4 -4
- package/src/data-api-route-generator.ts +39 -2
- package/src/executor-generator.ts +31 -0
- package/src/nodes/data/data-delete-item.ts +15 -4
- package/src/nodes/data/data-raw-query.ts +7 -1
- package/src/nodes/data/data-select.ts +9 -0
- package/src/nodes/data/data-update-item.ts +62 -5
- package/src/segment-splitter.ts +49 -0
- package/src/sql-query-validator.ts +64 -0
- package/src/workflow-component-plugin.ts +23 -3
- package/src/workflow-project-plugin.ts +39 -4
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { generateDataAPIRoute } from '../src/data-api-route-generator'
|
|
2
|
+
import { generateSharedRuntimeUtilsCode } from '../src'
|
|
3
|
+
import { analyzeRawQueryParameterization } from '../src/sql-query-validator'
|
|
4
|
+
import { loadHandler } from './_helpers/load-handler'
|
|
5
|
+
|
|
6
|
+
// SQL-INJECTION SECURITY regression guard.
|
|
7
|
+
//
|
|
8
|
+
// The generation-time net rewrites every {{state.X}}/{{Current User.id}}/…
|
|
9
|
+
// VALUE interpolation in a raw-SQL node into a positional $N placeholder and
|
|
10
|
+
// moves the {{…}} token into a sibling `params` (data-raw-query) /
|
|
11
|
+
// `rawQueryUserPartParams` (data-select) array. This suite proves the PUBLISHED
|
|
12
|
+
// app honours that contract end-to-end:
|
|
13
|
+
// 1. the executor node handlers FORWARD the resolved params array to the API,
|
|
14
|
+
// 2. the values are BOUND ($N) at runtime — never interpolated into SQL text,
|
|
15
|
+
// 3. the validator treats the parameterized form as SAFE and still flags a
|
|
16
|
+
// legacy {{…}}-in-SQL query.
|
|
17
|
+
|
|
18
|
+
type SharedUtils = {
|
|
19
|
+
resolveConfig: (cfg: unknown, ctx: Record<string, unknown>) => any
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function loadSharedRuntime(): SharedUtils {
|
|
23
|
+
const src = generateSharedRuntimeUtilsCode()
|
|
24
|
+
const wrapper: { exports: Record<string, unknown> } = { exports: {} }
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
26
|
+
new Function('module', 'exports', src)(wrapper, wrapper.exports)
|
|
27
|
+
return wrapper.exports as unknown as SharedUtils
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function captureRawQueryFetchBody(config: unknown): Promise<any> {
|
|
31
|
+
const fetchMock = jest.fn(async () => ({
|
|
32
|
+
ok: true,
|
|
33
|
+
json: async () => ({ rows: [] }),
|
|
34
|
+
}))
|
|
35
|
+
const originalFetch = (globalThis as any).fetch
|
|
36
|
+
;(globalThis as any).fetch = fetchMock
|
|
37
|
+
try {
|
|
38
|
+
const handler = loadHandler('data-raw-query')
|
|
39
|
+
await handler(config, {})
|
|
40
|
+
return JSON.parse((fetchMock.mock.calls[0] as any[])[1].body)
|
|
41
|
+
} finally {
|
|
42
|
+
;(globalThis as any).fetch = originalFetch
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function captureSelectFetchBody(config: unknown): Promise<any> {
|
|
47
|
+
const fetchMock = jest.fn(async () => ({
|
|
48
|
+
ok: true,
|
|
49
|
+
json: async () => ({ rows: [], count: 0 }),
|
|
50
|
+
}))
|
|
51
|
+
const originalFetch = (globalThis as any).fetch
|
|
52
|
+
;(globalThis as any).fetch = fetchMock
|
|
53
|
+
try {
|
|
54
|
+
const handler = loadHandler('data-select')
|
|
55
|
+
await handler(config, {})
|
|
56
|
+
return JSON.parse((fetchMock.mock.calls[0] as any[])[1].body)
|
|
57
|
+
} finally {
|
|
58
|
+
;(globalThis as any).fetch = originalFetch
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
describe('raw-query param binding — executor node handlers forward the bound params', () => {
|
|
63
|
+
it('data-raw-query POSTs { query, params } with $N SQL and the values in params', async () => {
|
|
64
|
+
const body = await captureRawQueryFetchBody({
|
|
65
|
+
dataSourceId: 'ds1',
|
|
66
|
+
query: 'SELECT * FROM products WHERE name ILIKE $1',
|
|
67
|
+
params: ['oak desk'],
|
|
68
|
+
})
|
|
69
|
+
expect(body.query).toBe('SELECT * FROM products WHERE name ILIKE $1')
|
|
70
|
+
expect(body.params).toEqual(['oak desk'])
|
|
71
|
+
// The value must NOT appear anywhere in the SQL text.
|
|
72
|
+
expect(body.query).not.toContain('oak desk')
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('resolves the {{state.X}} token INTO the params array (not the SQL) — injection is neutralised', async () => {
|
|
76
|
+
const utils = loadSharedRuntime()
|
|
77
|
+
// Attacker-controlled search term that would break out of a string literal
|
|
78
|
+
// if it were interpolated into the SQL text.
|
|
79
|
+
const injection = "x'; DROP TABLE products; --"
|
|
80
|
+
const resolved = utils.resolveConfig(
|
|
81
|
+
{
|
|
82
|
+
dataSourceId: 'ds1',
|
|
83
|
+
query: 'SELECT * FROM products WHERE name ILIKE $1',
|
|
84
|
+
params: ['{{state.searchQuery}}'],
|
|
85
|
+
},
|
|
86
|
+
{ __stateValues: { searchQuery: injection } }
|
|
87
|
+
)
|
|
88
|
+
// resolveConfig substitutes the {{…}} token to the concrete value in params.
|
|
89
|
+
expect(resolved.params).toEqual([injection])
|
|
90
|
+
// The SQL text is untouched — still just the $1 placeholder.
|
|
91
|
+
expect(resolved.query).toBe('SELECT * FROM products WHERE name ILIKE $1')
|
|
92
|
+
|
|
93
|
+
const body = await captureRawQueryFetchBody(resolved)
|
|
94
|
+
expect(body.query).toBe('SELECT * FROM products WHERE name ILIKE $1')
|
|
95
|
+
expect(body.params).toEqual([injection])
|
|
96
|
+
expect(body.query).not.toContain('DROP TABLE')
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
it('data-raw-query stays backward-compatible: a static query with no params sends params: []', async () => {
|
|
100
|
+
const body = await captureRawQueryFetchBody({
|
|
101
|
+
dataSourceId: 'ds1',
|
|
102
|
+
query: 'SELECT COUNT(*) FROM products',
|
|
103
|
+
})
|
|
104
|
+
expect(body.query).toBe('SELECT COUNT(*) FROM products')
|
|
105
|
+
expect(body.params).toEqual([])
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('data-select forwards rawQueryUserPartParams alongside a $N rawQueryUserPart override', async () => {
|
|
109
|
+
const body = await captureSelectFetchBody({
|
|
110
|
+
dataSourceId: 'ds1',
|
|
111
|
+
tableName: 'products',
|
|
112
|
+
rawQueryUserPart: 'SELECT * FROM products WHERE owner = $1',
|
|
113
|
+
rawQueryUserPartParams: ['user-42'],
|
|
114
|
+
})
|
|
115
|
+
expect(body.rawQueryUserPart).toBe('SELECT * FROM products WHERE owner = $1')
|
|
116
|
+
expect(body.rawQueryUserPartParams).toEqual(['user-42'])
|
|
117
|
+
})
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
describe('raw-query param binding — generated data-API route binds, never interpolates', () => {
|
|
121
|
+
const code = generateDataAPIRoute()
|
|
122
|
+
|
|
123
|
+
it('handleRawQuery extracts body.params and binds them through safeQuery', () => {
|
|
124
|
+
expect(code).toMatch(
|
|
125
|
+
/var\s+params\s*=\s*Array\.isArray\(body\.params\)\s*\?\s*body\.params\s*:\s*\[\s*\]/
|
|
126
|
+
)
|
|
127
|
+
expect(code).toMatch(/safeQuery\(client,\s*query,\s*params,\s*'raw-query'\)/)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
it('handleRawQuery derives its SQL ONLY from body.query — no param value is spliced into the text', () => {
|
|
131
|
+
const start = code.indexOf('async function handleRawQuery')
|
|
132
|
+
const end = code.indexOf('async function assertSessionOwnsUsersRow')
|
|
133
|
+
const section = code.slice(start, end)
|
|
134
|
+
// query is assigned verbatim from the body and never re-concatenated with params.
|
|
135
|
+
expect(section).toContain('var query = body.query;')
|
|
136
|
+
expect(section).not.toMatch(/query\s*\+\s*params/)
|
|
137
|
+
expect(section).not.toMatch(/params.*\+\s*query/)
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
it("handleSelect's raw override binds rawQueryUserPartParams instead of a hardcoded empty array", () => {
|
|
141
|
+
expect(code).toMatch(
|
|
142
|
+
/queryParams\s*=\s*Array\.isArray\(body\.rawQueryUserPartParams\)\s*\?\s*body\.rawQueryUserPartParams\s*:\s*\[\s*\]/
|
|
143
|
+
)
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
it('handleRawQuery actually passes params to a parameterized client.query at runtime', async () => {
|
|
147
|
+
// Eval just the safeQuery helper (as data-api-safe-query.test.ts does) and
|
|
148
|
+
// confirm it forwards (sql, params) to client.query verbatim.
|
|
149
|
+
const start = code.indexOf('async function safeQuery')
|
|
150
|
+
let depth = 0
|
|
151
|
+
let i = code.indexOf('{', start)
|
|
152
|
+
for (; i < code.length; i++) {
|
|
153
|
+
if (code[i] === '{') {
|
|
154
|
+
depth++
|
|
155
|
+
} else if (code[i] === '}') {
|
|
156
|
+
depth--
|
|
157
|
+
if (depth === 0) {
|
|
158
|
+
break
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const fnSrc = code.slice(start, i + 1)
|
|
163
|
+
const codesStart = code.indexOf('var SAFE_COERCION_ERROR_CODES')
|
|
164
|
+
const codesEnd = code.indexOf(';', codesStart)
|
|
165
|
+
const codesSrc = code.slice(codesStart, codesEnd + 1)
|
|
166
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
167
|
+
const safeQuery = new Function(codesSrc + '\n' + fnSrc + '\nreturn safeQuery;')() as any
|
|
168
|
+
|
|
169
|
+
const calls: Array<{ sql: string; params: unknown[] }> = []
|
|
170
|
+
const fakeClient = {
|
|
171
|
+
query: async (sql: string, params: unknown[]) => {
|
|
172
|
+
calls.push({ sql, params })
|
|
173
|
+
return { rows: [], rowCount: 0 }
|
|
174
|
+
},
|
|
175
|
+
}
|
|
176
|
+
await safeQuery(
|
|
177
|
+
fakeClient,
|
|
178
|
+
'SELECT * FROM products WHERE name ILIKE $1',
|
|
179
|
+
["x'; DROP --"],
|
|
180
|
+
'raw-query'
|
|
181
|
+
)
|
|
182
|
+
expect(calls).toHaveLength(1)
|
|
183
|
+
expect(calls[0].sql).toBe('SELECT * FROM products WHERE name ILIKE $1')
|
|
184
|
+
expect(calls[0].params).toEqual(["x'; DROP --"])
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
describe('sql-query-validator — analyzeRawQueryParameterization', () => {
|
|
189
|
+
it('treats a $N-parameterized query as SAFE (zero warnings)', () => {
|
|
190
|
+
const result = analyzeRawQueryParameterization(
|
|
191
|
+
'SELECT * FROM products WHERE name ILIKE $1 AND owner = $2'
|
|
192
|
+
)
|
|
193
|
+
expect(result.isSafe).toBe(true)
|
|
194
|
+
expect(result.warnings).toEqual([])
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
it('does NOT warn merely because the state lives in the params array', () => {
|
|
198
|
+
// The function inspects only the SQL text; a {{…}} token in params is the
|
|
199
|
+
// correct, safe home for it. A correctly-parameterized workflow → 0 warnings.
|
|
200
|
+
expect(analyzeRawQueryParameterization('SELECT 1').isSafe).toBe(true)
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
it('WARNS on a legacy {{...}}-in-SQL-text interpolation', () => {
|
|
204
|
+
const result = analyzeRawQueryParameterization(
|
|
205
|
+
"SELECT * FROM products WHERE name = '{{state.searchQuery}}'"
|
|
206
|
+
)
|
|
207
|
+
expect(result.isSafe).toBe(false)
|
|
208
|
+
expect(result.warnings).toHaveLength(1)
|
|
209
|
+
expect(result.warnings[0].ruleId).toBe('sql-unparameterized-context')
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
it('handles non-string / empty input as safe', () => {
|
|
213
|
+
expect(analyzeRawQueryParameterization(undefined).isSafe).toBe(true)
|
|
214
|
+
expect(analyzeRawQueryParameterization('').isSafe).toBe(true)
|
|
215
|
+
})
|
|
216
|
+
})
|
|
@@ -137,6 +137,44 @@ describe('workflow runtime template-token resolution', () => {
|
|
|
137
137
|
expect(utils.finalizeResolvedConfig('data-select', cfg)).toBeNull()
|
|
138
138
|
expect(cfg.filters[0].value).toBeNull()
|
|
139
139
|
})
|
|
140
|
+
|
|
141
|
+
// An unresolvable {{…}} template EXPRESSION/embedded token left in a filter
|
|
142
|
+
// value would otherwise reach SQL as literal text (run d9a24741 reservations
|
|
143
|
+
// filter: "{{state.filterDateEnd || '2099-12-31'}} 23:59:59").
|
|
144
|
+
it('DROPS a data-select filter whose value still holds an unresolved {{…}} (optional-filter degrade)', () => {
|
|
145
|
+
const cfg = {
|
|
146
|
+
filters: [
|
|
147
|
+
{ field: 'status', value: 'active', operator: '=' },
|
|
148
|
+
{
|
|
149
|
+
field: 'start_time',
|
|
150
|
+
value: "{{state.filterDateEnd || '2099-12-31'}} 23:59:59",
|
|
151
|
+
operator: '<=',
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
}
|
|
155
|
+
const error = utils.finalizeResolvedConfig('data-select', cfg)
|
|
156
|
+
expect(error).toBeNull()
|
|
157
|
+
expect(cfg.filters).toHaveLength(1)
|
|
158
|
+
expect(cfg.filters[0].field).toBe('status')
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
it('ERRORS on an unresolved {{…}} filter for a WRITE (never an unscoped mutation)', () => {
|
|
162
|
+
const cfg = {
|
|
163
|
+
tableName: 'guests',
|
|
164
|
+
filters: [{ field: 'id', value: '{{Current Page Entity.guest_id}}', operator: '=' }],
|
|
165
|
+
}
|
|
166
|
+
const error = utils.finalizeResolvedConfig('data-update-item', cfg)
|
|
167
|
+
expect(error).toContain('unresolved template')
|
|
168
|
+
expect(cfg.filters).toHaveLength(0)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('keeps a fully-resolved filter value untouched', () => {
|
|
172
|
+
const cfg = {
|
|
173
|
+
filters: [{ field: 'start_time', value: '2026-07-08 23:59:59', operator: '<=' }],
|
|
174
|
+
}
|
|
175
|
+
expect(utils.finalizeResolvedConfig('data-select', cfg)).toBeNull()
|
|
176
|
+
expect(cfg.filters).toHaveLength(1)
|
|
177
|
+
})
|
|
140
178
|
})
|
|
141
179
|
|
|
142
180
|
describe('executeNodes routes the validation error to the workflow error handler', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-api-route-generator.d.ts","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,eAAO,MAAM,iBAAiB,kBAAmB,IAAI,MAAM,CAAC,KAAG,OAO9D,CAAA;AAED,MAAM,WAAW,mBAAmB;IAIlC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAQ3B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAI/B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,oBAAoB,aAAa,mBAAmB,KAAQ,
|
|
1
|
+
{"version":3,"file":"data-api-route-generator.d.ts","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,eAAO,MAAM,iBAAiB,kBAAmB,IAAI,MAAM,CAAC,KAAG,OAO9D,CAAA;AAED,MAAM,WAAW,mBAAmB;IAIlC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAQ3B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAI/B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,oBAAoB,aAAa,mBAAmB,KAAQ,MA+0BxE,CAAA"}
|
|
@@ -304,7 +304,11 @@ async function handleSelect(client, body) {
|
|
|
304
304
|
// Validate the raw user-provided query for forbidden operations
|
|
305
305
|
assertQuerySafe(rawQueryUserPart);
|
|
306
306
|
sql = rawQueryUserPart;
|
|
307
|
-
|
|
307
|
+
// SECURITY: the raw override fully replaces the assembled SELECT, so bind the
|
|
308
|
+
// security net's $N params for it, never inline text. rawQueryUserPartParams
|
|
309
|
+
// carries the workflow values (already resolved by the executor) that back the
|
|
310
|
+
// $1, $2, … placeholders the net emitted into rawQueryUserPart.
|
|
311
|
+
queryParams = Array.isArray(body.rawQueryUserPartParams) ? body.rawQueryUserPartParams : [];
|
|
308
312
|
}
|
|
309
313
|
|
|
310
314
|
// Final validation of the assembled query
|
|
@@ -366,8 +370,31 @@ function splitCommaOrPgArrayString(val) {
|
|
|
366
370
|
return s.split(',').map(function(x) { return x.trim(); }).filter(Boolean);
|
|
367
371
|
}
|
|
368
372
|
|
|
373
|
+
// HTML checkbox convention: a checked box submits a truthy string value
|
|
374
|
+
// ('on' by default, or the input's own value attribute); an UNCHECKED box
|
|
375
|
+
// is omitted from FormData entirely, which general-extract-form-data (the
|
|
376
|
+
// client-side node that builds the workflow payload) represents as '' /
|
|
377
|
+
// undefined - never false. Without this branch that '' fell through to
|
|
378
|
+
// the generic empty-string-to-null guard below and was written as SQL
|
|
379
|
+
// NULL instead of false: a silent "not featured" -> NULL data corruption
|
|
380
|
+
// in the common case (breaks any WHERE is_featured = true/false filter,
|
|
381
|
+
// since NULL fails three-valued-logic equality), and a hard 23502
|
|
382
|
+
// not-null-violation whenever the boolean column itself is NOT NULL - the
|
|
383
|
+
// exact "update failed" error reported for an unchecked "feature this item"
|
|
384
|
+
// checkbox. "Not submitted" always means unchecked/false for an HTML
|
|
385
|
+
// checkbox, so this mapping is unambiguous and safe for every boolean
|
|
386
|
+
// column, not just one page's flag.
|
|
387
|
+
var BOOLEAN_TRUE_STRINGS = { 'on': 1, 'true': 1, '1': 1 };
|
|
388
|
+
|
|
369
389
|
function coerceValueForPgColumn(col, val, colTypes) {
|
|
370
390
|
var dt = colTypes[col];
|
|
391
|
+
if (dt === 'boolean') {
|
|
392
|
+
if (typeof val === 'boolean') return val;
|
|
393
|
+
if (val === undefined || val === null) return false;
|
|
394
|
+
if (typeof val === 'number') return val !== 0;
|
|
395
|
+
if (typeof val === 'string') return !!BOOLEAN_TRUE_STRINGS[val.trim().toLowerCase()];
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
371
398
|
if (dt !== 'ARRAY') return val;
|
|
372
399
|
if (val == null) return val;
|
|
373
400
|
if (Array.isArray(val)) return val;
|
|
@@ -696,6 +723,16 @@ async function handleRawQuery(client, body, req) {
|
|
|
696
723
|
return { rows: [], error: 'No query provided' };
|
|
697
724
|
}
|
|
698
725
|
|
|
726
|
+
// SECURITY: bind the workflow's context/state values as POSITIONAL parameters
|
|
727
|
+
// ($1, $2, …) instead of interpolating them into the SQL text. The generation
|
|
728
|
+
// net rewrites every {{state.X}}/{{Current User.id}}/… value interpolation into
|
|
729
|
+
// a $N placeholder and moves the {{…}} token into this sibling params array; the
|
|
730
|
+
// executor resolves those tokens to concrete values before POSTing, so here they
|
|
731
|
+
// arrive as plain bound values. A bound value can never terminate a string literal
|
|
732
|
+
// or alter query structure — SQL injection is impossible for the value class.
|
|
733
|
+
// Legacy raw queries carry no params array and run unparameterized (backward-compat).
|
|
734
|
+
var params = Array.isArray(body.params) ? body.params : [];
|
|
735
|
+
|
|
699
736
|
// Validate the raw query for forbidden operations before execution
|
|
700
737
|
assertQuerySafe(query);
|
|
701
738
|
|
|
@@ -703,7 +740,7 @@ async function handleRawQuery(client, body, req) {
|
|
|
703
740
|
await ensurePgVector(client);
|
|
704
741
|
}
|
|
705
742
|
|
|
706
|
-
var result = await safeQuery(client, query,
|
|
743
|
+
var result = await safeQuery(client, query, params, 'raw-query');
|
|
707
744
|
var rows = Array.isArray(result.rows) ? result.rows : [];
|
|
708
745
|
|
|
709
746
|
// Auto-fire the low-stock alert when the workflow runs the post-
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-api-route-generator.js","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,mDAA0D;AAE1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;CACjB,CAAC,CAAA;AAEK,MAAM,iBAAiB,GAAG,CAAC,aAA0B,EAAW,EAAE;IACvE,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE;QAC9B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAA;SACZ;KACF;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAPY,QAAA,iBAAiB,qBAO7B;AAqBM,MAAM,oBAAoB,GAAG,CAAC,UAA+B,EAAE,EAAU,EAAE;IAChF,MAAM,aAAa,GAAG,IAAA,wCAAwB,GAAE,CAAA;IAChD,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAA;IACzD,MAAM,qBAAqB,GAAG,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAA;IAC7D,MAAM,iBAAiB,GACrB,OAAO,OAAO,CAAC,iBAAiB,KAAK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,IAAI,CAAC;QAC7E,CAAC,CAAC,OAAO,CAAC,iBAAiB;QAC3B,CAAC,CAAC,CAAC,CAAA;IAEP,OAAO;EAEP,cAAc,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EACxE,4BAA4B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;mCACvB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;8BAC1C,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;EAC7D,aAAa
|
|
1
|
+
{"version":3,"file":"data-api-route-generator.js","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,mDAA0D;AAE1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;CACjB,CAAC,CAAA;AAEK,MAAM,iBAAiB,GAAG,CAAC,aAA0B,EAAW,EAAE;IACvE,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE;QAC9B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAA;SACZ;KACF;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAPY,QAAA,iBAAiB,qBAO7B;AAqBM,MAAM,oBAAoB,GAAG,CAAC,UAA+B,EAAE,EAAU,EAAE;IAChF,MAAM,aAAa,GAAG,IAAA,wCAAwB,GAAE,CAAA;IAChD,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAA;IACzD,MAAM,qBAAqB,GAAG,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAA;IAC7D,MAAM,iBAAiB,GACrB,OAAO,OAAO,CAAC,iBAAiB,KAAK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,IAAI,CAAC;QAC7E,CAAC,CAAC,OAAO,CAAC,iBAAiB;QAC3B,CAAC,CAAC,CAAC,CAAA;IAEP,OAAO;EAEP,cAAc,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EACxE,4BAA4B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;mCACvB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;8BAC1C,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;EAC7D,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+zBd,CAAA;AACD,CAAC,CAAA;AA/0BY,QAAA,oBAAoB,wBA+0BhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAAO,
|
|
1
|
+
{"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAAO,MAm/BjD,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MAwc5C,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MAK5C,CAAA"}
|
|
@@ -297,6 +297,37 @@ function finalizeResolvedConfig(nodeType, config) {
|
|
|
297
297
|
}
|
|
298
298
|
}
|
|
299
299
|
walk(config, false);
|
|
300
|
+
|
|
301
|
+
// BACKSTOP: a data-node FILTER value that STILL holds a literal {{…}} token
|
|
302
|
+
// after resolution is an unresolvable template — a JS expression, an embedded
|
|
303
|
+
// token, or an unknown root the runtime never substitutes (run d9a24741:
|
|
304
|
+
// "{{state.filterDateEnd || '2099-12-31'}} 23:59:59" and
|
|
305
|
+
// "{{Current Page Entity.guest_id}}"). Left alone it reaches SQL as literal
|
|
306
|
+
// text and breaks the query. For a READ (data-select / data-count) DROP the
|
|
307
|
+
// clause — the optional-filter idiom degrades to "no filter" (more rows, never
|
|
308
|
+
// a crash). For a WRITE the filter scopes the mutation, so an unscoped/partial
|
|
309
|
+
// filter is unsafe → surface a validation error (same posture as the
|
|
310
|
+
// route-param sentinel above).
|
|
311
|
+
if (isDataNode && config && Array.isArray(config.filters)) {
|
|
312
|
+
var isReadNode = nodeType === 'data-select' || nodeType === 'data-count';
|
|
313
|
+
var keptFilters = [];
|
|
314
|
+
for (var fi = 0; fi < config.filters.length; fi++) {
|
|
315
|
+
var filt = config.filters[fi];
|
|
316
|
+
var fval = filt && typeof filt === 'object'
|
|
317
|
+
? (filt.value !== undefined ? filt.value : filt.destination)
|
|
318
|
+
: undefined;
|
|
319
|
+
if (typeof fval === 'string' && /\\{\\{[\\s\\S]*?\\}\\}/.test(fval)) {
|
|
320
|
+
if (!isReadNode && !error) {
|
|
321
|
+
var fcol = (filt && (filt.column || filt.field || filt.source)) || 'filter';
|
|
322
|
+
error = 'Filter on "' + fcol + '" carries an unresolved template ({{…}}) and cannot safely scope this write';
|
|
323
|
+
}
|
|
324
|
+
continue; // drop the unresolvable clause
|
|
325
|
+
}
|
|
326
|
+
keptFilters.push(filt);
|
|
327
|
+
}
|
|
328
|
+
config.filters = keptFilters;
|
|
329
|
+
}
|
|
330
|
+
|
|
300
331
|
return error;
|
|
301
332
|
}
|
|
302
333
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":";;;AAAO,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACzD,OAAO
|
|
1
|
+
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":";;;AAAO,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACzD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAi/BR,CAAA;AACD,CAAC,CAAA;AAn/BY,QAAA,8BAA8B,kCAm/B1C;AAEM,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAscR,CAAA;AACD,CAAC,CAAA;AAxcY,QAAA,yBAAyB,6BAwcrC;AAEM,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;CAGR,CAAA;AACD,CAAC,CAAA;AALY,QAAA,yBAAyB,6BAKrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-delete-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"data-delete-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA6EhE,eAAO,MAAM,cAAc,EAAE,oBAM5B,CAAA"}
|
|
@@ -26,7 +26,13 @@ async function data_delete_item(config, context) {
|
|
|
26
26
|
__col +
|
|
27
27
|
'" needs a page route param not available here; nothing deleted (workflow continues)');
|
|
28
28
|
}
|
|
29
|
-
return {
|
|
29
|
+
return {
|
|
30
|
+
deletedId: null,
|
|
31
|
+
success: true,
|
|
32
|
+
deletedCount: 0,
|
|
33
|
+
affected: 0,
|
|
34
|
+
__skippedUnavailableFilter: true,
|
|
35
|
+
};
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
38
|
try {
|
|
@@ -46,17 +52,22 @@ async function data_delete_item(config, context) {
|
|
|
46
52
|
deletedId: null,
|
|
47
53
|
success: false,
|
|
48
54
|
deletedCount: 0,
|
|
55
|
+
affected: 0,
|
|
49
56
|
error: data.error || 'Delete item failed',
|
|
50
57
|
};
|
|
51
58
|
}
|
|
59
|
+
// `affected` mirrors `deletedCount` so a success gate authored against either
|
|
60
|
+
// synonym resolves (the AI schema historically advertised `affected`).
|
|
61
|
+
const __deleted = data.deletedCount || 0;
|
|
52
62
|
return {
|
|
53
63
|
deletedId: data.deletedId || null,
|
|
54
|
-
success:
|
|
55
|
-
deletedCount:
|
|
64
|
+
success: __deleted > 0,
|
|
65
|
+
deletedCount: __deleted,
|
|
66
|
+
affected: __deleted,
|
|
56
67
|
};
|
|
57
68
|
}
|
|
58
69
|
catch (err) {
|
|
59
|
-
return { deletedId: null, success: false, error: err.message };
|
|
70
|
+
return { deletedId: null, success: false, affected: 0, error: err.message };
|
|
60
71
|
}
|
|
61
72
|
}
|
|
62
73
|
exports.dataDeleteItem = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-delete-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;AAEhE,KAAK,UAAU,gBAAgB,CAAC,MAAW,EAAE,OAAY;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IACpC,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACpD,MAAM,KAAK,GAAI,UAAkB,CAAC,OAAO,IAAK,UAAkB,CAAC,OAAO,CAAC,GAAG,CAAA;IAE5E,sEAAsE;IACtE,wEAAwE;IACxE,wEAAwE;IACxE,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QAChD,MAAM,GAAG,GAAQ,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,IACE,GAAG;YACH,CAAC,GAAG,CAAC,KAAK,KAAK,+BAA+B;gBAC5C,GAAG,CAAC,WAAW,KAAK,+BAA+B,CAAC,EACtD;YACA,wEAAwE;YACxE,mEAAmE;YACnE,uEAAuE;YACvE,4DAA4D;YAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,SAAS,CAAA;YAChE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE;gBAClD,OAAO,CAAC,IAAI,CACV,2DAA2D;oBACzD,KAAK;oBACL,qFAAqF,CACxF,CAAA;aACF;YACD,OAAO,
|
|
1
|
+
{"version":3,"file":"data-delete-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-raw-query.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"data-raw-query.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA+BhE,eAAO,MAAM,YAAY,EAAE,oBAM1B,CAAA"}
|
|
@@ -5,12 +5,18 @@ const types_1 = require("../types");
|
|
|
5
5
|
async function data_raw_query(config, context) {
|
|
6
6
|
const dataSourceId = config.dataSourceId;
|
|
7
7
|
const query = config.query;
|
|
8
|
+
// SECURITY: values that back the query's $N placeholders ride here as bound
|
|
9
|
+
// params, never interpolated into the SQL text. The generation net stored each
|
|
10
|
+
// as a {{…}} token; resolveConfig has already substituted them to concrete
|
|
11
|
+
// values by the time this handler runs. Empty/absent when the query is a static
|
|
12
|
+
// literal (backward-compat: the API route then runs it unparameterized).
|
|
13
|
+
const params = Array.isArray(config.params) ? config.params : [];
|
|
8
14
|
const baseUrl = (context && context.__baseUrl) || '';
|
|
9
15
|
try {
|
|
10
16
|
const response = await fetch(baseUrl + '/api/data/' + dataSourceId + '/raw-query', {
|
|
11
17
|
method: 'POST',
|
|
12
18
|
headers: { 'Content-Type': 'application/json' },
|
|
13
|
-
body: JSON.stringify({ query }),
|
|
19
|
+
body: JSON.stringify({ query, params }),
|
|
14
20
|
});
|
|
15
21
|
const data = await response.json();
|
|
16
22
|
if (!response.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-raw-query.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;AAEhE,KAAK,UAAU,cAAc,CAAC,MAAW,EAAE,OAAY;IACrD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IAEpD,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,EAAE;YACjF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"data-raw-query.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;AAEhE,KAAK,UAAU,cAAc,CAAC,MAAW,EAAE,OAAY;IACrD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,4EAA4E;IAC5E,+EAA+E;IAC/E,2EAA2E;IAC3E,gFAAgF;IAChF,yEAAyE;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAChE,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IAEpD,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,EAAE;YACjF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACxC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,kBAAkB,EAAE,CAAA;SACzE;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;KAC9B;IAAC,OAAO,GAAY,EAAE;QACrB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;KAC/D;AACH,CAAC;AACY,QAAA,YAAY,GAAyB;IAChD,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,QAAQ;IACtB,eAAe;QACb,OAAO,IAAA,uBAAe,EAAC,cAAc,CAAC,CAAA;IACxC,CAAC;CACF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-select.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"data-select.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAiHhE,eAAO,MAAM,UAAU,EAAE,oBAMxB,CAAA"}
|
|
@@ -11,6 +11,12 @@ async function data_select(config, context) {
|
|
|
11
11
|
const limit = config.limit;
|
|
12
12
|
const skip = config.skip;
|
|
13
13
|
const rawQueryUserPart = config.rawQueryUserPart;
|
|
14
|
+
// SECURITY: bound values that back the raw override's $N placeholders. The
|
|
15
|
+
// generation net emitted them alongside rawQueryUserPart; resolveConfig has
|
|
16
|
+
// already substituted the {{…}} tokens to concrete values here.
|
|
17
|
+
const rawQueryUserPartParams = Array.isArray(config.rawQueryUserPartParams)
|
|
18
|
+
? config.rawQueryUserPartParams
|
|
19
|
+
: [];
|
|
14
20
|
const baseUrl = (context && context.__baseUrl) || '';
|
|
15
21
|
function isEmptyFilterValue(value) {
|
|
16
22
|
if (value === undefined || value === null)
|
|
@@ -83,6 +89,9 @@ async function data_select(config, context) {
|
|
|
83
89
|
}
|
|
84
90
|
if (rawQueryUserPart) {
|
|
85
91
|
payload.rawQueryUserPart = rawQueryUserPart;
|
|
92
|
+
if (rawQueryUserPartParams.length > 0) {
|
|
93
|
+
payload.rawQueryUserPartParams = rawQueryUserPartParams;
|
|
94
|
+
}
|
|
86
95
|
}
|
|
87
96
|
const response = await fetch(baseUrl + '/api/data/' + dataSourceId + '/select', {
|
|
88
97
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-select.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"data-select.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-update-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-update-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"data-update-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-update-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA4JhE,eAAO,MAAM,cAAc,EAAE,oBAM5B,CAAA"}
|