circle-ir 4.17.0 → 4.18.1
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/dist/analysis/advisories.d.ts +186 -0
- package/dist/analysis/advisories.d.ts.map +1 -0
- package/dist/analysis/advisories.js +391 -0
- package/dist/analysis/advisories.js.map +1 -0
- package/dist/analysis/comment-lines.d.ts +14 -0
- package/dist/analysis/comment-lines.d.ts.map +1 -0
- package/dist/analysis/comment-lines.js +34 -0
- package/dist/analysis/comment-lines.js.map +1 -0
- package/dist/analysis/config-loader.d.ts.map +1 -1
- package/dist/analysis/config-loader.js +59 -5
- package/dist/analysis/config-loader.js.map +1 -1
- package/dist/analysis/constant-caller-gate.d.ts +2 -2
- package/dist/analysis/constant-caller-gate.d.ts.map +1 -1
- package/dist/analysis/constant-caller-gate.js +205 -29
- package/dist/analysis/constant-caller-gate.js.map +1 -1
- package/dist/analysis/constant-propagation/propagator.d.ts +4 -0
- package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/propagator.js +99 -0
- package/dist/analysis/constant-propagation/propagator.js.map +1 -1
- package/dist/analysis/entry-point-detection.d.ts.map +1 -1
- package/dist/analysis/entry-point-detection.js +72 -0
- package/dist/analysis/entry-point-detection.js.map +1 -1
- package/dist/analysis/interprocedural.d.ts.map +1 -1
- package/dist/analysis/interprocedural.js +75 -8
- package/dist/analysis/interprocedural.js.map +1 -1
- package/dist/analysis/maven-declared.d.ts +72 -0
- package/dist/analysis/maven-declared.d.ts.map +1 -0
- package/dist/analysis/maven-declared.js +216 -0
- package/dist/analysis/maven-declared.js.map +1 -0
- package/dist/analysis/maven-version.d.ts +28 -0
- package/dist/analysis/maven-version.d.ts.map +1 -0
- package/dist/analysis/maven-version.js +172 -0
- package/dist/analysis/maven-version.js.map +1 -0
- package/dist/analysis/passes/constant-propagation-pass.d.ts.map +1 -1
- package/dist/analysis/passes/constant-propagation-pass.js +29 -1
- package/dist/analysis/passes/constant-propagation-pass.js.map +1 -1
- package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
- package/dist/analysis/passes/cross-file-pass.js +81 -1
- package/dist/analysis/passes/cross-file-pass.js.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts +7 -0
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js +44 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js.map +1 -1
- package/dist/analysis/passes/insecure-cookie-pass.d.ts +2 -0
- package/dist/analysis/passes/insecure-cookie-pass.d.ts.map +1 -1
- package/dist/analysis/passes/insecure-cookie-pass.js +25 -3
- package/dist/analysis/passes/insecure-cookie-pass.js.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.d.ts +11 -14
- package/dist/analysis/passes/interprocedural-pass.d.ts.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.js +562 -0
- package/dist/analysis/passes/interprocedural-pass.js.map +1 -1
- package/dist/analysis/passes/language-sources-pass.d.ts +18 -1
- package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
- package/dist/analysis/passes/language-sources-pass.js +1057 -14
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.js +66 -3
- package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts +44 -2
- package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.js +690 -12
- package/dist/analysis/passes/sink-filter-pass.js.map +1 -1
- package/dist/analysis/passes/taint-propagation-pass.d.ts.map +1 -1
- package/dist/analysis/passes/taint-propagation-pass.js +133 -10
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
- package/dist/analysis/passes/tls-verify-disabled-pass.d.ts +18 -0
- package/dist/analysis/passes/tls-verify-disabled-pass.d.ts.map +1 -1
- package/dist/analysis/passes/tls-verify-disabled-pass.js +161 -0
- package/dist/analysis/passes/tls-verify-disabled-pass.js.map +1 -1
- package/dist/analysis/passes/weak-random-pass.d.ts +6 -0
- package/dist/analysis/passes/weak-random-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-random-pass.js +29 -0
- package/dist/analysis/passes/weak-random-pass.js.map +1 -1
- package/dist/analysis/promote-cross-file-flows.d.ts +17 -0
- package/dist/analysis/promote-cross-file-flows.d.ts.map +1 -0
- package/dist/analysis/promote-cross-file-flows.js +32 -0
- package/dist/analysis/promote-cross-file-flows.js.map +1 -0
- package/dist/analysis/sbom.d.ts +100 -0
- package/dist/analysis/sbom.d.ts.map +1 -1
- package/dist/analysis/sbom.js +514 -3
- package/dist/analysis/sbom.js.map +1 -1
- package/dist/analysis/semver-version.d.ts +30 -0
- package/dist/analysis/semver-version.d.ts.map +1 -0
- package/dist/analysis/semver-version.js +76 -0
- package/dist/analysis/semver-version.js.map +1 -0
- package/dist/analysis/taint-matcher.d.ts +5 -0
- package/dist/analysis/taint-matcher.d.ts.map +1 -1
- package/dist/analysis/taint-matcher.js +225 -4
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/analyzer.d.ts +57 -0
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +69 -6
- package/dist/analyzer.js.map +1 -1
- package/dist/browser/circle-ir.js +2936 -291
- package/dist/core/circle-ir-core.cjs +634 -203
- package/dist/core/circle-ir-core.js +634 -203
- package/dist/core/extractors/dfg.js +205 -2
- package/dist/core/extractors/dfg.js.map +1 -1
- package/dist/core/extractors/ts-declaration-detail.d.ts +39 -0
- package/dist/core/extractors/ts-declaration-detail.d.ts.map +1 -0
- package/dist/core/extractors/ts-declaration-detail.js +266 -0
- package/dist/core/extractors/ts-declaration-detail.js.map +1 -0
- package/dist/graph/analysis-pass.d.ts +4 -1
- package/dist/graph/analysis-pass.d.ts.map +1 -1
- package/dist/graph/analysis-pass.js +4 -1
- package/dist/graph/analysis-pass.js.map +1 -1
- package/dist/graph-facts/dead-code.d.ts +62 -0
- package/dist/graph-facts/dead-code.d.ts.map +1 -0
- package/dist/graph-facts/dead-code.js +90 -0
- package/dist/graph-facts/dead-code.js.map +1 -0
- package/dist/graph-facts/dependency-calls.d.ts +86 -0
- package/dist/graph-facts/dependency-calls.d.ts.map +1 -0
- package/dist/graph-facts/dependency-calls.js +93 -0
- package/dist/graph-facts/dependency-calls.js.map +1 -0
- package/dist/graph-facts/index.d.ts +10 -0
- package/dist/graph-facts/index.d.ts.map +1 -0
- package/dist/graph-facts/index.js +10 -0
- package/dist/graph-facts/index.js.map +1 -0
- package/dist/graph-facts/maven-packages.d.ts +42 -0
- package/dist/graph-facts/maven-packages.d.ts.map +1 -0
- package/dist/graph-facts/maven-packages.js +133 -0
- package/dist/graph-facts/maven-packages.js.map +1 -0
- package/dist/graph-facts/reach.d.ts +203 -0
- package/dist/graph-facts/reach.d.ts.map +1 -0
- package/dist/graph-facts/reach.js +219 -0
- package/dist/graph-facts/reach.js.map +1 -0
- package/dist/graph-facts/removal-reach.d.ts +73 -0
- package/dist/graph-facts/removal-reach.d.ts.map +1 -0
- package/dist/graph-facts/removal-reach.js +64 -0
- package/dist/graph-facts/removal-reach.js.map +1 -0
- package/dist/index.d.ts +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -3
- package/dist/index.js.map +1 -1
- package/dist/navigation/go-graph.d.ts +68 -0
- package/dist/navigation/go-graph.d.ts.map +1 -0
- package/dist/navigation/go-graph.js +753 -0
- package/dist/navigation/go-graph.js.map +1 -0
- package/dist/navigation/index.d.ts +7 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +6 -0
- package/dist/navigation/index.js.map +1 -1
- package/dist/navigation/java-entry-tables.d.ts +43 -0
- package/dist/navigation/java-entry-tables.d.ts.map +1 -0
- package/dist/navigation/java-entry-tables.js +56 -0
- package/dist/navigation/java-entry-tables.js.map +1 -0
- package/dist/navigation/java-graph.d.ts +64 -0
- package/dist/navigation/java-graph.d.ts.map +1 -0
- package/dist/navigation/java-graph.js +466 -0
- package/dist/navigation/java-graph.js.map +1 -0
- package/dist/navigation/navigation-index.d.ts +51 -1
- package/dist/navigation/navigation-index.d.ts.map +1 -1
- package/dist/navigation/navigation-index.js +72 -0
- package/dist/navigation/navigation-index.js.map +1 -1
- package/dist/navigation/python-graph.d.ts +73 -0
- package/dist/navigation/python-graph.d.ts.map +1 -0
- package/dist/navigation/python-graph.js +867 -0
- package/dist/navigation/python-graph.js.map +1 -0
- package/dist/navigation/ts-call-edges.d.ts +193 -0
- package/dist/navigation/ts-call-edges.d.ts.map +1 -0
- package/dist/navigation/ts-call-edges.js +2089 -0
- package/dist/navigation/ts-call-edges.js.map +1 -0
- package/dist/navigation/ts-entry-tables.d.ts +88 -0
- package/dist/navigation/ts-entry-tables.d.ts.map +1 -0
- package/dist/navigation/ts-entry-tables.js +50 -0
- package/dist/navigation/ts-entry-tables.js.map +1 -0
- package/dist/path-set/branches.d.ts +52 -0
- package/dist/path-set/branches.d.ts.map +1 -0
- package/dist/path-set/branches.js +124 -0
- package/dist/path-set/branches.js.map +1 -0
- package/dist/path-set/finding-diff.d.ts +63 -0
- package/dist/path-set/finding-diff.d.ts.map +1 -0
- package/dist/path-set/finding-diff.js +150 -0
- package/dist/path-set/finding-diff.js.map +1 -0
- package/dist/path-set/index.d.ts +18 -0
- package/dist/path-set/index.d.ts.map +1 -0
- package/dist/path-set/index.js +12 -0
- package/dist/path-set/index.js.map +1 -0
- package/dist/path-set/line-diff.d.ts +19 -0
- package/dist/path-set/line-diff.d.ts.map +1 -0
- package/dist/path-set/line-diff.js +98 -0
- package/dist/path-set/line-diff.js.map +1 -0
- package/dist/path-set/path-set.d.ts +88 -0
- package/dist/path-set/path-set.d.ts.map +1 -0
- package/dist/path-set/path-set.js +716 -0
- package/dist/path-set/path-set.js.map +1 -0
- package/dist/path-set/templates.d.ts +42 -0
- package/dist/path-set/templates.d.ts.map +1 -0
- package/dist/path-set/templates.js +119 -0
- package/dist/path-set/templates.js.map +1 -0
- package/dist/path-set/types.d.ts +195 -0
- package/dist/path-set/types.d.ts.map +1 -0
- package/dist/path-set/types.js +8 -0
- package/dist/path-set/types.js.map +1 -0
- package/dist/remedy-class/index.d.ts +12 -0
- package/dist/remedy-class/index.d.ts.map +1 -0
- package/dist/remedy-class/index.js +9 -0
- package/dist/remedy-class/index.js.map +1 -0
- package/dist/remedy-class/match.d.ts +165 -0
- package/dist/remedy-class/match.d.ts.map +1 -0
- package/dist/remedy-class/match.js +705 -0
- package/dist/remedy-class/match.js.map +1 -0
- package/dist/remedy-class/output-context.d.ts +25 -0
- package/dist/remedy-class/output-context.d.ts.map +1 -0
- package/dist/remedy-class/output-context.js +150 -0
- package/dist/remedy-class/output-context.js.map +1 -0
- package/dist/remedy-class/sha256.d.ts +18 -0
- package/dist/remedy-class/sha256.d.ts.map +1 -0
- package/dist/remedy-class/sha256.js +89 -0
- package/dist/remedy-class/sha256.js.map +1 -0
- package/dist/remedy-class/table.d.ts +130 -0
- package/dist/remedy-class/table.d.ts.map +1 -0
- package/dist/remedy-class/table.js +457 -0
- package/dist/remedy-class/table.js.map +1 -0
- package/dist/resolution/cross-file.d.ts +9 -0
- package/dist/resolution/cross-file.d.ts.map +1 -1
- package/dist/resolution/cross-file.js +60 -5
- package/dist/resolution/cross-file.js.map +1 -1
- package/dist/stable-ids/builder.d.ts +20 -0
- package/dist/stable-ids/builder.d.ts.map +1 -0
- package/dist/stable-ids/builder.js +65 -0
- package/dist/stable-ids/builder.js.map +1 -0
- package/dist/stable-ids/diff.d.ts +18 -0
- package/dist/stable-ids/diff.d.ts.map +1 -0
- package/dist/stable-ids/diff.js +37 -0
- package/dist/stable-ids/diff.js.map +1 -0
- package/dist/stable-ids/go.d.ts +28 -0
- package/dist/stable-ids/go.d.ts.map +1 -0
- package/dist/stable-ids/go.js +160 -0
- package/dist/stable-ids/go.js.map +1 -0
- package/dist/stable-ids/hash.d.ts +22 -0
- package/dist/stable-ids/hash.d.ts.map +1 -0
- package/dist/stable-ids/hash.js +167 -0
- package/dist/stable-ids/hash.js.map +1 -0
- package/dist/stable-ids/index.d.ts +30 -0
- package/dist/stable-ids/index.d.ts.map +1 -0
- package/dist/stable-ids/index.js +59 -0
- package/dist/stable-ids/index.js.map +1 -0
- package/dist/stable-ids/java.d.ts +28 -0
- package/dist/stable-ids/java.d.ts.map +1 -0
- package/dist/stable-ids/java.js +224 -0
- package/dist/stable-ids/java.js.map +1 -0
- package/dist/stable-ids/moves.d.ts +87 -0
- package/dist/stable-ids/moves.d.ts.map +1 -0
- package/dist/stable-ids/moves.js +222 -0
- package/dist/stable-ids/moves.js.map +1 -0
- package/dist/stable-ids/nodes.d.ts +32 -0
- package/dist/stable-ids/nodes.d.ts.map +1 -0
- package/dist/stable-ids/nodes.js +92 -0
- package/dist/stable-ids/nodes.js.map +1 -0
- package/dist/stable-ids/normalize.d.ts +35 -0
- package/dist/stable-ids/normalize.d.ts.map +1 -0
- package/dist/stable-ids/normalize.js +174 -0
- package/dist/stable-ids/normalize.js.map +1 -0
- package/dist/stable-ids/parse-errors.d.ts +24 -0
- package/dist/stable-ids/parse-errors.d.ts.map +1 -0
- package/dist/stable-ids/parse-errors.js +46 -0
- package/dist/stable-ids/parse-errors.js.map +1 -0
- package/dist/stable-ids/python.d.ts +27 -0
- package/dist/stable-ids/python.d.ts.map +1 -0
- package/dist/stable-ids/python.js +212 -0
- package/dist/stable-ids/python.js.map +1 -0
- package/dist/stable-ids/ts-parse-errors.d.ts +27 -0
- package/dist/stable-ids/ts-parse-errors.d.ts.map +1 -0
- package/dist/stable-ids/ts-parse-errors.js +75 -0
- package/dist/stable-ids/ts-parse-errors.js.map +1 -0
- package/dist/stable-ids/types.d.ts +106 -0
- package/dist/stable-ids/types.d.ts.map +1 -0
- package/dist/stable-ids/types.js +16 -0
- package/dist/stable-ids/types.js.map +1 -0
- package/dist/stable-ids/typescript.d.ts +30 -0
- package/dist/stable-ids/typescript.d.ts.map +1 -0
- package/dist/stable-ids/typescript.js +362 -0
- package/dist/stable-ids/typescript.js.map +1 -0
- package/dist/types/config.d.ts +9 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/index.d.ts +35 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The version a Maven project's own build files declare for a coordinate,
|
|
3
|
+
* and where that declaration comes from.
|
|
4
|
+
*
|
|
5
|
+
* A resolved dependency set says which version the build used; this says
|
|
6
|
+
* which version the POMs ask for, read from the raw POM of a module and its
|
|
7
|
+
* parents found among the POMs the caller supplies. The two differ when a
|
|
8
|
+
* parent's `<dependencyManagement>` or an imported BOM overrides a module's
|
|
9
|
+
* own bump, which is exactly what a dependency fix has to rule out.
|
|
10
|
+
*
|
|
11
|
+
* Origins, in the order Maven applies them:
|
|
12
|
+
* - `direct` — a literal `<version>` on a `<dependency>` of the module or of
|
|
13
|
+
* a parent (inherited); an explicit version beats `<dependencyManagement>`;
|
|
14
|
+
* - `property` — a `${name}` on it, resolved along the module → parent chain;
|
|
15
|
+
* - `dependencyManagement` — the module's own `<dependencyManagement>`;
|
|
16
|
+
* - `parent-dependencyManagement` — a parent's in the supplied set;
|
|
17
|
+
* - `bom` — managed by an imported BOM (`<scope>import</scope>`): the BOM's
|
|
18
|
+
* content is not in the source tree, so `version` is null unless an
|
|
19
|
+
* effective POM is supplied;
|
|
20
|
+
* - `external-parent` — the module names it without a version and its
|
|
21
|
+
* parent is not in the supplied set (e.g. a framework parent POM);
|
|
22
|
+
* - `unknown` — named without a version and nothing above explains it.
|
|
23
|
+
* A coordinate no POM in the chain names gives `null` (a plain transitive).
|
|
24
|
+
*
|
|
25
|
+
* Regex-scoped XML reading, like the rest of the SBOM module: comments,
|
|
26
|
+
* `<build>`, `<profiles>` and `<reporting>` are set aside, so plugin
|
|
27
|
+
* dependencies and profile-only declarations are not read. Pure; the caller
|
|
28
|
+
* supplies file text and repository-relative paths.
|
|
29
|
+
*/
|
|
30
|
+
const tag = (block, name) => new RegExp(`<${name}>\\s*([^<]*?)\\s*</${name}>`).exec(block)?.[1];
|
|
31
|
+
function stripSection(xml, name) {
|
|
32
|
+
return xml.replace(new RegExp(`<${name}>[\\s\\S]*?</${name}>`, 'g'), '');
|
|
33
|
+
}
|
|
34
|
+
function readDeps(block) {
|
|
35
|
+
const out = [];
|
|
36
|
+
const re = /<dependency>([\s\S]*?)<\/dependency>/g;
|
|
37
|
+
let m;
|
|
38
|
+
while ((m = re.exec(block)) !== null) {
|
|
39
|
+
const b = m[1];
|
|
40
|
+
const g = tag(b, 'groupId');
|
|
41
|
+
const a = tag(b, 'artifactId');
|
|
42
|
+
if (!g || !a)
|
|
43
|
+
continue;
|
|
44
|
+
out.push({ name: `${g}:${a}`, version: tag(b, 'version'), scope: tag(b, 'scope'), type: tag(b, 'type') });
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function parsePom(file) {
|
|
49
|
+
let xml = file.content.replace(/<!--[\s\S]*?-->/g, '');
|
|
50
|
+
for (const s of ['build', 'profiles', 'reporting'])
|
|
51
|
+
xml = stripSection(xml, s);
|
|
52
|
+
const managedBlock = /<dependencyManagement>([\s\S]*?)<\/dependencyManagement>/.exec(xml)?.[1] ?? '';
|
|
53
|
+
xml = stripSection(xml, 'dependencyManagement');
|
|
54
|
+
const parentBlock = /<parent>([\s\S]*?)<\/parent>/.exec(xml)?.[1];
|
|
55
|
+
let parent;
|
|
56
|
+
if (parentBlock) {
|
|
57
|
+
const g = tag(parentBlock, 'groupId');
|
|
58
|
+
const a = tag(parentBlock, 'artifactId');
|
|
59
|
+
if (g && a) {
|
|
60
|
+
parent = { groupId: g, artifactId: a, version: tag(parentBlock, 'version'), relativePath: tag(parentBlock, 'relativePath') ?? '../pom.xml' };
|
|
61
|
+
}
|
|
62
|
+
xml = stripSection(xml, 'parent');
|
|
63
|
+
}
|
|
64
|
+
const properties = new Map();
|
|
65
|
+
const propsBlock = /<properties>([\s\S]*?)<\/properties>/.exec(xml)?.[1];
|
|
66
|
+
if (propsBlock) {
|
|
67
|
+
const re = /<([A-Za-z0-9._-]+)>\s*([^<]*?)\s*<\/\1>/g;
|
|
68
|
+
let m;
|
|
69
|
+
while ((m = re.exec(propsBlock)) !== null)
|
|
70
|
+
properties.set(m[1], m[2]);
|
|
71
|
+
}
|
|
72
|
+
xml = stripSection(xml, 'properties');
|
|
73
|
+
const depsBlock = /<dependencies>([\s\S]*?)<\/dependencies>/.exec(xml)?.[1] ?? '';
|
|
74
|
+
const head = stripSection(xml, 'dependencies');
|
|
75
|
+
return {
|
|
76
|
+
path: file.path,
|
|
77
|
+
coord: { groupId: tag(head, 'groupId') ?? parent?.groupId, artifactId: tag(head, 'artifactId'), version: tag(head, 'version') ?? parent?.version },
|
|
78
|
+
parent,
|
|
79
|
+
properties,
|
|
80
|
+
dependencies: readDeps(depsBlock),
|
|
81
|
+
managed: readDeps(managedBlock),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** POSIX-style join and normalisation of repository-relative paths. */
|
|
85
|
+
function joinPath(dir, rel) {
|
|
86
|
+
const parts = (dir ? `${dir}/${rel}` : rel).split('/');
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const p of parts) {
|
|
89
|
+
if (p === '' || p === '.')
|
|
90
|
+
continue;
|
|
91
|
+
if (p === '..')
|
|
92
|
+
out.pop();
|
|
93
|
+
else
|
|
94
|
+
out.push(p);
|
|
95
|
+
}
|
|
96
|
+
return out.join('/');
|
|
97
|
+
}
|
|
98
|
+
const dirOf = (p) => (p.includes('/') ? p.slice(0, p.lastIndexOf('/')) : '');
|
|
99
|
+
/**
|
|
100
|
+
* Index of the POMs of one source tree, answering the declared version of a
|
|
101
|
+
* coordinate for any module in it.
|
|
102
|
+
*/
|
|
103
|
+
export class MavenDeclaredIndex {
|
|
104
|
+
poms = new Map();
|
|
105
|
+
effective;
|
|
106
|
+
/**
|
|
107
|
+
* @param poms every POM of the tree, with repository-relative paths
|
|
108
|
+
* @param effectivePom optional `mvn help:effective-pom` output for a module:
|
|
109
|
+
* used only to fill in a version the raw POMs leave null (a BOM-managed
|
|
110
|
+
* or external-parent-managed coordinate); the origin still comes from
|
|
111
|
+
* the raw POMs.
|
|
112
|
+
*/
|
|
113
|
+
constructor(poms, effectivePom) {
|
|
114
|
+
for (const p of poms)
|
|
115
|
+
this.poms.set(joinPath('', p.path), parsePom(p));
|
|
116
|
+
if (effectivePom)
|
|
117
|
+
this.effective = parsePom({ path: '(effective)', content: effectivePom });
|
|
118
|
+
}
|
|
119
|
+
/** The module POM followed by every ancestor found in the supplied set. */
|
|
120
|
+
chain(modulePath) {
|
|
121
|
+
const chain = [];
|
|
122
|
+
let cur = this.poms.get(joinPath('', modulePath));
|
|
123
|
+
const visited = new Set();
|
|
124
|
+
while (cur && !visited.has(cur.path)) {
|
|
125
|
+
visited.add(cur.path);
|
|
126
|
+
chain.push(cur);
|
|
127
|
+
const parent = cur.parent;
|
|
128
|
+
if (!parent)
|
|
129
|
+
return { chain };
|
|
130
|
+
const byPath = this.poms.get(joinPath(dirOf(cur.path), parent.relativePath.endsWith('.xml') ? parent.relativePath : `${parent.relativePath}/pom.xml`));
|
|
131
|
+
const matches = (p) => !!p && p.coord.artifactId === parent.artifactId && (p.coord.groupId ?? parent.groupId) === parent.groupId;
|
|
132
|
+
let next = matches(byPath) ? byPath : undefined;
|
|
133
|
+
if (!next)
|
|
134
|
+
for (const p of this.poms.values())
|
|
135
|
+
if (matches(p)) {
|
|
136
|
+
next = p;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
if (!next)
|
|
140
|
+
return { chain, externalParent: `${parent.groupId}:${parent.artifactId}${parent.version ? `:${parent.version}` : ''}` };
|
|
141
|
+
cur = next;
|
|
142
|
+
}
|
|
143
|
+
return { chain };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The declared version of `name` (`groupId:artifactId`) for the module whose
|
|
147
|
+
* POM is at `modulePath`, or null when no POM in its chain names it.
|
|
148
|
+
*/
|
|
149
|
+
declared(modulePath, name) {
|
|
150
|
+
const { chain, externalParent } = this.chain(modulePath);
|
|
151
|
+
if (chain.length === 0)
|
|
152
|
+
return null;
|
|
153
|
+
const module = chain[0];
|
|
154
|
+
const resolve = (raw) => {
|
|
155
|
+
const m = /^\$\{([^}]+)\}$/.exec(raw.trim());
|
|
156
|
+
if (!m)
|
|
157
|
+
return { version: raw.trim() };
|
|
158
|
+
const prop = m[1];
|
|
159
|
+
if (prop === 'project.version' || prop === 'pom.version') {
|
|
160
|
+
return { version: module.coord.version ?? null, property: prop };
|
|
161
|
+
}
|
|
162
|
+
for (const p of chain) {
|
|
163
|
+
const v = p.properties.get(prop);
|
|
164
|
+
if (v !== undefined)
|
|
165
|
+
return /\$\{/.test(v) ? { version: null, property: prop } : { version: v, property: prop };
|
|
166
|
+
}
|
|
167
|
+
return { version: null, property: prop };
|
|
168
|
+
};
|
|
169
|
+
const boms = [];
|
|
170
|
+
for (const p of chain) {
|
|
171
|
+
for (const d of p.managed) {
|
|
172
|
+
if (d.scope === 'import' && d.type === 'pom')
|
|
173
|
+
boms.push(`${d.name}${d.version ? `:${resolve(d.version).version ?? d.version}` : ''}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const fillFromEffective = (r) => {
|
|
177
|
+
if (r.version !== null || !this.effective)
|
|
178
|
+
return r;
|
|
179
|
+
const hit = [...this.effective.dependencies, ...this.effective.managed].find((d) => d.name === name && d.version);
|
|
180
|
+
return hit?.version ? { ...r, version: hit.version } : r;
|
|
181
|
+
};
|
|
182
|
+
// A versioned <dependency> (in the module or inherited from a parent's
|
|
183
|
+
// <dependencies>) beats <dependencyManagement> for that coordinate.
|
|
184
|
+
for (const p of chain) {
|
|
185
|
+
const own = p.dependencies.find((d) => d.name === name && d.version);
|
|
186
|
+
if (!own?.version)
|
|
187
|
+
continue;
|
|
188
|
+
const r = resolve(own.version);
|
|
189
|
+
return r.property
|
|
190
|
+
? { version: r.version, origin: 'property', file: p.path, property: r.property }
|
|
191
|
+
: { version: r.version, origin: 'direct', file: p.path };
|
|
192
|
+
}
|
|
193
|
+
for (let i = 0; i < chain.length; i++) {
|
|
194
|
+
const managed = chain[i].managed.find((d) => d.name === name && d.scope !== 'import');
|
|
195
|
+
if (managed?.version) {
|
|
196
|
+
const r = resolve(managed.version);
|
|
197
|
+
return {
|
|
198
|
+
version: r.version,
|
|
199
|
+
origin: i === 0 ? 'dependencyManagement' : 'parent-dependencyManagement',
|
|
200
|
+
file: chain[i].path,
|
|
201
|
+
...(r.property ? { property: r.property } : {}),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Named without a version (or not named at all) and not managed in the tree.
|
|
206
|
+
const namedHere = chain.find((p) => p.dependencies.some((d) => d.name === name));
|
|
207
|
+
if (boms.length > 0 && namedHere)
|
|
208
|
+
return fillFromEffective({ version: null, origin: 'bom', file: namedHere.path, boms });
|
|
209
|
+
if (externalParent && namedHere)
|
|
210
|
+
return fillFromEffective({ version: null, origin: 'external-parent', file: namedHere.path, parent: externalParent });
|
|
211
|
+
if (namedHere)
|
|
212
|
+
return fillFromEffective({ version: null, origin: 'unknown', file: namedHere.path, ...(boms.length ? { boms } : {}) });
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=maven-declared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maven-declared.js","sourceRoot":"","sources":["../../src/analysis/maven-declared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA+CH,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,IAAY,EAAsB,EAAE,CAC9D,IAAI,MAAM,CAAC,IAAI,IAAI,sBAAsB,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAErE,SAAS,YAAY,CAAC,GAAW,EAAE,IAAY;IAC7C,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,gBAAgB,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,uCAAuC,CAAC;IACnD,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QACvB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC;QAAE,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAE/E,MAAM,YAAY,GAAG,0DAA0D,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrG,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,MAA2B,CAAC;IAChC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,YAAY,EAAE,CAAC;QAC/I,CAAC;QACD,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,UAAU,GAAG,sCAAsC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,EAAE,GAAG,0CAA0C,CAAC;QACtD,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,0CAA0C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClF,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,OAAO,EAAE;QAClJ,MAAM;QACN,UAAU;QACV,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC;QACjC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;YAAE,SAAS;QACpC,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;YACrB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE7F;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACZ,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IACpC,SAAS,CAAa;IAEvC;;;;;;OAMG;IACH,YAAY,IAAe,EAAE,YAAqB;QAChD,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,YAAY;YAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,2EAA2E;IACnE,KAAK,CAAC,UAAkB;QAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC;YACvJ,MAAM,OAAO,GAAG,CAAC,CAAwB,EAAW,EAAE,CACpD,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC;YAC5G,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAChD,IAAI,CAAC,IAAI;gBAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAAE,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;wBAAC,IAAI,GAAG,CAAC,CAAC;wBAAC,MAAM;oBAAC,CAAC;YACnF,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;YACnI,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,UAAkB,EAAE,IAAY;QACvC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAExB,MAAM,OAAO,GAAG,CAAC,GAAW,EAAiD,EAAE;YAC7E,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBACzD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACnE,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjC,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAClH,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxI,CAAC;QACH,CAAC;QACD,MAAM,iBAAiB,GAAG,CAAC,CAAkB,EAAmB,EAAE;YAChE,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;YAClH,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEF,uEAAuE;QACvE,oEAAoE;QACpE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG,EAAE,OAAO;gBAAE,SAAS;YAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,CAAC,CAAC,QAAQ;gBACf,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAChF,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;YACtF,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,6BAA6B;oBACxE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;oBACnB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6EAA6E;QAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QACjF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS;YAAE,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzH,IAAI,cAAc,IAAI,SAAS;YAAE,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QACtJ,IAAI,SAAS;YAAE,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtI,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maven version ordering — the ordering Maven itself uses to compare
|
|
3
|
+
* artifact versions (`org.apache.maven.artifact.versioning.ComparableVersion`),
|
|
4
|
+
* reimplemented from its documented rules so advisory ranges keyed on Maven
|
|
5
|
+
* versions (`introduced` / `fixed` / `last_affected`) are evaluated the way
|
|
6
|
+
* the build resolves them.
|
|
7
|
+
*
|
|
8
|
+
* Rules:
|
|
9
|
+
* - case-insensitive; items are separated by `.` and `-`, and a transition
|
|
10
|
+
* between digits and letters splits an item too (`1rc2` = `1-rc-2`);
|
|
11
|
+
* - `-` (and a digit/letter transition) opens a nested sub-list, `.` does not,
|
|
12
|
+
* except before a qualifier (`1.RC1` = `1-RC1`, as Maven 3.9 orders it);
|
|
13
|
+
* - an empty item is `0`;
|
|
14
|
+
* - "null" items — `0`, `""`, `final`, `ga`, `release` — are trimmed from the
|
|
15
|
+
* end of every list, so `1.0.0` = `1` = `1.0-final` = `1-ga`;
|
|
16
|
+
* - qualifiers order `alpha < beta < milestone < rc (= cr) < snapshot <
|
|
17
|
+
* "" (release) < sp`; `a`, `b`, `m` directly followed by a digit mean
|
|
18
|
+
* `alpha`, `beta`, `milestone`; any other qualifier sorts after all known
|
|
19
|
+
* ones, lexically;
|
|
20
|
+
* - a number is greater than any qualifier, and greater than a sub-list.
|
|
21
|
+
*
|
|
22
|
+
* Pure and synchronous; numbers of any length are compared exactly.
|
|
23
|
+
*/
|
|
24
|
+
/** Compare two Maven versions: negative, zero or positive, as Maven orders them. */
|
|
25
|
+
export declare function compareMavenVersions(a: string, b: string): number;
|
|
26
|
+
/** The canonical form Maven compares by (useful in tests and diagnostics). */
|
|
27
|
+
export declare function canonicalMavenVersion(version: string): string;
|
|
28
|
+
//# sourceMappingURL=maven-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maven-version.d.ts","sourceRoot":"","sources":["../../src/analysis/maven-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA8HH,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAU7D"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maven version ordering — the ordering Maven itself uses to compare
|
|
3
|
+
* artifact versions (`org.apache.maven.artifact.versioning.ComparableVersion`),
|
|
4
|
+
* reimplemented from its documented rules so advisory ranges keyed on Maven
|
|
5
|
+
* versions (`introduced` / `fixed` / `last_affected`) are evaluated the way
|
|
6
|
+
* the build resolves them.
|
|
7
|
+
*
|
|
8
|
+
* Rules:
|
|
9
|
+
* - case-insensitive; items are separated by `.` and `-`, and a transition
|
|
10
|
+
* between digits and letters splits an item too (`1rc2` = `1-rc-2`);
|
|
11
|
+
* - `-` (and a digit/letter transition) opens a nested sub-list, `.` does not,
|
|
12
|
+
* except before a qualifier (`1.RC1` = `1-RC1`, as Maven 3.9 orders it);
|
|
13
|
+
* - an empty item is `0`;
|
|
14
|
+
* - "null" items — `0`, `""`, `final`, `ga`, `release` — are trimmed from the
|
|
15
|
+
* end of every list, so `1.0.0` = `1` = `1.0-final` = `1-ga`;
|
|
16
|
+
* - qualifiers order `alpha < beta < milestone < rc (= cr) < snapshot <
|
|
17
|
+
* "" (release) < sp`; `a`, `b`, `m` directly followed by a digit mean
|
|
18
|
+
* `alpha`, `beta`, `milestone`; any other qualifier sorts after all known
|
|
19
|
+
* ones, lexically;
|
|
20
|
+
* - a number is greater than any qualifier, and greater than a sub-list.
|
|
21
|
+
*
|
|
22
|
+
* Pure and synchronous; numbers of any length are compared exactly.
|
|
23
|
+
*/
|
|
24
|
+
const QUALIFIERS = ['alpha', 'beta', 'milestone', 'rc', 'snapshot', '', 'sp'];
|
|
25
|
+
const RELEASE_INDEX = String(QUALIFIERS.indexOf(''));
|
|
26
|
+
const ALIASES = { ga: '', final: '', release: '', cr: 'rc' };
|
|
27
|
+
function comparableQualifier(q) {
|
|
28
|
+
const i = QUALIFIERS.indexOf(q);
|
|
29
|
+
return i === -1 ? `${QUALIFIERS.length}-${q}` : String(i);
|
|
30
|
+
}
|
|
31
|
+
function stringItem(value, followedByDigit) {
|
|
32
|
+
let v = value;
|
|
33
|
+
if (followedByDigit && v.length === 1) {
|
|
34
|
+
if (v === 'a')
|
|
35
|
+
v = 'alpha';
|
|
36
|
+
else if (v === 'b')
|
|
37
|
+
v = 'beta';
|
|
38
|
+
else if (v === 'm')
|
|
39
|
+
v = 'milestone';
|
|
40
|
+
}
|
|
41
|
+
return { kind: 'string', value: ALIASES[v] ?? v };
|
|
42
|
+
}
|
|
43
|
+
function parseItem(buf, isDigit, followedByDigit) {
|
|
44
|
+
if (isDigit)
|
|
45
|
+
return { kind: 'int', value: BigInt(buf) };
|
|
46
|
+
return stringItem(buf, followedByDigit);
|
|
47
|
+
}
|
|
48
|
+
function isNull(item) {
|
|
49
|
+
if (item.kind === 'int')
|
|
50
|
+
return item.value === 0n;
|
|
51
|
+
if (item.kind === 'string')
|
|
52
|
+
return comparableQualifier(item.value) === RELEASE_INDEX;
|
|
53
|
+
return item.items.length === 0;
|
|
54
|
+
}
|
|
55
|
+
function normalize(list) {
|
|
56
|
+
for (let i = list.items.length - 1; i >= 0; i--) {
|
|
57
|
+
const last = list.items[i];
|
|
58
|
+
if (isNull(last))
|
|
59
|
+
list.items.splice(i, 1);
|
|
60
|
+
else if (last.kind !== 'list')
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function parse(version) {
|
|
65
|
+
// Maven 3.9 (MNG-7644): a qualifier after `.` sorts as if after `-`, so
|
|
66
|
+
// `1.0.0.RC1` = `1.0.0-RC1` and `1.foo` = `1-foo`.
|
|
67
|
+
const v = version.trim().toLowerCase().replace(/\.(?=[a-z])/g, '-');
|
|
68
|
+
const root = { kind: 'list', items: [] };
|
|
69
|
+
let list = root;
|
|
70
|
+
const stack = [root];
|
|
71
|
+
let isDigit = false;
|
|
72
|
+
let start = 0;
|
|
73
|
+
const isDigitAt = (i) => i < v.length && v[i] >= '0' && v[i] <= '9';
|
|
74
|
+
const pushSubList = () => {
|
|
75
|
+
const sub = { kind: 'list', items: [] };
|
|
76
|
+
list.items.push(sub);
|
|
77
|
+
list = sub;
|
|
78
|
+
stack.push(sub);
|
|
79
|
+
};
|
|
80
|
+
for (let i = 0; i < v.length; i++) {
|
|
81
|
+
const c = v[i];
|
|
82
|
+
if (c === '.' || c === '-') {
|
|
83
|
+
if (i === start)
|
|
84
|
+
list.items.push({ kind: 'int', value: 0n });
|
|
85
|
+
else
|
|
86
|
+
list.items.push(parseItem(v.slice(start, i), isDigit, isDigitAt(i + 1)));
|
|
87
|
+
start = i + 1;
|
|
88
|
+
if (c === '-')
|
|
89
|
+
pushSubList();
|
|
90
|
+
isDigit = false;
|
|
91
|
+
}
|
|
92
|
+
else if (c >= '0' && c <= '9') {
|
|
93
|
+
if (!isDigit && i > start) {
|
|
94
|
+
list.items.push(stringItem(v.slice(start, i), true));
|
|
95
|
+
start = i;
|
|
96
|
+
pushSubList();
|
|
97
|
+
}
|
|
98
|
+
isDigit = true;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
if (isDigit && i > start) {
|
|
102
|
+
list.items.push(parseItem(v.slice(start, i), true, false));
|
|
103
|
+
start = i;
|
|
104
|
+
pushSubList();
|
|
105
|
+
}
|
|
106
|
+
isDigit = false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (v.length > start)
|
|
110
|
+
list.items.push(parseItem(v.slice(start), isDigit, false));
|
|
111
|
+
while (stack.length > 0)
|
|
112
|
+
normalize(stack.pop());
|
|
113
|
+
return root;
|
|
114
|
+
}
|
|
115
|
+
function compareItem(a, b) {
|
|
116
|
+
if (a === undefined) {
|
|
117
|
+
if (b === undefined)
|
|
118
|
+
return 0;
|
|
119
|
+
return -compareItem(b, undefined);
|
|
120
|
+
}
|
|
121
|
+
switch (a.kind) {
|
|
122
|
+
case 'int':
|
|
123
|
+
if (b === undefined)
|
|
124
|
+
return a.value === 0n ? 0 : 1;
|
|
125
|
+
if (b.kind === 'int')
|
|
126
|
+
return a.value < b.value ? -1 : a.value > b.value ? 1 : 0;
|
|
127
|
+
return 1; // a number beats a qualifier and a sub-list
|
|
128
|
+
case 'string': {
|
|
129
|
+
if (b === undefined)
|
|
130
|
+
return cmpStr(comparableQualifier(a.value), RELEASE_INDEX);
|
|
131
|
+
if (b.kind === 'int' || b.kind === 'list')
|
|
132
|
+
return -1;
|
|
133
|
+
return cmpStr(comparableQualifier(a.value), comparableQualifier(b.value));
|
|
134
|
+
}
|
|
135
|
+
case 'list': {
|
|
136
|
+
if (b === undefined)
|
|
137
|
+
return a.items.length === 0 ? 0 : compareItem(a.items[0], undefined);
|
|
138
|
+
if (b.kind === 'int')
|
|
139
|
+
return -1;
|
|
140
|
+
if (b.kind === 'string')
|
|
141
|
+
return 1;
|
|
142
|
+
const n = Math.max(a.items.length, b.items.length);
|
|
143
|
+
for (let i = 0; i < n; i++) {
|
|
144
|
+
const r = compareItem(a.items[i], b.items[i]);
|
|
145
|
+
if (r !== 0)
|
|
146
|
+
return r;
|
|
147
|
+
}
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function cmpStr(a, b) {
|
|
153
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
154
|
+
}
|
|
155
|
+
/** Compare two Maven versions: negative, zero or positive, as Maven orders them. */
|
|
156
|
+
export function compareMavenVersions(a, b) {
|
|
157
|
+
return Math.sign(compareItem(parse(a), parse(b)));
|
|
158
|
+
}
|
|
159
|
+
/** The canonical form Maven compares by (useful in tests and diagnostics). */
|
|
160
|
+
export function canonicalMavenVersion(version) {
|
|
161
|
+
const render = (list) => {
|
|
162
|
+
let out = '';
|
|
163
|
+
for (const item of list.items) {
|
|
164
|
+
if (out.length > 0)
|
|
165
|
+
out += item.kind === 'list' ? '-' : '.';
|
|
166
|
+
out += item.kind === 'int' ? item.value.toString() : item.kind === 'string' ? item.value : render(item);
|
|
167
|
+
}
|
|
168
|
+
return out;
|
|
169
|
+
};
|
|
170
|
+
return render(parse(version));
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=maven-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maven-version.js","sourceRoot":"","sources":["../../src/analysis/maven-version.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant-propagation-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAA8B,KAAK,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGvG,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC,qBAAa,uBAAwB,YAAW,YAAY,CAAC,wBAAwB,CAAC;IAIxE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,YAA6B,IAAI,EAAE,IAAI,EAAI;IAE3C,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,
|
|
1
|
+
{"version":3,"file":"constant-propagation-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAA8B,KAAK,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGvG,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC,qBAAa,uBAAwB,YAAW,YAAY,CAAC,wBAAwB,CAAC;IAIxE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,YAA6B,IAAI,EAAE,IAAI,EAAI;IAE3C,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CA0B9C;CACF"}
|
|
@@ -35,10 +35,38 @@ export class ConstantPropagationPass {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
const result = analyzeConstantPropagation(this.tree, code, {
|
|
39
39
|
sanitizerMethods: taintMatcher.sanitizerMethods,
|
|
40
40
|
taintedParameters,
|
|
41
41
|
});
|
|
42
|
+
if (ctx.language === 'java')
|
|
43
|
+
pruneDeadChains(ctx, result.unreachableLines);
|
|
44
|
+
return result;
|
|
42
45
|
}
|
|
43
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Java: a def on a line const-prop proved unreachable (`else bar = param;`
|
|
49
|
+
* under a constant-true condition) propagates nothing. Drop its DFG chains so
|
|
50
|
+
* every chain walker — notably the cross-file interprocedural phase, which
|
|
51
|
+
* has no const-prop of its own — sees only live paths (#976: the try defs
|
|
52
|
+
* exposed OWASP dead-branch helpers whose source is in another file).
|
|
53
|
+
*/
|
|
54
|
+
function pruneDeadChains(ctx, unreachable) {
|
|
55
|
+
if (unreachable.size === 0)
|
|
56
|
+
return;
|
|
57
|
+
const dfg = ctx.graph.ir.dfg;
|
|
58
|
+
if (!dfg.chains || dfg.chains.length === 0)
|
|
59
|
+
return;
|
|
60
|
+
// Unreachable lines are line-granular: a ternary's dead arm marks the line of
|
|
61
|
+
// a live def (`bar = c ? "never" : param;`), so such lines are left alone.
|
|
62
|
+
const lines = ctx.code.split('\n');
|
|
63
|
+
const dead = new Set();
|
|
64
|
+
for (const d of dfg.defs) {
|
|
65
|
+
if (unreachable.has(d.line) && !/\?[^?.:]*:/.test(lines[d.line - 1] ?? ''))
|
|
66
|
+
dead.add(d.id);
|
|
67
|
+
}
|
|
68
|
+
if (dead.size === 0)
|
|
69
|
+
return;
|
|
70
|
+
dfg.chains = dfg.chains.filter(c => !dead.has(c.from_def) && !dead.has(c.to_def));
|
|
71
|
+
}
|
|
44
72
|
//# sourceMappingURL=constant-propagation-pass.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant-propagation-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,0BAA0B,EAAiC,MAAM,4BAA4B,CAAC;AAKvG,MAAM,OAAO,uBAAuB;IAIL,IAAI;IAHxB,IAAI,GAAG,sBAAsB,CAAC;IAC9B,QAAQ,GAAG,UAAmB,CAAC;IAExC,YAA6B,IAAU;oBAAV,IAAI;IAAS,CAAC;IAE3C,GAAG,CAAC,GAAgB;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACrB,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAqB,eAAe,CAAC,CAAC;QAExE,iFAAiF;QACjF,gFAAgF;QAChF,MAAM,iBAAiB,GAAqD,EAAE,CAAC;QAC/E,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBAC5C,uDAAuD;gBACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAClE,IAAI,KAAK,EAAE,CAAC;oBACV,iBAAiB,CAAC,IAAI,CAAC;wBACrB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;wBACpB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"constant-propagation-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,0BAA0B,EAAiC,MAAM,4BAA4B,CAAC;AAKvG,MAAM,OAAO,uBAAuB;IAIL,IAAI;IAHxB,IAAI,GAAG,sBAAsB,CAAC;IAC9B,QAAQ,GAAG,UAAmB,CAAC;IAExC,YAA6B,IAAU;oBAAV,IAAI;IAAS,CAAC;IAE3C,GAAG,CAAC,GAAgB;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACrB,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAqB,eAAe,CAAC,CAAC;QAExE,iFAAiF;QACjF,gFAAgF;QAChF,MAAM,iBAAiB,GAAqD,EAAE,CAAC;QAC/E,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBAC5C,uDAAuD;gBACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAClE,IAAI,KAAK,EAAE,CAAC;oBACV,iBAAiB,CAAC,IAAI,CAAC;wBACrB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;wBACpB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YACzD,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,iBAAiB;SAClB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM;YAAE,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,GAAgB,EAAE,WAAgC;IACzE,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IACnC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACnD,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC5B,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAKd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,8CAA8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,uCAAuC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,GAAG,CACD,YAAY,EAAE,YAAY;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAKd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,8CAA8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,uCAAuC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,GAAG,CACD,YAAY,EAAE,YAAY;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAoSrB;CACF"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { logger } from '../../utils/logger.js';
|
|
14
14
|
import { sanitizerCoversSink } from '../sanitizer-index.js';
|
|
15
15
|
import { CSharpCredit } from './csharp-sanitizer-credit.js';
|
|
16
|
-
import { csharpParamReachesSink } from './interprocedural-pass.js';
|
|
16
|
+
import { calleeReturnMayCarryParam, csharpParamReachesSink } from './interprocedural-pass.js';
|
|
17
17
|
export class CrossFilePass {
|
|
18
18
|
run(projectGraph,
|
|
19
19
|
/** Raw source lines per file (used to populate `code` fields in paths). */
|
|
@@ -165,6 +165,10 @@ export class CrossFilePass {
|
|
|
165
165
|
!csharpCalleeReachesSink(sinkIR, sourceLines.get(p.sink.file) ?? [], sinkHop.method, p.calleeArgPositions, matchedSink, callHop?.kind === 'sink_call' ? sourceLines.get(callHop.file)?.[callHop.line - 1] : undefined)) {
|
|
166
166
|
continue;
|
|
167
167
|
}
|
|
168
|
+
if (sinkIR.meta.language === 'java' &&
|
|
169
|
+
javaHelperStopsCallerPath(sinkIR, sourceLines.get(p.sink.file) ?? [], p)) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
168
172
|
const srcLines = sourceLines.get(p.source.file) ?? [];
|
|
169
173
|
const tgtLines = sourceLines.get(p.sink.file) ?? [];
|
|
170
174
|
// Dedup against any direct cross-file taint already emitted at the same
|
|
@@ -468,4 +472,80 @@ function findCrossInstanceAliasingPaths(projectGraph, _sourceLines) {
|
|
|
468
472
|
}
|
|
469
473
|
return paths;
|
|
470
474
|
}
|
|
475
|
+
/**
|
|
476
|
+
* Java (#976): the interprocedural walker follows the caller's DFG chains
|
|
477
|
+
* through `bar = new Test().doSomething(request, param)` without asking whether
|
|
478
|
+
* that same-file helper can return its argument. Re-walk the caller side from
|
|
479
|
+
* the last hop before the sink, stopping at defs assigned from a same-file
|
|
480
|
+
* method that #1010's helper-return gate shows returns no parameter (a
|
|
481
|
+
* constant-folding ternary, a list read of a safe slot). True when the sink is
|
|
482
|
+
* then no longer reached. Without chains, or with nothing to stop, nothing changes.
|
|
483
|
+
*/
|
|
484
|
+
function javaHelperStopsCallerPath(ir, lines, p) {
|
|
485
|
+
const chains = ir.dfg.chains;
|
|
486
|
+
if (!chains || chains.length === 0 || lines.length === 0)
|
|
487
|
+
return false;
|
|
488
|
+
const hops = p.hops;
|
|
489
|
+
const before = hops.length >= 2 ? hops[hops.length - 2] : undefined;
|
|
490
|
+
if (!before || before.file !== p.sink.file || before.line >= p.sink.line)
|
|
491
|
+
return false;
|
|
492
|
+
const code = lines.join('\n');
|
|
493
|
+
const localMethods = new Map();
|
|
494
|
+
for (const t of ir.types)
|
|
495
|
+
for (const m of t.methods) {
|
|
496
|
+
const arr = localMethods.get(m.name) ?? [];
|
|
497
|
+
arr.push({ start: m.start_line, end: m.end_line });
|
|
498
|
+
localMethods.set(m.name, arr);
|
|
499
|
+
}
|
|
500
|
+
const blockedLine = new Map();
|
|
501
|
+
const isBlocked = (line) => {
|
|
502
|
+
let b = blockedLine.get(line);
|
|
503
|
+
if (b !== undefined)
|
|
504
|
+
return b;
|
|
505
|
+
b = false;
|
|
506
|
+
for (const c of ir.calls) {
|
|
507
|
+
if (c.location.line !== line)
|
|
508
|
+
continue;
|
|
509
|
+
const ms = localMethods.get(c.method_name);
|
|
510
|
+
if (!ms || ms.length !== 1)
|
|
511
|
+
continue;
|
|
512
|
+
if (!calleeReturnMayCarryParam(code, ms[0].start, ms[0].end, [])) {
|
|
513
|
+
b = true;
|
|
514
|
+
break;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
blockedLine.set(line, b);
|
|
518
|
+
return b;
|
|
519
|
+
};
|
|
520
|
+
const lineOf = new Map();
|
|
521
|
+
for (const d of ir.dfg.defs)
|
|
522
|
+
lineOf.set(d.id, d.line);
|
|
523
|
+
const seeds = ir.dfg.defs.filter(d => d.line === before.line && d.kind === 'local').map(d => d.id);
|
|
524
|
+
if (seeds.length === 0)
|
|
525
|
+
return false;
|
|
526
|
+
let stopped = false;
|
|
527
|
+
const reached = new Set(seeds);
|
|
528
|
+
const frontier = [...seeds];
|
|
529
|
+
while (frontier.length > 0) {
|
|
530
|
+
const cur = frontier.pop();
|
|
531
|
+
for (const ch of chains) {
|
|
532
|
+
if (ch.from_def !== cur || reached.has(ch.to_def))
|
|
533
|
+
continue;
|
|
534
|
+
const l = lineOf.get(ch.to_def);
|
|
535
|
+
if (l !== undefined && l !== before.line && isBlocked(l)) {
|
|
536
|
+
stopped = true;
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
reached.add(ch.to_def);
|
|
540
|
+
frontier.push(ch.to_def);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
if (!stopped)
|
|
544
|
+
return false;
|
|
545
|
+
// The sink statement may wrap: its arguments can sit on later lines.
|
|
546
|
+
let end = p.sink.line;
|
|
547
|
+
while (end < lines.length && !/[;{}]\s*$/.test((lines[end - 1] ?? '').replace(/\/\/.*$/, '').trimEnd()))
|
|
548
|
+
end++;
|
|
549
|
+
return !ir.dfg.uses.some(u => u.line >= p.sink.line && u.line <= end && u.def_id !== null && reached.has(u.def_id));
|
|
550
|
+
}
|
|
471
551
|
//# sourceMappingURL=cross-file-pass.js.map
|