Skip to content

Commit 7250e82

Browse files
authored
Merge pull request #2421 from github/koesie10/data-extension-editor-provenance
Add provenance support to data extensions editor
2 parents 4ef520d + e7ef449 commit 7250e82

File tree

8 files changed

+49
-7
lines changed

8 files changed

+49
-7
lines changed

extensions/ql-vscode/src/data-extensions-editor/auto-model.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,10 @@ export function parsePredictedClassifications(
110110
// For now, model any method for which none of its arguments are modeled as sinks as neutral
111111
modeledMethods[signature] = {
112112
type: "neutral",
113-
kind: "",
113+
kind: "summary",
114114
input: "",
115115
output: "",
116+
provenance: "ai-generated",
116117
};
117118
continue;
118119
}
@@ -129,6 +130,7 @@ export function parsePredictedClassifications(
129130
kind: sink.classification?.kind ?? "",
130131
input: sink.input ?? "",
131132
output: sink.output ?? "",
133+
provenance: "ai-generated",
132134
};
133135
}
134136

extensions/ql-vscode/src/data-extensions-editor/modeled-method.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,24 @@ export type ModeledMethodType =
55
| "summary"
66
| "neutral";
77

8+
export type Provenance =
9+
// Generated by the dataflow model
10+
| "df-generated"
11+
// Generated by the dataflow model and manually edited
12+
| "df-manual"
13+
// Generated by the auto-model
14+
| "ai-generated"
15+
// Generated by the auto-model and manually edited
16+
| "ai-manual"
17+
// Entered by the user in the editor manually
18+
| "manual";
19+
820
export type ModeledMethod = {
921
type: ModeledMethodType;
1022
input: string;
1123
output: string;
1224
kind: string;
25+
provenance: Provenance;
1326
};
1427

1528
export type ModeledMethodWithSignature = {

extensions/ql-vscode/src/data-extensions-editor/predicates.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
ModeledMethod,
44
ModeledMethodType,
55
ModeledMethodWithSignature,
6+
Provenance,
67
} from "./modeled-method";
78

89
export type ExternalApiUsageByType = {
@@ -43,7 +44,7 @@ export const extensiblePredicateDefinitions: Record<
4344
"",
4445
method.modeledMethod.output,
4546
method.modeledMethod.kind,
46-
"manual",
47+
method.modeledMethod.provenance,
4748
],
4849
readModeledMethod: (row) => ({
4950
signature: readRowToMethod(row),
@@ -52,6 +53,7 @@ export const extensiblePredicateDefinitions: Record<
5253
input: "",
5354
output: row[6] as string,
5455
kind: row[7] as string,
56+
provenance: row[8] as Provenance,
5557
},
5658
}),
5759
supportedKinds: ["remote"],
@@ -71,7 +73,7 @@ export const extensiblePredicateDefinitions: Record<
7173
"",
7274
method.modeledMethod.input,
7375
method.modeledMethod.kind,
74-
"manual",
76+
method.modeledMethod.provenance,
7577
],
7678
readModeledMethod: (row) => ({
7779
signature: readRowToMethod(row),
@@ -80,6 +82,7 @@ export const extensiblePredicateDefinitions: Record<
8082
input: row[6] as string,
8183
output: "",
8284
kind: row[7] as string,
85+
provenance: row[8] as Provenance,
8386
},
8487
}),
8588
supportedKinds: ["sql", "xss", "logging"],
@@ -100,7 +103,7 @@ export const extensiblePredicateDefinitions: Record<
100103
method.modeledMethod.input,
101104
method.modeledMethod.output,
102105
method.modeledMethod.kind,
103-
"manual",
106+
method.modeledMethod.provenance,
104107
],
105108
readModeledMethod: (row) => ({
106109
signature: readRowToMethod(row),
@@ -109,6 +112,7 @@ export const extensiblePredicateDefinitions: Record<
109112
input: row[6] as string,
110113
output: row[7] as string,
111114
kind: row[8] as string,
115+
provenance: row[9] as Provenance,
112116
},
113117
}),
114118
supportedKinds: ["taint", "value"],
@@ -124,7 +128,7 @@ export const extensiblePredicateDefinitions: Record<
124128
method.externalApiUsage.methodName,
125129
method.externalApiUsage.methodParameters,
126130
method.modeledMethod.kind,
127-
"manual",
131+
method.modeledMethod.provenance,
128132
],
129133
readModeledMethod: (row) => ({
130134
signature: `${row[0]}.${row[1]}#${row[2]}${row[3]}`,
@@ -133,6 +137,7 @@ export const extensiblePredicateDefinitions: Record<
133137
input: "",
134138
output: "",
135139
kind: row[4] as string,
140+
provenance: row[5] as Provenance,
136141
},
137142
}),
138143
supportedKinds: ["summary", "source", "sink"],

