Skip to content

Commit 2392d7c

Browse files
Merge pull request #2606 from github/robertbrignull/data-modeled-method-signature
Add signature and related fields to ModeledMethod
2 parents 10d9213 + e2b211a commit 2392d7c

File tree

12 files changed

+215
-211
lines changed

12 files changed

+215
-211
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,12 @@ export function parsePredictedClassifications(
140140
input: "",
141141
output: "",
142142
provenance: "ai-generated",
143+
signature,
144+
// predictedBySignature[signature] always has at least element
145+
packageName: predictedMethods[0].package,
146+
typeName: predictedMethods[0].type,
147+
methodName: predictedMethods[0].name,
148+
methodParameters: predictedMethods[0].signature,
143149
};
144150
continue;
145151
}
@@ -157,6 +163,11 @@ export function parsePredictedClassifications(
157163
input: sink.input ?? "",
158164
output: sink.output ?? "",
159165
provenance: "ai-generated",
166+
signature,
167+
packageName: sink.package,
168+
typeName: sink.type,
169+
methodName: sink.name,
170+
methodParameters: sink.signature,
160171
};
161172
}
162173

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,11 +377,11 @@ export class DataExtensionsEditorView extends AbstractWebview<
377377
queryRunner: this.queryRunner,
378378
queryStorageDir: this.queryStorageDir,
379379
databaseItem: addedDatabase ?? this.databaseItem,
380-
onResults: async (results) => {
380+
onResults: async (modeledMethods) => {
381381
const modeledMethodsByName: Record<string, ModeledMethod> = {};
382382

383-
for (const result of results) {
384-
modeledMethodsByName[result.signature] = result.modeledMethod;
383+
for (const modeledMethod of modeledMethods) {
384+
modeledMethodsByName[modeledMethod.signature] = modeledMethod;
385385
}
386386

387387
await this.postMessage({

extensions/ql-vscode/src/data-extensions-editor/external-api-usage.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ export type Usage = Call & {
1717
classification: CallClassification;
1818
};
1919

20-
export type ExternalApiUsage = {
21-
/**
22-
* Contains the name of the library containing the method declaration, e.g. `sql2o-1.6.0.jar` or `System.Runtime.dll`
23-
*/
24-
library: string;
20+
export interface MethodSignature {
2521
/**
2622
* A unique signature that can be used to identify this external API usage.
2723
*
@@ -37,11 +33,18 @@ export type ExternalApiUsage = {
3733
* The method parameters, including enclosing parentheses, e.g. `(String, String)`
3834
*/
3935
methodParameters: string;
36+
}
37+
38+
export interface ExternalApiUsage extends MethodSignature {
39+
/**
40+
* Contains the name of the library containing the method declaration, e.g. `sql2o-1.6.0.jar` or `System.Runtime.dll`
41+
*/
42+
library: string;
4043
/**
4144
* Is this method already supported by CodeQL standard libraries.
4245
* If so, there is no need for the user to model it themselves.
4346
*/
4447
supported: boolean;
4548
supportedType: ModeledMethodType;
4649
usages: Usage[];
47-
};
50+
}

extensions/ql-vscode/src/data-extensions-editor/generate-flow-model.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ import { extLogger } from "../common/logging/vscode";
88
import { extensiblePredicateDefinitions } from "./predicates";
99
import { ProgressCallback } from "../common/vscode/progress";
1010
import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
11-
import {
12-
ModeledMethodType,
13-
ModeledMethodWithSignature,
14-
} from "./modeled-method";
11+
import { ModeledMethod, ModeledMethodType } from "./modeled-method";
1512
import { redactableError } from "../common/errors";
1613
import { QueryResultType } from "../query-server/new-messages";
1714
import { file } from "tmp-promise";
@@ -27,7 +24,7 @@ type FlowModelOptions = {
2724
databaseItem: DatabaseItem;
2825
progress: ProgressCallback;
2926
token: CancellationToken;
30-
onResults: (results: ModeledMethodWithSignature[]) => void | Promise<void>;
27+
onResults: (results: ModeledMethod[]) => void | Promise<void>;
3128
};
3229

3330
async function resolveQueries(
@@ -79,7 +76,7 @@ async function getModeledMethodsFromFlow(
7976
progress,
8077
token,
8178
}: Omit<FlowModelOptions, "onResults">,
82-
): Promise<ModeledMethodWithSignature[]> {
79+
): Promise<ModeledMethod[]> {
8380
if (queryPath === undefined) {
8481
void showAndLogExceptionWithTelemetry(
8582
extLogger,

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { MethodSignature } from "./external-api-usage";
2+
13
export type ModeledMethodType =
24
| "none"
35
| "source"
@@ -17,15 +19,10 @@ export type Provenance =
1719
// Entered by the user in the editor manually
1820
| "manual";
1921

20-
export type ModeledMethod = {
22+
export interface ModeledMethod extends MethodSignature {
2123
type: ModeledMethodType;
2224
input: string;
2325
output: string;
2426
kind: string;
2527
provenance: Provenance;
26-
};
27-
28-
export type ModeledMethodWithSignature = {
29-
signature: string;
30-
modeledMethod: ModeledMethod;
31-
};
28+
}

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

Lines changed: 67 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,9 @@
1-
import { ExternalApiUsage } from "./external-api-usage";
2-
import {
3-
ModeledMethod,
4-
ModeledMethodType,
5-
ModeledMethodWithSignature,
6-
Provenance,
7-
} from "./modeled-method";
8-
9-
export type ExternalApiUsageByType = {
10-
externalApiUsage: ExternalApiUsage;
11-
modeledMethod: ModeledMethod;
12-
};
1+
import { ModeledMethod, ModeledMethodType, Provenance } from "./modeled-method";
132

143
export type ExtensiblePredicateDefinition = {
154
extensiblePredicate: string;
16-
generateMethodDefinition: (method: ExternalApiUsageByType) => Tuple[];
17-
readModeledMethod: (row: Tuple[]) => ModeledMethodWithSignature;
5+
generateMethodDefinition: (method: ModeledMethod) => Tuple[];
6+
readModeledMethod: (row: Tuple[]) => ModeledMethod;
187

198
supportedKinds?: string[];
209
};
@@ -36,25 +25,27 @@ export const extensiblePredicateDefinitions: Record<
3625
// string output, string kind, string provenance
3726
// );
3827
generateMethodDefinition: (method) => [
39-
method.externalApiUsage.packageName,
40-
method.externalApiUsage.typeName,
28+
method.packageName,
29+
method.typeName,
4130
true,
42-
method.externalApiUsage.methodName,
43-
method.externalApiUsage.methodParameters,
31+
method.methodName,
32+
method.methodParameters,
4433
"",
45-
method.modeledMethod.output,
46-
method.modeledMethod.kind,
47-
method.modeledMethod.provenance,
34+
method.output,
35+
method.kind,
36+
method.provenance,
4837
],
4938
readModeledMethod: (row) => ({
39+
type: "source",
40+
input: "",
41+
output: row[6] as string,
42+
kind: row[7] as string,
43+
provenance: row[8] as Provenance,
5044
signature: readRowToMethod(row),
51-
modeledMethod: {
52-
type: "source",
53-
input: "",
54-
output: row[6] as string,
55-
kind: row[7] as string,
56-
provenance: row[8] as Provenance,
57-
},
45+
packageName: row[0] as string,
46+
typeName: row[1] as string,
47+
methodName: row[3] as string,
48+
methodParameters: row[4] as string,
5849
}),
5950
supportedKinds: ["remote"],
6051
},
@@ -65,25 +56,27 @@ export const extensiblePredicateDefinitions: Record<
6556
// string input, string kind, string provenance
6657
// );
6758
generateMethodDefinition: (method) => [
68-
method.externalApiUsage.packageName,
69-
method.externalApiUsage.typeName,
59+
method.packageName,
60+
method.typeName,
7061
true,
71-
method.externalApiUsage.methodName,
72-
method.externalApiUsage.methodParameters,
62+
method.methodName,
63+
method.methodParameters,
7364
"",
74-
method.modeledMethod.input,
75-
method.modeledMethod.kind,
76-
method.modeledMethod.provenance,
65+
method.input,
66+
method.kind,
67+
method.provenance,
7768
],
7869
readModeledMethod: (row) => ({
70+
type: "sink",
71+
input: row[6] as string,
72+
output: "",
73+
kind: row[7] as string,
74+
provenance: row[8] as Provenance,
7975
signature: readRowToMethod(row),
80-
modeledMethod: {
81-
type: "sink",
82-
input: row[6] as string,
83-
output: "",
84-
kind: row[7] as string,
85-
provenance: row[8] as Provenance,
86-
},
76+
packageName: row[0] as string,
77+
typeName: row[1] as string,
78+
methodName: row[3] as string,
79+
methodParameters: row[4] as string,
8780
}),
8881
supportedKinds: ["sql", "xss", "logging"],
8982
},
@@ -94,26 +87,28 @@ export const extensiblePredicateDefinitions: Record<
9487
// string input, string output, string kind, string provenance
9588
// );
9689
generateMethodDefinition: (method) => [
97-
method.externalApiUsage.packageName,
98-
method.externalApiUsage.typeName,
90+
method.packageName,
91+
method.typeName,
9992
true,
100-
method.externalApiUsage.methodName,
101-
method.externalApiUsage.methodParameters,
93+
method.methodName,
94+
method.methodParameters,
10295
"",
103-
method.modeledMethod.input,
104-
method.modeledMethod.output,
105-
method.modeledMethod.kind,
106-
method.modeledMethod.provenance,
96+
method.input,
97+
method.output,
98+
method.kind,
99+
method.provenance,
107100
],
108101
readModeledMethod: (row) => ({
102+
type: "summary",
103+
input: row[6] as string,
104+
output: row[7] as string,
105+
kind: row[8] as string,
106+
provenance: row[9] as Provenance,
109107
signature: readRowToMethod(row),
110-
modeledMethod: {
111-
type: "summary",
112-
input: row[6] as string,
113-
output: row[7] as string,
114-
kind: row[8] as string,
115-
provenance: row[9] as Provenance,
116-
},
108+
packageName: row[0] as string,
109+
typeName: row[1] as string,
110+
methodName: row[3] as string,
111+
methodParameters: row[4] as string,
117112
}),
118113
supportedKinds: ["taint", "value"],
119114
},
@@ -123,22 +118,24 @@ export const extensiblePredicateDefinitions: Record<
123118
// string package, string type, string name, string signature, string kind, string provenance
124119
// );
125120
generateMethodDefinition: (method) => [
126-
method.externalApiUsage.packageName,
127-
method.externalApiUsage.typeName,
128-
method.externalApiUsage.methodName,
129-
method.externalApiUsage.methodParameters,
130-
method.modeledMethod.kind,
131-
method.modeledMethod.provenance,
121+
method.packageName,
122+
method.typeName,
123+
method.methodName,
124+
method.methodParameters,
125+
method.kind,
126+
method.provenance,
132127
],
133128
readModeledMethod: (row) => ({
129+
type: "neutral",
130+
input: "",
131+
output: "",
132+
kind: row[4] as string,
133+
provenance: row[5] as Provenance,
134134
signature: `${row[0]}.${row[1]}#${row[2]}${row[3]}`,
135-
modeledMethod: {
136-
type: "neutral",
137-
input: "",
138-
output: "",
139-
kind: row[4] as string,
140-
provenance: row[5] as Provenance,
141-
},
135+
packageName: row[0] as string,
136+
typeName: row[1] as string,
137+
methodName: row[2] as string,
138+
methodParameters: row[3] as string,
142139
}),
143140
supportedKinds: ["summary", "source", "sink"],
144141
},

0 commit comments

Comments
 (0)