@hookwarden/engine 0.0.1 → 0.1.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/adapters/django.d.ts +4 -0
- package/dist/adapters/django.d.ts.map +1 -0
- package/dist/adapters/django.js +148 -0
- package/dist/adapters/django.js.map +1 -0
- package/dist/adapters/fastapi.d.ts +4 -0
- package/dist/adapters/fastapi.d.ts.map +1 -0
- package/dist/adapters/fastapi.js +118 -0
- package/dist/adapters/fastapi.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +10 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/nextjs.d.ts +4 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.js +82 -0
- package/dist/adapters/nextjs.js.map +1 -0
- package/dist/evaluate.d.ts +6 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +108 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/evaluator/index.d.ts +4 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +4 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/evaluator/matchers.d.ts +13 -0
- package/dist/evaluator/matchers.d.ts.map +1 -0
- package/dist/evaluator/matchers.js +124 -0
- package/dist/evaluator/matchers.js.map +1 -0
- package/dist/evaluator/parse-error.d.ts +4 -0
- package/dist/evaluator/parse-error.d.ts.map +1 -0
- package/dist/evaluator/parse-error.js +46 -0
- package/dist/evaluator/parse-error.js.map +1 -0
- package/dist/evaluator/path-severity-overrides.d.ts +4 -0
- package/dist/evaluator/path-severity-overrides.d.ts.map +1 -0
- package/dist/evaluator/path-severity-overrides.js +29 -0
- package/dist/evaluator/path-severity-overrides.js.map +1 -0
- package/dist/evaluator/visit.d.ts +16 -0
- package/dist/evaluator/visit.d.ts.map +1 -0
- package/dist/evaluator/visit.js +96 -0
- package/dist/evaluator/visit.js.map +1 -0
- package/dist/findings/fingerprint.d.ts +22 -0
- package/dist/findings/fingerprint.d.ts.map +1 -0
- package/dist/findings/fingerprint.js +39 -0
- package/dist/findings/fingerprint.js.map +1 -0
- package/dist/findings/index.d.ts +3 -0
- package/dist/findings/index.d.ts.map +1 -0
- package/dist/findings/index.js +4 -0
- package/dist/findings/index.js.map +1 -0
- package/dist/findings/webcrypto.d.ts +2 -0
- package/dist/findings/webcrypto.d.ts.map +1 -0
- package/dist/findings/webcrypto.js +15 -0
- package/dist/findings/webcrypto.js.map +1 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/model/build.d.ts +12 -0
- package/dist/model/build.d.ts.map +1 -0
- package/dist/model/build.js +186 -0
- package/dist/model/build.js.map +1 -0
- package/dist/model/catalog.d.ts +17 -0
- package/dist/model/catalog.d.ts.map +1 -0
- package/dist/model/catalog.js +303 -0
- package/dist/model/catalog.js.map +1 -0
- package/dist/model/evidence.d.ts +18 -0
- package/dist/model/evidence.d.ts.map +1 -0
- package/dist/model/evidence.js +114 -0
- package/dist/model/evidence.js.map +1 -0
- package/dist/model/index.d.ts +6 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +7 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/middleware.d.ts +10 -0
- package/dist/model/middleware.d.ts.map +1 -0
- package/dist/model/middleware.js +140 -0
- package/dist/model/middleware.js.map +1 -0
- package/dist/model/reachability.d.ts +11 -0
- package/dist/model/reachability.d.ts.map +1 -0
- package/dist/model/reachability.js +260 -0
- package/dist/model/reachability.js.map +1 -0
- package/dist/parsers/babel.d.ts +11 -0
- package/dist/parsers/babel.d.ts.map +1 -0
- package/dist/parsers/babel.js +121 -0
- package/dist/parsers/babel.js.map +1 -0
- package/dist/parsers/index.d.ts +6 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +7 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/literals.d.ts +4 -0
- package/dist/parsers/literals.d.ts.map +1 -0
- package/dist/parsers/literals.js +37 -0
- package/dist/parsers/literals.js.map +1 -0
- package/dist/parsers/python-literals.d.ts +5 -0
- package/dist/parsers/python-literals.d.ts.map +1 -0
- package/dist/parsers/python-literals.js +62 -0
- package/dist/parsers/python-literals.js.map +1 -0
- package/dist/parsers/python-loader.d.ts +9 -0
- package/dist/parsers/python-loader.d.ts.map +1 -0
- package/dist/parsers/python-loader.js +16 -0
- package/dist/parsers/python-loader.js.map +1 -0
- package/dist/parsers/python.d.ts +8 -0
- package/dist/parsers/python.d.ts.map +1 -0
- package/dist/parsers/python.js +125 -0
- package/dist/parsers/python.js.map +1 -0
- package/dist/parsers/walk.d.ts +15 -0
- package/dist/parsers/walk.d.ts.map +1 -0
- package/dist/parsers/walk.js +66 -0
- package/dist/parsers/walk.js.map +1 -0
- package/dist/redaction/index.d.ts +3 -0
- package/dist/redaction/index.d.ts.map +1 -0
- package/dist/redaction/index.js +2 -0
- package/dist/redaction/index.js.map +1 -0
- package/dist/redaction/structural.d.ts +14 -0
- package/dist/redaction/structural.d.ts.map +1 -0
- package/dist/redaction/structural.js +37 -0
- package/dist/redaction/structural.js.map +1 -0
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/finding.d.ts +32 -0
- package/dist/types/finding.d.ts.map +1 -0
- package/dist/types/finding.js +12 -0
- package/dist/types/finding.js.map +1 -0
- package/dist/types/handler.d.ts +39 -0
- package/dist/types/handler.d.ts.map +1 -0
- package/dist/types/handler.js +7 -0
- package/dist/types/handler.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project-model.d.ts +42 -0
- package/dist/types/project-model.d.ts.map +1 -0
- package/dist/types/project-model.js +5 -0
- package/dist/types/project-model.js.map +1 -0
- package/dist/types/rule-set.d.ts +42 -0
- package/dist/types/rule-set.d.ts.map +1 -0
- package/dist/types/rule-set.js +6 -0
- package/dist/types/rule-set.js.map +1 -0
- package/dist/types/scan-result.d.ts +19 -0
- package/dist/types/scan-result.d.ts.map +1 -0
- package/dist/types/scan-result.js +8 -0
- package/dist/types/scan-result.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +18 -4
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// D-32: every candidate handler is enriched with WebhookEvidence[] derived from the provider
|
|
2
|
+
// catalog. Engine computes evidence; rules query thresholds. Engine never decides "is webhook?" —
|
|
3
|
+
// that's rule-side. Engine assigns provider attribution heuristically (worst case "unknown").
|
|
4
|
+
//
|
|
5
|
+
// Phase 2 split: this function emits 6 of the 7 D-32 signals. The seventh —
|
|
6
|
+
// `sdk_verify_call` — is appended in Plan 06b's build.ts after reachable_symbols is computed.
|
|
7
|
+
export function computeEvidence(input) {
|
|
8
|
+
const out = [];
|
|
9
|
+
const handlerLoc = input.handler.location;
|
|
10
|
+
const handlerText = input.parsedFile.source_text.slice(input.handler.handler_source_start, input.handler.handler_source_end);
|
|
11
|
+
// Signal A — path_pattern_match (catalog conventional_paths).
|
|
12
|
+
for (const [providerName, entry] of Object.entries(input.providerCatalog)) {
|
|
13
|
+
for (const conv of entry.conventional_paths) {
|
|
14
|
+
if (input.handler.route_pattern.toLowerCase().includes(conv.toLowerCase())) {
|
|
15
|
+
out.push({
|
|
16
|
+
kind: "path_pattern_match",
|
|
17
|
+
provider: providerName,
|
|
18
|
+
location: handlerLoc,
|
|
19
|
+
detail: conv,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Signal B — sdk_import (catalog sdk_packages).
|
|
25
|
+
for (const [providerName, entry] of Object.entries(input.providerCatalog)) {
|
|
26
|
+
for (const pkg of entry.sdk_packages) {
|
|
27
|
+
if (input.imports.some((i) => i.to_module === pkg)) {
|
|
28
|
+
out.push({
|
|
29
|
+
kind: "sdk_import",
|
|
30
|
+
provider: providerName,
|
|
31
|
+
location: handlerLoc,
|
|
32
|
+
detail: pkg,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Signal C — secret_env_var_reference (catalog secret_env_prefix). Substring match within the
|
|
38
|
+
// handler's source range so we count only references in/near this handler.
|
|
39
|
+
for (const [providerName, entry] of Object.entries(input.providerCatalog)) {
|
|
40
|
+
for (const env of entry.secret_env_prefix) {
|
|
41
|
+
if (handlerText.includes(env)) {
|
|
42
|
+
out.push({
|
|
43
|
+
kind: "secret_env_var_reference",
|
|
44
|
+
provider: providerName,
|
|
45
|
+
location: handlerLoc,
|
|
46
|
+
detail: env,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Signal D — secret_literal_match (catalog secret_literal_prefix). Restricted to handler text.
|
|
52
|
+
for (const [providerName, entry] of Object.entries(input.providerCatalog)) {
|
|
53
|
+
for (const prefix of entry.secret_literal_prefix) {
|
|
54
|
+
if (handlerText.includes(prefix)) {
|
|
55
|
+
out.push({
|
|
56
|
+
kind: "secret_literal_match",
|
|
57
|
+
provider: providerName,
|
|
58
|
+
location: handlerLoc,
|
|
59
|
+
detail: prefix,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Signal E — signature_header_read (catalog signature_header). Substring match on handler text.
|
|
65
|
+
for (const [providerName, entry] of Object.entries(input.providerCatalog)) {
|
|
66
|
+
for (const header of entry.signature_header) {
|
|
67
|
+
if (handlerText.toLowerCase().includes(header.toLowerCase())) {
|
|
68
|
+
out.push({
|
|
69
|
+
kind: "signature_header_read",
|
|
70
|
+
provider: providerName,
|
|
71
|
+
location: handlerLoc,
|
|
72
|
+
detail: header,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Signal F — body_as_bytes_or_buffer. Heuristic token search inside the handler.
|
|
78
|
+
if (/(Buffer|Uint8Array|\braw\b|\bbytes\b|c\.req\.raw|request\.get_data\(\)|request\.body)/i.test(handlerText)) {
|
|
79
|
+
out.push({
|
|
80
|
+
kind: "body_as_bytes_or_buffer",
|
|
81
|
+
provider: "unknown",
|
|
82
|
+
location: handlerLoc,
|
|
83
|
+
detail: "heuristic",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Signal G — sdk_verify_call: NOT EMITTED HERE. Plan 06b's build.ts appends it after computing
|
|
87
|
+
// reachable_symbols, by cross-checking against catalog.providers[*].sdk_verify_calls.
|
|
88
|
+
// Provider attribution — most-cited provider wins; ties → "multiple"; zero → "unknown".
|
|
89
|
+
const counts = new Map();
|
|
90
|
+
for (const e of out) {
|
|
91
|
+
if (e.provider === "unknown")
|
|
92
|
+
continue;
|
|
93
|
+
counts.set(e.provider, (counts.get(e.provider) ?? 0) + 1);
|
|
94
|
+
}
|
|
95
|
+
let topProvider = "unknown";
|
|
96
|
+
let topCount = 0;
|
|
97
|
+
let tied = false;
|
|
98
|
+
for (const [p, c] of counts) {
|
|
99
|
+
if (c > topCount) {
|
|
100
|
+
topProvider = p;
|
|
101
|
+
topCount = c;
|
|
102
|
+
tied = false;
|
|
103
|
+
}
|
|
104
|
+
else if (c === topCount && c > 0) {
|
|
105
|
+
tied = true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const provider = tied ? "multiple" : topProvider;
|
|
109
|
+
return { evidence: out, provider };
|
|
110
|
+
}
|
|
111
|
+
export function locationFromCandidate(handler) {
|
|
112
|
+
return handler.location;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/model/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { type BuildProjectModelInput, buildProjectModel } from "./build.js";
|
|
2
|
+
export { type CandidateHandler, detectCatalogHandlers } from "./catalog.js";
|
|
3
|
+
export { type ComputeEvidenceInput, type ComputeEvidenceOutput, computeEvidence, locationFromCandidate, } from "./evidence.js";
|
|
4
|
+
export { type ExtractMiddlewareInput, extractMiddlewareChain, } from "./middleware.js";
|
|
5
|
+
export { type ComputeReachabilityInput, computeReachableSymbols, } from "./reachability.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,KAAK,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,eAAe,EACf,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,sBAAsB,EAC3B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,wBAAwB,EAC7B,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// model/ barrel — Plan 06a + 06b combined surface.
|
|
2
|
+
export { buildProjectModel } from "./build.js";
|
|
3
|
+
export { detectCatalogHandlers } from "./catalog.js";
|
|
4
|
+
export { computeEvidence, locationFromCandidate, } from "./evidence.js";
|
|
5
|
+
export { extractMiddlewareChain, } from "./middleware.js";
|
|
6
|
+
export { computeReachableSymbols, } from "./reachability.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAA+B,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAyB,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAGL,eAAe,EACf,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResolvedMiddleware } from "../types/handler.js";
|
|
2
|
+
import type { ImportEdge, ParsedFile } from "../types/project-model.js";
|
|
3
|
+
import type { CandidateHandler } from "./catalog.js";
|
|
4
|
+
export interface ExtractMiddlewareInput {
|
|
5
|
+
readonly handler: CandidateHandler;
|
|
6
|
+
readonly parsedFile: ParsedFile;
|
|
7
|
+
readonly imports: ReadonlyArray<ImportEdge>;
|
|
8
|
+
}
|
|
9
|
+
export declare function extractMiddlewareChain(input: ExtractMiddlewareInput): ReadonlyArray<ResolvedMiddleware>;
|
|
10
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/model/middleware.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,sBAAsB,GAC5B,aAAa,CAAC,kBAAkB,CAAC,CAgCnC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// D-36 middleware_chain population. Express + Hono + Fastify covered.
|
|
2
|
+
// Flask middleware chains are decorator-based and rare on webhook routes; chain stays [] for v1
|
|
3
|
+
// (deferred per Plan 06b's known limitations; rule authors who need Flask middleware ordering
|
|
4
|
+
// can use a TS predicate via the D-28 escape hatch).
|
|
5
|
+
import { walkBabelAst } from "../parsers/walk.js";
|
|
6
|
+
export function extractMiddlewareChain(input) {
|
|
7
|
+
const { handler, parsedFile, imports } = input;
|
|
8
|
+
if (parsedFile.parse_error !== null || parsedFile.raw_ast === null)
|
|
9
|
+
return [];
|
|
10
|
+
// Decorator-based middleware on Python webhook handlers is rare; v1 leaves chain empty.
|
|
11
|
+
// Phase 6 corpus run will surface whether this is actually needed; if so, lift to v1.x.
|
|
12
|
+
if (handler.framework === "flask" ||
|
|
13
|
+
handler.framework === "django" ||
|
|
14
|
+
handler.framework === "fastapi") {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
if (parsedFile.dialect !== "babel")
|
|
18
|
+
return [];
|
|
19
|
+
const ast = parsedFile.raw_ast;
|
|
20
|
+
const globalUses = [];
|
|
21
|
+
const routeArgs = [];
|
|
22
|
+
walkBabelAst(ast, (node) => {
|
|
23
|
+
const useEntry = matchAppUseRegistration(node, handler, imports);
|
|
24
|
+
if (useEntry)
|
|
25
|
+
globalUses.push(useEntry);
|
|
26
|
+
const routeMiddleware = matchRouteArgsMiddleware(node, handler, imports);
|
|
27
|
+
routeArgs.push(...routeMiddleware);
|
|
28
|
+
});
|
|
29
|
+
// Final chain: global app.use(...) registrations (in source order) followed by per-route
|
|
30
|
+
// middleware. Position is renumbered so the chain reads as "first middleware to run = position 0".
|
|
31
|
+
const merged = [];
|
|
32
|
+
for (const m of [...globalUses, ...routeArgs]) {
|
|
33
|
+
merged.push({ ...m, position: merged.length });
|
|
34
|
+
}
|
|
35
|
+
return merged;
|
|
36
|
+
}
|
|
37
|
+
// Match `app.use(...)` registrations registered before the handler's source location.
|
|
38
|
+
function matchAppUseRegistration(node, handler, imports) {
|
|
39
|
+
if (node.type !== "ExpressionStatement")
|
|
40
|
+
return null;
|
|
41
|
+
const expr = node.expression;
|
|
42
|
+
if (expr.type !== "CallExpression")
|
|
43
|
+
return null;
|
|
44
|
+
const callee = expr.callee;
|
|
45
|
+
if (callee.type !== "MemberExpression")
|
|
46
|
+
return null;
|
|
47
|
+
if (callee.property.type !== "Identifier" || callee.property.name !== "use")
|
|
48
|
+
return null;
|
|
49
|
+
const loc = nodeLocation(node);
|
|
50
|
+
if (loc.line >= handler.location.line)
|
|
51
|
+
return null; // only middleware registered before the handler
|
|
52
|
+
const arg = expr.arguments[0];
|
|
53
|
+
if (!arg)
|
|
54
|
+
return null;
|
|
55
|
+
const name = identifierOrMemberName(arg);
|
|
56
|
+
if (!name)
|
|
57
|
+
return null;
|
|
58
|
+
return {
|
|
59
|
+
name,
|
|
60
|
+
import_source: resolveImportSource(name, imports),
|
|
61
|
+
position: 0, // renumbered after collection
|
|
62
|
+
location: loc,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Match per-route middleware: `app.post('/x', mw1, mw2, handler)` — every CallExpression arg
|
|
66
|
+
// between the path (index 0) and handler (final) is middleware.
|
|
67
|
+
function matchRouteArgsMiddleware(node, handler, imports) {
|
|
68
|
+
if (node.type !== "ExpressionStatement")
|
|
69
|
+
return [];
|
|
70
|
+
const expr = node.expression;
|
|
71
|
+
if (expr.type !== "CallExpression")
|
|
72
|
+
return [];
|
|
73
|
+
const callee = expr.callee;
|
|
74
|
+
if (callee.type !== "MemberExpression")
|
|
75
|
+
return [];
|
|
76
|
+
if (callee.property.type !== "Identifier")
|
|
77
|
+
return [];
|
|
78
|
+
if (expr.arguments.length < 3)
|
|
79
|
+
return []; // need: path, ...middleware, handler
|
|
80
|
+
// Match this call site to our handler by source location.
|
|
81
|
+
const loc = nodeLocation(node);
|
|
82
|
+
if (loc.line !== handler.location.line || loc.col !== handler.location.col)
|
|
83
|
+
return [];
|
|
84
|
+
const out = [];
|
|
85
|
+
// Middleware is args[1..args.length-2] (path is [0], handler is final).
|
|
86
|
+
for (let i = 1; i < expr.arguments.length - 1; i++) {
|
|
87
|
+
const arg = expr.arguments[i];
|
|
88
|
+
if (!arg)
|
|
89
|
+
continue;
|
|
90
|
+
if (arg.type === "SpreadElement" || arg.type === "ArgumentPlaceholder")
|
|
91
|
+
continue;
|
|
92
|
+
const name = identifierOrMemberName(arg);
|
|
93
|
+
if (!name)
|
|
94
|
+
continue;
|
|
95
|
+
out.push({
|
|
96
|
+
name,
|
|
97
|
+
import_source: resolveImportSource(name, imports),
|
|
98
|
+
position: i - 1, // renumbered after collection
|
|
99
|
+
location: nodeLocation(arg),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
function identifierOrMemberName(node) {
|
|
105
|
+
if (node.type === "Identifier")
|
|
106
|
+
return node.name;
|
|
107
|
+
if (node.type === "MemberExpression") {
|
|
108
|
+
const obj = identifierOrMemberName(node.object);
|
|
109
|
+
if (obj && node.property.type === "Identifier")
|
|
110
|
+
return `${obj}.${node.property.name}`;
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (node.type === "CallExpression") {
|
|
114
|
+
// e.g. `express.json()` — collapse to the callee chain.
|
|
115
|
+
return identifierOrMemberName(node.callee);
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
function nodeLocation(node) {
|
|
120
|
+
const loc = node.loc;
|
|
121
|
+
return {
|
|
122
|
+
line: loc?.start.line ?? 1,
|
|
123
|
+
col: (loc?.start.column ?? 0) + 1,
|
|
124
|
+
end_line: loc?.end.line ?? 1,
|
|
125
|
+
end_col: (loc?.end.column ?? 0) + 1,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function resolveImportSource(qualifiedName, imports) {
|
|
129
|
+
const root = qualifiedName.split(".")[0];
|
|
130
|
+
if (!root)
|
|
131
|
+
return null;
|
|
132
|
+
for (const edge of imports) {
|
|
133
|
+
for (const n of edge.imported_names) {
|
|
134
|
+
if (n.local === root)
|
|
135
|
+
return edge.to_module;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/model/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReachableSymbol } from "../types/handler.js";
|
|
2
|
+
import type { ImportEdge, ParsedFile } from "../types/project-model.js";
|
|
3
|
+
export interface ComputeReachabilityInput {
|
|
4
|
+
readonly handler_body_node: unknown;
|
|
5
|
+
readonly handler_file: ParsedFile;
|
|
6
|
+
readonly all_files: ReadonlyArray<ParsedFile>;
|
|
7
|
+
readonly imports: ReadonlyArray<ImportEdge>;
|
|
8
|
+
readonly maxDepth: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function computeReachableSymbols(input: ComputeReachabilityInput): ReadonlyArray<ReachableSymbol>;
|
|
11
|
+
//# sourceMappingURL=reachability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reachability.d.ts","sourceRoot":"","sources":["../../src/model/reachability.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAiBxE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAcD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,wBAAwB,GAC9B,aAAa,CAAC,eAAe,CAAC,CA0DhC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
// D-34: bounded-depth reachable symbols, with cross-file traversal via ImportEdge.
|
|
2
|
+
// Walks the import graph + intra-file call graph + middleware chain to a configurable depth
|
|
3
|
+
// (default 3 hops). Catches: middleware verification, util-extracted verification,
|
|
4
|
+
// decorator-applied verification. Misses: dynamic dispatch, reflection — surfaced as
|
|
5
|
+
// `manual-review` candidates by rules (PITFALLS #3 graded-confidence policy).
|
|
6
|
+
//
|
|
7
|
+
// Caps:
|
|
8
|
+
// - maxDepth (caller-supplied via config.reachability_max_depth; default 3)
|
|
9
|
+
// - MAX_VISITED_SYMBOLS = 1000 per handler (DoS defense — threat-model T-02-06b-04)
|
|
10
|
+
import { walkBabelAst } from "../parsers/walk.js";
|
|
11
|
+
const MAX_VISITED_SYMBOLS = 1000;
|
|
12
|
+
export function computeReachableSymbols(input) {
|
|
13
|
+
const visited = new Set();
|
|
14
|
+
const out = [];
|
|
15
|
+
// Index every file's top-level symbols so cross-file traversal can resolve `mod.name` → AST.
|
|
16
|
+
const symbolTables = new Map();
|
|
17
|
+
for (const f of input.all_files) {
|
|
18
|
+
if (f.parse_error !== null || f.raw_ast === null)
|
|
19
|
+
continue;
|
|
20
|
+
symbolTables.set(f.file_path, { file: f, symbols: buildSymbolTable(f) });
|
|
21
|
+
}
|
|
22
|
+
const record = (entry) => {
|
|
23
|
+
if (visited.has(entry.qualified_name))
|
|
24
|
+
return false;
|
|
25
|
+
if (visited.size >= MAX_VISITED_SYMBOLS)
|
|
26
|
+
return false; // T-02-06b-04 DoS cap
|
|
27
|
+
visited.add(entry.qualified_name);
|
|
28
|
+
out.push(entry);
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
31
|
+
// Hop 1: direct calls in the handler body.
|
|
32
|
+
for (const call of collectCalls(input.handler_body_node, input.handler_file.dialect)) {
|
|
33
|
+
record({
|
|
34
|
+
qualified_name: call,
|
|
35
|
+
import_source: resolveImportSource(call, input.imports),
|
|
36
|
+
hops: 1,
|
|
37
|
+
via: "direct call",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// BFS frontier — each entry tracks the file that defined the symbol body so subsequent hops
|
|
41
|
+
// can keep resolving locally or follow imports into other files.
|
|
42
|
+
let frontier = out.map((e) => ({ entry: e, resolverFile: input.handler_file.file_path }));
|
|
43
|
+
for (let hop = 2; hop <= input.maxDepth; hop++) {
|
|
44
|
+
if (visited.size >= MAX_VISITED_SYMBOLS)
|
|
45
|
+
break;
|
|
46
|
+
const next = [];
|
|
47
|
+
for (const { entry, resolverFile } of frontier) {
|
|
48
|
+
const expansions = expandFrontierEntry(entry, resolverFile, symbolTables, input);
|
|
49
|
+
for (const exp of expansions) {
|
|
50
|
+
const newEntry = {
|
|
51
|
+
qualified_name: exp.qualified_name,
|
|
52
|
+
import_source: exp.import_source,
|
|
53
|
+
hops: hop,
|
|
54
|
+
via: exp.via,
|
|
55
|
+
};
|
|
56
|
+
if (record(newEntry)) {
|
|
57
|
+
next.push({ entry: newEntry, resolverFile: exp.nextResolverFile });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (next.length === 0)
|
|
62
|
+
break;
|
|
63
|
+
frontier = next;
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
// Expand one frontier entry — branches on whether it's a cross-file imported symbol or a local one.
|
|
68
|
+
function expandFrontierEntry(entry, resolverFile, symbolTables, input) {
|
|
69
|
+
// Branch A — imported symbol → walk into target module's matching top-level symbol body.
|
|
70
|
+
if (entry.import_source !== null) {
|
|
71
|
+
const targetFile = resolveModuleToFile(entry.import_source, input.all_files);
|
|
72
|
+
if (!targetFile)
|
|
73
|
+
return [];
|
|
74
|
+
const targetTable = symbolTables.get(targetFile.file_path);
|
|
75
|
+
if (!targetTable)
|
|
76
|
+
return [];
|
|
77
|
+
const exportedName = findExportedName(entry.qualified_name, input.imports);
|
|
78
|
+
if (!exportedName)
|
|
79
|
+
return [];
|
|
80
|
+
const symbolBody = targetTable.symbols.get(exportedName);
|
|
81
|
+
if (!symbolBody)
|
|
82
|
+
return [];
|
|
83
|
+
return collectCalls(symbolBody, targetFile.dialect).map((inner) => ({
|
|
84
|
+
qualified_name: inner,
|
|
85
|
+
import_source: resolveImportSource(inner, targetFile.imports),
|
|
86
|
+
via: `${entry.qualified_name} (imported from ${entry.import_source})`,
|
|
87
|
+
nextResolverFile: targetFile.file_path,
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
// Branch B — local symbol → walk its body in the resolver file.
|
|
91
|
+
const resolverTable = symbolTables.get(resolverFile);
|
|
92
|
+
if (!resolverTable)
|
|
93
|
+
return [];
|
|
94
|
+
const localBody = resolverTable.symbols.get(entry.qualified_name);
|
|
95
|
+
if (!localBody)
|
|
96
|
+
return [];
|
|
97
|
+
return collectCalls(localBody, resolverTable.file.dialect).map((inner) => ({
|
|
98
|
+
qualified_name: inner,
|
|
99
|
+
import_source: resolveImportSource(inner, resolverTable.file.imports),
|
|
100
|
+
via: `${entry.qualified_name} (local in ${resolverFile})`,
|
|
101
|
+
nextResolverFile: resolverFile,
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
// Build per-file symbol table from FunctionDeclarations + VariableDeclarations holding
|
|
105
|
+
// ArrowFunctionExpression / FunctionExpression. Python: function_definition + class methods.
|
|
106
|
+
function buildSymbolTable(file) {
|
|
107
|
+
const out = new Map();
|
|
108
|
+
if (file.dialect === "babel") {
|
|
109
|
+
const ast = file.raw_ast;
|
|
110
|
+
for (const stmt of ast.program.body) {
|
|
111
|
+
collectTopLevelSymbols(stmt, out);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (file.dialect === "tree-sitter-python") {
|
|
115
|
+
const tree = file.raw_ast;
|
|
116
|
+
for (const fn of tree.rootNode.descendantsOfType(["function_definition"])) {
|
|
117
|
+
const name = fn.childForFieldName("name")?.text;
|
|
118
|
+
if (name)
|
|
119
|
+
out.set(name, fn);
|
|
120
|
+
}
|
|
121
|
+
for (const klass of tree.rootNode.descendantsOfType(["class_definition"])) {
|
|
122
|
+
const className = klass.childForFieldName("name")?.text;
|
|
123
|
+
const body = klass.childForFieldName("body");
|
|
124
|
+
if (!className || !body)
|
|
125
|
+
continue;
|
|
126
|
+
for (const fn of body.descendantsOfType(["function_definition"])) {
|
|
127
|
+
const methodName = fn.childForFieldName("name")?.text;
|
|
128
|
+
if (methodName)
|
|
129
|
+
out.set(`${className}.${methodName}`, fn);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
function collectTopLevelSymbols(stmt, out) {
|
|
136
|
+
if (stmt.type === "FunctionDeclaration") {
|
|
137
|
+
if (stmt.id?.name)
|
|
138
|
+
out.set(stmt.id.name, stmt);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (stmt.type === "VariableDeclaration") {
|
|
142
|
+
for (const decl of stmt.declarations) {
|
|
143
|
+
const name = decl.id.type === "Identifier" ? decl.id.name : null;
|
|
144
|
+
const init = decl.init;
|
|
145
|
+
if (!name || !init)
|
|
146
|
+
continue;
|
|
147
|
+
if (init.type === "ArrowFunctionExpression" || init.type === "FunctionExpression") {
|
|
148
|
+
out.set(name, init);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (stmt.type === "ExportNamedDeclaration" && stmt.declaration) {
|
|
154
|
+
collectTopLevelSymbols(stmt.declaration, out);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (stmt.type === "ExportDefaultDeclaration") {
|
|
158
|
+
const decl = stmt.declaration;
|
|
159
|
+
if (decl.type === "FunctionDeclaration" && decl.id?.name) {
|
|
160
|
+
out.set(decl.id.name, decl);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function collectCalls(body, dialect) {
|
|
165
|
+
if (dialect === "babel")
|
|
166
|
+
return collectCallsBabel(body);
|
|
167
|
+
if (dialect === "tree-sitter-python")
|
|
168
|
+
return collectCallsPython(body);
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
function collectCallsBabel(root) {
|
|
172
|
+
const out = [];
|
|
173
|
+
walkBabelAst(root, (node) => {
|
|
174
|
+
if (node.type !== "CallExpression")
|
|
175
|
+
return;
|
|
176
|
+
const qn = qnameBabel(node.callee);
|
|
177
|
+
if (qn)
|
|
178
|
+
out.push(qn);
|
|
179
|
+
});
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
function qnameBabel(node) {
|
|
183
|
+
if (node.type === "Identifier")
|
|
184
|
+
return node.name;
|
|
185
|
+
if (node.type === "MemberExpression") {
|
|
186
|
+
const obj = qnameBabel(node.object);
|
|
187
|
+
const prop = node.property;
|
|
188
|
+
if (!obj)
|
|
189
|
+
return null;
|
|
190
|
+
if (prop.type === "Identifier")
|
|
191
|
+
return `${obj}.${prop.name}`;
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
function collectCallsPython(body) {
|
|
196
|
+
if (!body || typeof body !== "object")
|
|
197
|
+
return [];
|
|
198
|
+
const node = body;
|
|
199
|
+
if (typeof node.descendantsOfType !== "function")
|
|
200
|
+
return [];
|
|
201
|
+
const out = [];
|
|
202
|
+
for (const c of node.descendantsOfType(["call"])) {
|
|
203
|
+
const fn = c.childForFieldName("function");
|
|
204
|
+
if (fn?.text)
|
|
205
|
+
out.push(fn.text);
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
function resolveImportSource(qualifiedName, imports) {
|
|
210
|
+
// qualified_name like `stripe.webhooks.constructEvent` — root identifier is `stripe`.
|
|
211
|
+
const root = qualifiedName.split(".")[0];
|
|
212
|
+
if (!root)
|
|
213
|
+
return null;
|
|
214
|
+
for (const edge of imports) {
|
|
215
|
+
for (const name of edge.imported_names) {
|
|
216
|
+
if (name.local === root)
|
|
217
|
+
return edge.to_module;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
function findExportedName(qualifiedName, imports) {
|
|
223
|
+
// Map local name back to its source-side export name (e.g. `cd` → `compare_digest`
|
|
224
|
+
// when imported via `from hmac import compare_digest as cd`).
|
|
225
|
+
const root = qualifiedName.split(".")[0];
|
|
226
|
+
if (!root)
|
|
227
|
+
return null;
|
|
228
|
+
for (const edge of imports) {
|
|
229
|
+
for (const name of edge.imported_names) {
|
|
230
|
+
if (name.local === root)
|
|
231
|
+
return name.source === "default" ? root : name.source;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
function resolveModuleToFile(moduleName, allFiles) {
|
|
237
|
+
// Best-effort lookup: relative paths only. Bare module names (e.g. `express`) live in
|
|
238
|
+
// node_modules — outside the scanned tree — so cannot be followed. Symbol stays as an
|
|
239
|
+
// external leaf with import_source set, which is what rules need for D-34 set-lookup.
|
|
240
|
+
if (!moduleName.startsWith(".") && !moduleName.startsWith("/"))
|
|
241
|
+
return null;
|
|
242
|
+
// Strip leading ./ or ../, then drop any source-file extension so ESM-style imports
|
|
243
|
+
// (`./foo.js` → src `./foo.ts`) and bare imports (`./foo`) both resolve.
|
|
244
|
+
const noLead = moduleName.replace(/^\.\.?\//, "").replace(/^\.\//, "");
|
|
245
|
+
const stem = noLead.replace(/\.(?:ts|tsx|js|jsx|mjs|cjs|py)$/i, "");
|
|
246
|
+
for (const f of allFiles) {
|
|
247
|
+
if (f.file_path === noLead)
|
|
248
|
+
return f;
|
|
249
|
+
for (const ext of [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py"]) {
|
|
250
|
+
if (f.file_path.endsWith(`${stem}${ext}`))
|
|
251
|
+
return f;
|
|
252
|
+
}
|
|
253
|
+
for (const indexFile of ["/index.ts", "/index.js", "/index.tsx", "/index.jsx"]) {
|
|
254
|
+
if (f.file_path.endsWith(`${stem}${indexFile}`))
|
|
255
|
+
return f;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=reachability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reachability.js","sourceRoot":"","sources":["../../src/model/reachability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { File, Node } from "@babel/types";
|
|
2
|
+
import type { ParsedFile } from "../types/project-model.js";
|
|
3
|
+
export interface ParseJsTsInput {
|
|
4
|
+
readonly file_path: string;
|
|
5
|
+
readonly source_text: string;
|
|
6
|
+
readonly hint?: "ts" | "tsx" | "js" | "jsx";
|
|
7
|
+
}
|
|
8
|
+
export declare function parseJsTs(input: ParseJsTsInput): Promise<ParsedFile>;
|
|
9
|
+
export type BabelFile = File;
|
|
10
|
+
export type BabelNode = Node;
|
|
11
|
+
//# sourceMappingURL=babel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babel.d.ts","sourceRoot":"","sources":["../../src/parsers/babel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAqB,IAAI,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EAAc,UAAU,EAAoB,MAAM,2BAA2B,CAAC;AAE1F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;CAC7C;AAiCD,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAoC1E;AAmDD,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC;AAC7B,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC"}
|