extensions/ql-vscode/src/stories/data-extensions-editor/DataExtensionsEditor.stories.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,30 +211,35 @@ DataExtensionsEditor.args = {
211211
input: "Argument[0]",
212212
output: "",
213213
kind: "jndi-injection",
214+
provenance: "df-generated",
214215
},
215216
"org.sql2o.Connection#createQuery(String)": {
216217
type: "summary",
217218
input: "Argument[this]",
218219
output: "ReturnValue",
219220
kind: "taint",
221+
provenance: "df-manual",
220222
},
221223
"org.sql2o.Sql2o#open()": {
222224
type: "summary",
223225
input: "Argument[this]",
224226
output: "ReturnValue",
225227
kind: "taint",
228+
provenance: "manual",
226229
},
227230
"org.sql2o.Query#executeScalar(Class)": {
228231
type: "neutral",
229232
input: "",
230233
output: "",
231234
kind: "",
235+
provenance: "df-generated",
232236
},
233237
"org.sql2o.Sql2o#Sql2o(String,String,String)": {
234238
type: "neutral",
235239
input: "",
236240
output: "",
237241
kind: "",
242+
provenance: "df-generated",
238243
},
239244
},
240245
};

extensions/ql-vscode/src/stories/data-extensions-editor/MethodRow.stories.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,6 @@ MethodRow.args = {
5050
input: "Argument[this]",
5151
output: "ReturnValue",
5252
kind: "taint",
53+
provenance: "manual",
5354
},
5455
};

extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { ExternalApiUsage } from "../../data-extensions-editor/external-api-usag
1313
import {
1414
ModeledMethod,
1515
ModeledMethodType,
16+
Provenance,
1617
} from "../../data-extensions-editor/modeled-method";
1718
import { KindInput } from "./KindInput";
1819
import { extensiblePredicateDefinitions } from "../../data-extensions-editor/predicates";
@@ -63,13 +64,21 @@ export const MethodRow = ({
6364
(e: InputEvent) => {
6465
const target = e.target as HTMLSelectElement;
6566

67+
let newProvenance: Provenance = "manual";
68+
if (modeledMethod?.provenance === "df-generated") {
69+
newProvenance = "df-manual";
70+
} else if (modeledMethod?.provenance === "ai-generated") {
71+
newProvenance = "ai-manual";
72+
}
73+
6674
onChange(externalApiUsage, {
6775
// If there are no arguments, we will default to "Argument[this]"
6876
input: argumentsList.length === 0 ? "Argument[this]" : "Argument[0]",
6977
output: "ReturnType",
7078
kind: "value",
7179
...modeledMethod,
7280
type: target.value as ModeledMethodType,
81+
provenance: newProvenance,
7382
});
7483
},
7584
[onChange, externalApiUsage, modeledMethod, argumentsList],

extensions/ql-vscode/test/unit-tests/data-extensions-editor/auto-model.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,12 +191,14 @@ describe("createAutoModelRequest", () => {
191191
kind: "",
192192
input: "",
193193
output: "",
194+
provenance: "manual",
194195
},
195196
"org.sql2o.Sql2o#Sql2o(String)": {
196197
type: "sink",
197198
kind: "jndi-injection",
198199
input: "Argument[0]",
199200
output: "",
201+
provenance: "manual",
200202
},
201203
};
202204

@@ -407,18 +409,21 @@ describe("parsePredictedClassifications", () => {
407409
kind: "sql injection sink",
408410
input: "Argument[0]",
409411
output: "",
412+
provenance: "ai-generated",
410413
},
411414
"org.sql2o.Sql2o#executeScalar(Class)": {
412415
type: "neutral",
413-
kind: "",
416+
kind: "summary",
414417
input: "",
415418
output: "",
419+
provenance: "ai-generated",
416420
},
417421
"org.sql2o.Sql2o#Sql2o(String,String,String)": {
418422
type: "sink",
419423
kind: "sql injection sink",
420424
input: "Argument[1]",
421425
output: "",
426+
provenance: "ai-generated",
422427
},
423428
});
424429
});

extensions/ql-vscode/test/unit-tests/data-extensions-editor/yaml.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ describe("createDataExtensionYaml", () => {
7575
input: "Argument[0]",
7676
output: "",
7777
kind: "sql",
78+
provenance: "df-generated",
7879
},
7980
},
8081
);
@@ -89,7 +90,7 @@ describe("createDataExtensionYaml", () => {
8990
pack: codeql/java-all
9091
extensible: sinkModel
9192
data:
92-
- ["org.sql2o","Connection",true,"createQuery","(String)","","Argument[0]","sql","manual"]
93+
- ["org.sql2o","Connection",true,"createQuery","(String)","","Argument[0]","sql","df-generated"]
9394
9495
- addsTo:
9596
pack: codeql/java-all
@@ -171,6 +172,7 @@ describe("loadDataExtensionYaml", () => {
171172
kind: "sql",
172173
output: "",
173174
type: "sink",
175+
provenance: "manual",
174176
},
175177
});
176178
});

0 commit comments

Comments
 (0)