@fourteensystems/prodcheck 0.3.0
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/README.md +252 -0
- package/bin/prodcheck.mjs +2 -0
- package/dist/cli/commands/baseline.d.ts +7 -0
- package/dist/cli/commands/baseline.d.ts.map +1 -0
- package/dist/cli/commands/baseline.js +22 -0
- package/dist/cli/commands/baseline.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +14 -0
- package/dist/cli/commands/ci.d.ts.map +1 -0
- package/dist/cli/commands/ci.js +104 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +2 -0
- package/dist/cli/commands/explain.d.ts.map +1 -0
- package/dist/cli/commands/explain.js +20 -0
- package/dist/cli/commands/explain.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +127 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +2 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +13 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +10 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +65 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/waive.d.ts +8 -0
- package/dist/cli/commands/waive.d.ts.map +1 -0
- package/dist/cli/commands/waive.js +34 -0
- package/dist/cli/commands/waive.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +64 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/engine/baseline.d.ts +11 -0
- package/dist/engine/baseline.d.ts.map +1 -0
- package/dist/engine/baseline.js +39 -0
- package/dist/engine/baseline.js.map +1 -0
- package/dist/engine/baseline.test.d.ts +2 -0
- package/dist/engine/baseline.test.d.ts.map +1 -0
- package/dist/engine/baseline.test.js +135 -0
- package/dist/engine/baseline.test.js.map +1 -0
- package/dist/engine/config.d.ts +8 -0
- package/dist/engine/config.d.ts.map +1 -0
- package/dist/engine/config.js +134 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/config.test.d.ts +2 -0
- package/dist/engine/config.test.d.ts.map +1 -0
- package/dist/engine/config.test.js +107 -0
- package/dist/engine/config.test.js.map +1 -0
- package/dist/engine/extensions/load.d.ts +11 -0
- package/dist/engine/extensions/load.d.ts.map +1 -0
- package/dist/engine/extensions/load.js +26 -0
- package/dist/engine/extensions/load.js.map +1 -0
- package/dist/engine/extensions/registry.d.ts +5 -0
- package/dist/engine/extensions/registry.d.ts.map +1 -0
- package/dist/engine/extensions/registry.js +11 -0
- package/dist/engine/extensions/registry.js.map +1 -0
- package/dist/engine/extensions/types.d.ts +51 -0
- package/dist/engine/extensions/types.d.ts.map +1 -0
- package/dist/engine/extensions/types.js +2 -0
- package/dist/engine/extensions/types.js.map +1 -0
- package/dist/engine/license.d.ts +40 -0
- package/dist/engine/license.d.ts.map +1 -0
- package/dist/engine/license.js +104 -0
- package/dist/engine/license.js.map +1 -0
- package/dist/engine/report.d.ts +5 -0
- package/dist/engine/report.d.ts.map +1 -0
- package/dist/engine/report.js +115 -0
- package/dist/engine/report.js.map +1 -0
- package/dist/engine/run.d.ts +11 -0
- package/dist/engine/run.d.ts.map +1 -0
- package/dist/engine/run.js +105 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/sarif.d.ts +3 -0
- package/dist/engine/sarif.d.ts.map +1 -0
- package/dist/engine/sarif.js +58 -0
- package/dist/engine/sarif.js.map +1 -0
- package/dist/engine/sarif.test.d.ts +2 -0
- package/dist/engine/sarif.test.d.ts.map +1 -0
- package/dist/engine/sarif.test.js +152 -0
- package/dist/engine/sarif.test.js.map +1 -0
- package/dist/engine/score.d.ts +13 -0
- package/dist/engine/score.d.ts.map +1 -0
- package/dist/engine/score.js +116 -0
- package/dist/engine/score.js.map +1 -0
- package/dist/engine/score.test.d.ts +2 -0
- package/dist/engine/score.test.d.ts.map +1 -0
- package/dist/engine/score.test.js +227 -0
- package/dist/engine/score.test.js.map +1 -0
- package/dist/engine/types.d.ts +123 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +2 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/version.d.ts +5 -0
- package/dist/engine/version.d.ts.map +1 -0
- package/dist/engine/version.js +15 -0
- package/dist/engine/version.js.map +1 -0
- package/dist/engine/waivers.d.ts +9 -0
- package/dist/engine/waivers.d.ts.map +1 -0
- package/dist/engine/waivers.js +55 -0
- package/dist/engine/waivers.js.map +1 -0
- package/dist/engine/waivers.test.d.ts +2 -0
- package/dist/engine/waivers.test.d.ts.map +1 -0
- package/dist/engine/waivers.test.js +147 -0
- package/dist/engine/waivers.test.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/next/deps.d.ts +4 -0
- package/dist/next/deps.d.ts.map +1 -0
- package/dist/next/deps.js +118 -0
- package/dist/next/deps.js.map +1 -0
- package/dist/next/deps.test.d.ts +2 -0
- package/dist/next/deps.test.d.ts.map +1 -0
- package/dist/next/deps.test.js +249 -0
- package/dist/next/deps.test.js.map +1 -0
- package/dist/next/detect.d.ts +10 -0
- package/dist/next/detect.d.ts.map +1 -0
- package/dist/next/detect.js +57 -0
- package/dist/next/detect.js.map +1 -0
- package/dist/next/detect.test.d.ts +2 -0
- package/dist/next/detect.test.d.ts.map +1 -0
- package/dist/next/detect.test.js +74 -0
- package/dist/next/detect.test.js.map +1 -0
- package/dist/next/index.d.ts +5 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +59 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/middleware.d.ts +3 -0
- package/dist/next/middleware.d.ts.map +1 -0
- package/dist/next/middleware.js +48 -0
- package/dist/next/middleware.js.map +1 -0
- package/dist/next/middleware.test.d.ts +2 -0
- package/dist/next/middleware.test.d.ts.map +1 -0
- package/dist/next/middleware.test.js +203 -0
- package/dist/next/middleware.test.js.map +1 -0
- package/dist/next/routes.d.ts +10 -0
- package/dist/next/routes.d.ts.map +1 -0
- package/dist/next/routes.js +172 -0
- package/dist/next/routes.js.map +1 -0
- package/dist/next/routes.test.d.ts +2 -0
- package/dist/next/routes.test.d.ts.map +1 -0
- package/dist/next/routes.test.js +175 -0
- package/dist/next/routes.test.js.map +1 -0
- package/dist/next/server-actions.d.ts +4 -0
- package/dist/next/server-actions.d.ts.map +1 -0
- package/dist/next/server-actions.js +107 -0
- package/dist/next/server-actions.js.map +1 -0
- package/dist/next/server-actions.test.d.ts +2 -0
- package/dist/next/server-actions.test.d.ts.map +1 -0
- package/dist/next/server-actions.test.js +138 -0
- package/dist/next/server-actions.test.js.map +1 -0
- package/dist/next/trpc.d.ts +3 -0
- package/dist/next/trpc.d.ts.map +1 -0
- package/dist/next/trpc.js +312 -0
- package/dist/next/trpc.js.map +1 -0
- package/dist/next/types.d.ts +144 -0
- package/dist/next/types.d.ts.map +1 -0
- package/dist/next/types.js +2 -0
- package/dist/next/types.js.map +1 -0
- package/dist/next/wrappers.d.ts +10 -0
- package/dist/next/wrappers.d.ts.map +1 -0
- package/dist/next/wrappers.js +536 -0
- package/dist/next/wrappers.js.map +1 -0
- package/dist/next/wrappers.test.d.ts +2 -0
- package/dist/next/wrappers.test.d.ts.map +1 -0
- package/dist/next/wrappers.test.js +361 -0
- package/dist/next/wrappers.test.js.map +1 -0
- package/dist/rules/auth-boundary-missing.d.ts +5 -0
- package/dist/rules/auth-boundary-missing.d.ts.map +1 -0
- package/dist/rules/auth-boundary-missing.js +463 -0
- package/dist/rules/auth-boundary-missing.js.map +1 -0
- package/dist/rules/auth-boundary-missing.test.d.ts +2 -0
- package/dist/rules/auth-boundary-missing.test.d.ts.map +1 -0
- package/dist/rules/auth-boundary-missing.test.js +492 -0
- package/dist/rules/auth-boundary-missing.test.js.map +1 -0
- package/dist/rules/index.d.ts +12 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +95 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/input-validation-missing.d.ts +5 -0
- package/dist/rules/input-validation-missing.d.ts.map +1 -0
- package/dist/rules/input-validation-missing.js +272 -0
- package/dist/rules/input-validation-missing.js.map +1 -0
- package/dist/rules/input-validation-missing.test.d.ts +2 -0
- package/dist/rules/input-validation-missing.test.d.ts.map +1 -0
- package/dist/rules/input-validation-missing.test.js +449 -0
- package/dist/rules/input-validation-missing.test.js.map +1 -0
- package/dist/rules/rate-limit-missing.d.ts +5 -0
- package/dist/rules/rate-limit-missing.d.ts.map +1 -0
- package/dist/rules/rate-limit-missing.js +316 -0
- package/dist/rules/rate-limit-missing.js.map +1 -0
- package/dist/rules/rate-limit-missing.test.d.ts +2 -0
- package/dist/rules/rate-limit-missing.test.d.ts.map +1 -0
- package/dist/rules/rate-limit-missing.test.js +381 -0
- package/dist/rules/rate-limit-missing.test.js.map +1 -0
- package/dist/rules/tenancy-scope-missing.d.ts +5 -0
- package/dist/rules/tenancy-scope-missing.d.ts.map +1 -0
- package/dist/rules/tenancy-scope-missing.js +149 -0
- package/dist/rules/tenancy-scope-missing.js.map +1 -0
- package/dist/rules/wrapper-unrecognized.d.ts +5 -0
- package/dist/rules/wrapper-unrecognized.d.ts.map +1 -0
- package/dist/rules/wrapper-unrecognized.js +81 -0
- package/dist/rules/wrapper-unrecognized.js.map +1 -0
- package/dist/util/hof.d.ts +22 -0
- package/dist/util/hof.d.ts.map +1 -0
- package/dist/util/hof.js +99 -0
- package/dist/util/hof.js.map +1 -0
- package/dist/util/hof.test.d.ts +2 -0
- package/dist/util/hof.test.d.ts.map +1 -0
- package/dist/util/hof.test.js +79 -0
- package/dist/util/hof.test.js.map +1 -0
- package/dist/util/monorepo.d.ts +6 -0
- package/dist/util/monorepo.d.ts.map +1 -0
- package/dist/util/monorepo.js +29 -0
- package/dist/util/monorepo.js.map +1 -0
- package/dist/util/outbound-fetch.d.ts +14 -0
- package/dist/util/outbound-fetch.d.ts.map +1 -0
- package/dist/util/outbound-fetch.js +59 -0
- package/dist/util/outbound-fetch.js.map +1 -0
- package/dist/util/outbound-fetch.test.d.ts +2 -0
- package/dist/util/outbound-fetch.test.d.ts.map +1 -0
- package/dist/util/outbound-fetch.test.js +83 -0
- package/dist/util/outbound-fetch.test.js.map +1 -0
- package/dist/util/paths.d.ts +6 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +18 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/resolve.d.ts +30 -0
- package/dist/util/resolve.d.ts.map +1 -0
- package/dist/util/resolve.js +306 -0
- package/dist/util/resolve.js.map +1 -0
- package/dist/util/resolve.test.d.ts +2 -0
- package/dist/util/resolve.test.d.ts.map +1 -0
- package/dist/util/resolve.test.js +186 -0
- package/dist/util/resolve.test.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import ts from "typescript";
|
|
4
|
+
import { resolveImportPath, followReExport } from "../util/resolve.js";
|
|
5
|
+
import { extractHofWrapperChain, findImportSource } from "../util/hof.js";
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Public API
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export function buildWrapperIndex(routes, rootDir, resolveOpts, authFunctions, rateLimitWrappers) {
|
|
10
|
+
const wrapperMap = new Map();
|
|
11
|
+
// Phase A: Extract wrapper calls from all route files
|
|
12
|
+
for (const route of routes) {
|
|
13
|
+
const src = readSource(rootDir, route.file);
|
|
14
|
+
if (!src)
|
|
15
|
+
continue;
|
|
16
|
+
const chain = extractHofWrapperChain(src);
|
|
17
|
+
for (const wrapperName of chain) {
|
|
18
|
+
let entry = wrapperMap.get(wrapperName);
|
|
19
|
+
if (!entry) {
|
|
20
|
+
// Phase B: Resolve and analyze on first encounter
|
|
21
|
+
const importSource = findImportSource(src, wrapperName);
|
|
22
|
+
const definition = resolveWrapper(wrapperName, importSource, route.file, src, rootDir, resolveOpts);
|
|
23
|
+
let evidence = {
|
|
24
|
+
authCallPresent: false,
|
|
25
|
+
authEnforced: false,
|
|
26
|
+
rateLimitCallPresent: false,
|
|
27
|
+
rateLimitEnforced: false,
|
|
28
|
+
authDetails: [],
|
|
29
|
+
rateLimitDetails: [],
|
|
30
|
+
};
|
|
31
|
+
if (definition) {
|
|
32
|
+
// Phase C: Analyze wrapper body
|
|
33
|
+
evidence = analyzeWrapperBody(wrapperName, definition.src, authFunctions, rateLimitWrappers);
|
|
34
|
+
}
|
|
35
|
+
entry = {
|
|
36
|
+
name: wrapperName,
|
|
37
|
+
definitionFile: definition?.file,
|
|
38
|
+
resolved: definition !== undefined,
|
|
39
|
+
evidence,
|
|
40
|
+
usageCount: 0,
|
|
41
|
+
usageFiles: [],
|
|
42
|
+
mutationRouteCount: 0,
|
|
43
|
+
};
|
|
44
|
+
wrapperMap.set(wrapperName, entry);
|
|
45
|
+
}
|
|
46
|
+
// Aggregate usage
|
|
47
|
+
entry.usageCount++;
|
|
48
|
+
entry.usageFiles.push(route.file);
|
|
49
|
+
if (route.signals.hasMutationEvidence ||
|
|
50
|
+
route.signals.hasDbWriteEvidence ||
|
|
51
|
+
route.signals.hasStripeWriteEvidence) {
|
|
52
|
+
entry.mutationRouteCount++;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { wrappers: wrapperMap };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Compute ProtectionSummary for a route based on wrapper evidence,
|
|
60
|
+
* middleware coverage, and direct auth/rate-limit calls.
|
|
61
|
+
*/
|
|
62
|
+
export function computeProtection(route, wrapperIndex, middleware, hints, rootDir) {
|
|
63
|
+
const src = readSource(rootDir, route.file);
|
|
64
|
+
const chain = src ? extractHofWrapperChain(src) : [];
|
|
65
|
+
const auth = computeAuthProtection(route, chain, wrapperIndex, middleware, hints, src);
|
|
66
|
+
const rateLimit = computeRateLimitProtection(route, chain, wrapperIndex, middleware, hints, src);
|
|
67
|
+
return { auth, rateLimit };
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// Wrapper Resolution (Phase B)
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
function resolveWrapper(wrapperName, importSource, routeFile, routeSrc, rootDir, resolveOpts) {
|
|
73
|
+
// 1. Same file — wrapper defined in the route file
|
|
74
|
+
if (!importSource) {
|
|
75
|
+
if (hasLocalDefinition(routeSrc, wrapperName)) {
|
|
76
|
+
return { file: routeFile, src: routeSrc };
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
// 2. Resolve the import to a file
|
|
81
|
+
const resolvedFile = resolveImportPath(routeFile, importSource, resolveOpts);
|
|
82
|
+
if (!resolvedFile)
|
|
83
|
+
return undefined;
|
|
84
|
+
// 3. Follow re-exports (barrel pattern), up to 5 hops
|
|
85
|
+
return followReExport(wrapperName, resolvedFile, resolveOpts, 5);
|
|
86
|
+
}
|
|
87
|
+
function hasLocalDefinition(src, name) {
|
|
88
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
89
|
+
return new RegExp(`(?:export\\s+)?(?:async\\s+)?function\\s+${escaped}\\s*[(<]|` +
|
|
90
|
+
`(?:export\\s+)?(?:const|let|var)\\s+${escaped}\\s*[=:]`, "m").test(src);
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Wrapper Body Analysis (Phase C) — TypeScript AST
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
export function analyzeWrapperBody(wrapperName, src, authFunctions, rateLimitWrappers) {
|
|
96
|
+
const evidence = {
|
|
97
|
+
authCallPresent: false,
|
|
98
|
+
authEnforced: false,
|
|
99
|
+
rateLimitCallPresent: false,
|
|
100
|
+
rateLimitEnforced: false,
|
|
101
|
+
authDetails: [],
|
|
102
|
+
rateLimitDetails: [],
|
|
103
|
+
};
|
|
104
|
+
// Parse with TypeScript
|
|
105
|
+
const sourceFile = ts.createSourceFile("wrapper.ts", src, ts.ScriptTarget.Latest, true, // setParentNodes
|
|
106
|
+
ts.ScriptKind.TSX);
|
|
107
|
+
// Check for known imports at file level (imports are outside function bodies)
|
|
108
|
+
checkKnownImports(src, evidence);
|
|
109
|
+
// Find the wrapper function declaration
|
|
110
|
+
const wrapperBody = findFunctionBody(sourceFile, wrapperName);
|
|
111
|
+
if (!wrapperBody) {
|
|
112
|
+
// Fallback: analyze the entire file if we can't isolate the function
|
|
113
|
+
analyzeNodeForEvidence(sourceFile, authFunctions, rateLimitWrappers, evidence);
|
|
114
|
+
return evidence;
|
|
115
|
+
}
|
|
116
|
+
analyzeNodeForEvidence(wrapperBody, authFunctions, rateLimitWrappers, evidence);
|
|
117
|
+
return evidence;
|
|
118
|
+
}
|
|
119
|
+
function findFunctionBody(sourceFile, name) {
|
|
120
|
+
let result;
|
|
121
|
+
function visit(node) {
|
|
122
|
+
if (result)
|
|
123
|
+
return;
|
|
124
|
+
// function name(...) { ... }
|
|
125
|
+
if (ts.isFunctionDeclaration(node) && node.name?.text === name && node.body) {
|
|
126
|
+
result = node.body;
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// const name = (...) => { ... } or const name = function(...) { ... }
|
|
130
|
+
if (ts.isVariableStatement(node)) {
|
|
131
|
+
for (const decl of node.declarationList.declarations) {
|
|
132
|
+
if (ts.isIdentifier(decl.name) && decl.name.text === name && decl.initializer) {
|
|
133
|
+
result = extractFunctionBodyFromExpression(decl.initializer);
|
|
134
|
+
if (result)
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// export function name(...) { ... } — also captured by FunctionDeclaration check above
|
|
140
|
+
// export const name = ...
|
|
141
|
+
if (ts.isExportAssignment(node) || ts.isExportDeclaration(node)) {
|
|
142
|
+
// Skip — we handle exports via VariableStatement
|
|
143
|
+
}
|
|
144
|
+
ts.forEachChild(node, visit);
|
|
145
|
+
}
|
|
146
|
+
visit(sourceFile);
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
function extractFunctionBodyFromExpression(expr) {
|
|
150
|
+
// Arrow function: (...) => { ... } or (...) => expr
|
|
151
|
+
if (ts.isArrowFunction(expr)) {
|
|
152
|
+
return expr.body;
|
|
153
|
+
}
|
|
154
|
+
// Function expression: function(...) { ... }
|
|
155
|
+
if (ts.isFunctionExpression(expr)) {
|
|
156
|
+
return expr.body;
|
|
157
|
+
}
|
|
158
|
+
// Call expression returning a function: someHelper((...) => { ... })
|
|
159
|
+
// This handles factory patterns like: const withWorkspace = createWrapper((req) => { ... })
|
|
160
|
+
if (ts.isCallExpression(expr)) {
|
|
161
|
+
// Check all arguments for function expressions
|
|
162
|
+
for (const arg of expr.arguments) {
|
|
163
|
+
const body = extractFunctionBodyFromExpression(arg);
|
|
164
|
+
if (body)
|
|
165
|
+
return body;
|
|
166
|
+
}
|
|
167
|
+
// Also check the function itself if it's another call (chained)
|
|
168
|
+
return extractFunctionBodyFromExpression(expr.expression);
|
|
169
|
+
}
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check for known package imports at the file level.
|
|
174
|
+
* This runs against the full source, not just the function body,
|
|
175
|
+
* since imports are always at the top of the file.
|
|
176
|
+
*/
|
|
177
|
+
function checkKnownImports(fileSrc, evidence) {
|
|
178
|
+
if (/@upstash\/ratelimit/.test(fileSrc)) {
|
|
179
|
+
evidence.rateLimitCallPresent = true;
|
|
180
|
+
evidence.rateLimitDetails.push("imports @upstash/ratelimit");
|
|
181
|
+
}
|
|
182
|
+
if (/@arcjet\/next/.test(fileSrc)) {
|
|
183
|
+
evidence.rateLimitCallPresent = true;
|
|
184
|
+
evidence.rateLimitDetails.push("imports @arcjet/next");
|
|
185
|
+
}
|
|
186
|
+
if (/@unkey\/ratelimit/.test(fileSrc)) {
|
|
187
|
+
evidence.rateLimitCallPresent = true;
|
|
188
|
+
evidence.rateLimitDetails.push("imports @unkey/ratelimit");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function analyzeNodeForEvidence(node, authFunctions, rateLimitWrappers, evidence) {
|
|
192
|
+
const authSet = new Set(authFunctions);
|
|
193
|
+
const rlSet = new Set(rateLimitWrappers);
|
|
194
|
+
const src = node.getFullText();
|
|
195
|
+
// Auth: check for known function calls
|
|
196
|
+
for (const fn of authFunctions) {
|
|
197
|
+
const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*\\(`, "m");
|
|
198
|
+
if (pattern.test(src)) {
|
|
199
|
+
evidence.authCallPresent = true;
|
|
200
|
+
evidence.authDetails.push(`calls ${fn}()`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Auth: built-in patterns (Supabase .auth.getUser(), .auth.getSession())
|
|
204
|
+
if (/\.auth\.getUser\s*\(/.test(src)) {
|
|
205
|
+
evidence.authCallPresent = true;
|
|
206
|
+
evidence.authEnforced = true;
|
|
207
|
+
evidence.authDetails.push("calls .auth.getUser()");
|
|
208
|
+
}
|
|
209
|
+
if (/\.auth\.getSession\s*\(/.test(src)) {
|
|
210
|
+
evidence.authCallPresent = true;
|
|
211
|
+
evidence.authEnforced = true;
|
|
212
|
+
evidence.authDetails.push("calls .auth.getSession()");
|
|
213
|
+
}
|
|
214
|
+
// Auth: webhook/cron signature verification patterns
|
|
215
|
+
if (/stripe\.webhooks\.constructEvent\s*\(/.test(src)) {
|
|
216
|
+
evidence.authCallPresent = true;
|
|
217
|
+
evidence.authEnforced = true;
|
|
218
|
+
evidence.authDetails.push("verifies Stripe webhook signature");
|
|
219
|
+
}
|
|
220
|
+
if (/workos\.webhooks\.constructEvent\s*\(/.test(src)) {
|
|
221
|
+
evidence.authCallPresent = true;
|
|
222
|
+
evidence.authEnforced = true;
|
|
223
|
+
evidence.authDetails.push("verifies WorkOS webhook signature");
|
|
224
|
+
}
|
|
225
|
+
if (/verifyVercelSignature\s*\(/.test(src)) {
|
|
226
|
+
evidence.authCallPresent = true;
|
|
227
|
+
evidence.authEnforced = true;
|
|
228
|
+
evidence.authDetails.push("verifies Vercel cron signature");
|
|
229
|
+
}
|
|
230
|
+
if (/verifyQstashSignature\s*\(/.test(src)) {
|
|
231
|
+
evidence.authCallPresent = true;
|
|
232
|
+
evidence.authEnforced = true;
|
|
233
|
+
evidence.authDetails.push("verifies QStash signature");
|
|
234
|
+
}
|
|
235
|
+
if (/createHmac\s*\(/.test(src) && /signature/i.test(src)) {
|
|
236
|
+
evidence.authCallPresent = true;
|
|
237
|
+
evidence.authEnforced = true;
|
|
238
|
+
evidence.authDetails.push("HMAC signature verification");
|
|
239
|
+
}
|
|
240
|
+
if (/timingSafeEqual\s*\(/.test(src)) {
|
|
241
|
+
evidence.authCallPresent = true;
|
|
242
|
+
evidence.authEnforced = true;
|
|
243
|
+
evidence.authDetails.push("timing-safe comparison (signature verification)");
|
|
244
|
+
}
|
|
245
|
+
// Rate limit: known wrappers
|
|
246
|
+
for (const fn of rateLimitWrappers) {
|
|
247
|
+
const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*[.(]`, "m");
|
|
248
|
+
if (pattern.test(src)) {
|
|
249
|
+
evidence.rateLimitCallPresent = true;
|
|
250
|
+
evidence.rateLimitDetails.push(`calls ${fn}()`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Rate limit: .limit() method calls on rate-limiter-like objects (Upstash pattern)
|
|
254
|
+
// Catches wrappers importing Upstash via local re-export modules
|
|
255
|
+
if (/(?:ratelimit|rateLimit|rl|limiter|rateLimiter)\.limit\s*\(/i.test(src)) {
|
|
256
|
+
evidence.rateLimitCallPresent = true;
|
|
257
|
+
evidence.rateLimitDetails.push("calls .limit() method");
|
|
258
|
+
}
|
|
259
|
+
// General pattern: any function call with "ratelimit" or "rate_limit" in the name
|
|
260
|
+
const rlCallMatch = src.match(/\b(\w*(?:rateLimit|ratelimit|rate_limit)\w*)\s*\(/i);
|
|
261
|
+
if (rlCallMatch && !evidence.rateLimitCallPresent) {
|
|
262
|
+
evidence.rateLimitCallPresent = true;
|
|
263
|
+
evidence.rateLimitEnforced = true; // Name implies rate limiting — trust it
|
|
264
|
+
evidence.rateLimitDetails.push(`calls ${rlCallMatch[1]}()`);
|
|
265
|
+
}
|
|
266
|
+
// Check for enforcement via AST (don't overwrite if already proven by built-in patterns)
|
|
267
|
+
if (evidence.authCallPresent && !evidence.authEnforced) {
|
|
268
|
+
evidence.authEnforced = detectEnforcement(node, authSet, "auth");
|
|
269
|
+
if (evidence.authEnforced) {
|
|
270
|
+
evidence.authDetails.push("enforces: conditional throw/return on auth failure");
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (evidence.rateLimitCallPresent && !evidence.rateLimitEnforced) {
|
|
274
|
+
evidence.rateLimitEnforced = detectEnforcement(node, rlSet, "rateLimit");
|
|
275
|
+
if (evidence.rateLimitEnforced) {
|
|
276
|
+
evidence.rateLimitDetails.push("enforces: conditional throw/return on rate limit");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Detect if auth/rate-limit calls are enforced (result checked + throw/return on failure).
|
|
282
|
+
*
|
|
283
|
+
* Heuristics:
|
|
284
|
+
* 1. The result of the call is stored in a variable (or destructured)
|
|
285
|
+
* 2. An if-statement or ternary checks the result (negation or falsy check)
|
|
286
|
+
* 3. The consequent throws, returns, or redirects
|
|
287
|
+
*
|
|
288
|
+
* Also covers common patterns:
|
|
289
|
+
* - `if (!session) throw/return`
|
|
290
|
+
* - `if (!success) throw/return Response(...429)`
|
|
291
|
+
* - `session ?? throw new Error()`
|
|
292
|
+
* - Early return patterns
|
|
293
|
+
*/
|
|
294
|
+
function detectEnforcement(node, functionNames, kind) {
|
|
295
|
+
const src = node.getFullText();
|
|
296
|
+
if (kind === "auth") {
|
|
297
|
+
// Pattern: if (!session/!user/!token) throw/return/redirect
|
|
298
|
+
if (/if\s*\(\s*!(?:session|user|token|currentUser|auth)\b/.test(src)) {
|
|
299
|
+
if (/\bthrow\b|\breturn\b|NextResponse\.redirect|NextResponse\.json|Response\.json|new Response/.test(src)) {
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Pattern: session ?? throw / || throw
|
|
304
|
+
if (/(?:session|user|token|auth)\s*(?:\?\?|\|\|)\s*(?:throw|null)/.test(src)) {
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
// Pattern: throw or return right after the auth call (within a few lines)
|
|
308
|
+
// This catches: const session = await auth(); if (!session) { return ... }
|
|
309
|
+
if (/(?:auth|getSession|getServerSession|currentUser|getUser|validateRequest|getIronSession)\s*\([\s\S]{0,200}if\s*\(\s*!/.test(src)) {
|
|
310
|
+
if (/\bthrow\b|\breturn\b|redirect/.test(src)) {
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (kind === "rateLimit") {
|
|
316
|
+
// Pattern: if (!success) or if (remaining <= 0) throw/return 429
|
|
317
|
+
if (/if\s*\(\s*!success\b/.test(src) || /if\s*\(\s*remaining\s*<=?\s*0/.test(src)) {
|
|
318
|
+
if (/\bthrow\b|\breturn\b|429|too\s*many/i.test(src)) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Pattern: destructure { success } and check
|
|
323
|
+
if (/\{\s*success\s*\}/.test(src) && /!success/.test(src)) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
// Pattern: .limit( followed by conditional throw/return
|
|
327
|
+
if (/\.limit\s*\([\s\S]{0,200}(?:throw|return\s+(?:new\s+)?Response|429)/m.test(src)) {
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
// Pattern: ratelimit.limit() + any throw within 300 chars (looser — catches custom error classes)
|
|
331
|
+
if (/(?:ratelimit|rateLimit|rl|limiter)\.limit\s*\([\s\S]{0,300}\bthrow\b/i.test(src)) {
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
// Protection Computation
|
|
339
|
+
// ---------------------------------------------------------------------------
|
|
340
|
+
function computeAuthProtection(route, chain, wrapperIndex, middleware, hints, src) {
|
|
341
|
+
const status = {
|
|
342
|
+
satisfied: false,
|
|
343
|
+
enforced: false,
|
|
344
|
+
sources: [],
|
|
345
|
+
details: [],
|
|
346
|
+
unverifiedWrappers: [],
|
|
347
|
+
};
|
|
348
|
+
// 1. Direct auth call in route (hint-based)
|
|
349
|
+
if (src) {
|
|
350
|
+
for (const fn of hints.auth.functions) {
|
|
351
|
+
const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*\\(`, "m");
|
|
352
|
+
if (pattern.test(src)) {
|
|
353
|
+
status.satisfied = true;
|
|
354
|
+
status.enforced = true; // Trust direct calls in-handler (same as before)
|
|
355
|
+
status.sources.push("direct");
|
|
356
|
+
status.details.push(`calls ${fn}()`);
|
|
357
|
+
return status;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Hint-based HOF wrapping (explicit hint = hard allow)
|
|
361
|
+
for (const fn of hints.auth.functions) {
|
|
362
|
+
const escaped = escapeRegex(fn);
|
|
363
|
+
const hofPattern = new RegExp(`export\\s+(?:const|let|var)\\s+(?:GET|POST|PUT|PATCH|DELETE)\\s*=\\s*${escaped}\\s*\\(`, "m");
|
|
364
|
+
if (hofPattern.test(src)) {
|
|
365
|
+
status.satisfied = true;
|
|
366
|
+
status.enforced = true;
|
|
367
|
+
status.sources.push("hint");
|
|
368
|
+
status.details.push(`wrapped by ${fn}() (in hints)`);
|
|
369
|
+
return status;
|
|
370
|
+
}
|
|
371
|
+
const defaultPattern = new RegExp(`export\\s+default\\s+${escaped}\\s*\\(`, "m");
|
|
372
|
+
if (defaultPattern.test(src)) {
|
|
373
|
+
status.satisfied = true;
|
|
374
|
+
status.enforced = true;
|
|
375
|
+
status.sources.push("hint");
|
|
376
|
+
status.details.push(`wrapped by ${fn}() (in hints)`);
|
|
377
|
+
return status;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// 2. Wrapper evidence from introspection
|
|
382
|
+
for (const wrapperName of chain) {
|
|
383
|
+
const wrapper = wrapperIndex.wrappers.get(wrapperName);
|
|
384
|
+
if (!wrapper)
|
|
385
|
+
continue;
|
|
386
|
+
if (wrapper.resolved && wrapper.evidence.authEnforced) {
|
|
387
|
+
status.satisfied = true;
|
|
388
|
+
status.enforced = true;
|
|
389
|
+
status.sources.push("wrapper");
|
|
390
|
+
status.details.push(`${wrapperName}() enforces auth: ${wrapper.evidence.authDetails.join(", ")}`);
|
|
391
|
+
return status;
|
|
392
|
+
}
|
|
393
|
+
if (wrapper.resolved && wrapper.evidence.authCallPresent && !wrapper.evidence.authEnforced) {
|
|
394
|
+
status.unverifiedWrappers.push(wrapperName);
|
|
395
|
+
status.details.push(`${wrapperName}() calls auth but enforcement not proven`);
|
|
396
|
+
}
|
|
397
|
+
else if (wrapper.resolved && !wrapper.evidence.authCallPresent) {
|
|
398
|
+
// Resolved wrapper with no auth at all — defer to WRAPPER-UNRECOGNIZED
|
|
399
|
+
status.unverifiedWrappers.push(wrapperName);
|
|
400
|
+
status.details.push(`${wrapperName}() resolved but has no auth evidence`);
|
|
401
|
+
}
|
|
402
|
+
if (!wrapper.resolved) {
|
|
403
|
+
status.unverifiedWrappers.push(wrapperName);
|
|
404
|
+
status.details.push(`${wrapperName}() could not be resolved`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// 3. Middleware coverage
|
|
408
|
+
if (middleware.authLikely) {
|
|
409
|
+
const pathname = route.pathname ?? "";
|
|
410
|
+
const matchers = middleware.matcherPatterns;
|
|
411
|
+
const covered = matchers.length === 0 || matchers.some((m) => pathnameMatchesMatcher(pathname, m));
|
|
412
|
+
if (covered) {
|
|
413
|
+
status.satisfied = true;
|
|
414
|
+
status.enforced = true;
|
|
415
|
+
status.sources.push("middleware");
|
|
416
|
+
status.details.push("middleware.ts provides auth for this route");
|
|
417
|
+
return status;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return status;
|
|
421
|
+
}
|
|
422
|
+
function computeRateLimitProtection(route, chain, wrapperIndex, middleware, hints, src) {
|
|
423
|
+
const status = {
|
|
424
|
+
satisfied: false,
|
|
425
|
+
enforced: false,
|
|
426
|
+
sources: [],
|
|
427
|
+
details: [],
|
|
428
|
+
unverifiedWrappers: [],
|
|
429
|
+
};
|
|
430
|
+
// 1. Direct rate-limit call in route (hint-based)
|
|
431
|
+
if (src) {
|
|
432
|
+
for (const fn of hints.rateLimit.wrappers) {
|
|
433
|
+
const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*[.(]`, "m");
|
|
434
|
+
if (pattern.test(src)) {
|
|
435
|
+
status.satisfied = true;
|
|
436
|
+
status.enforced = true;
|
|
437
|
+
status.sources.push("direct");
|
|
438
|
+
status.details.push(`calls ${fn}()`);
|
|
439
|
+
return status;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// Known RL package imports
|
|
443
|
+
const rlImports = [/@upstash\/ratelimit/, /rate-limiter-flexible/, /@arcjet\/next/, /@unkey\/ratelimit/];
|
|
444
|
+
for (const pat of rlImports) {
|
|
445
|
+
if (pat.test(src)) {
|
|
446
|
+
status.satisfied = true;
|
|
447
|
+
status.enforced = true;
|
|
448
|
+
status.sources.push("direct");
|
|
449
|
+
status.details.push(`imports ${pat.source}`);
|
|
450
|
+
return status;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// General pattern: any function call with "ratelimit" or "rate_limit" in the name
|
|
454
|
+
const rlCallMatch = src.match(/\b(\w*(?:rateLimit|ratelimit|rate_limit)\w*)\s*\(/i);
|
|
455
|
+
if (rlCallMatch) {
|
|
456
|
+
status.satisfied = true;
|
|
457
|
+
status.enforced = true;
|
|
458
|
+
status.sources.push("direct");
|
|
459
|
+
status.details.push(`calls ${rlCallMatch[1]}()`);
|
|
460
|
+
return status;
|
|
461
|
+
}
|
|
462
|
+
// Hint-based HOF wrapping (explicit hint = hard allow)
|
|
463
|
+
for (const fn of hints.rateLimit.wrappers) {
|
|
464
|
+
const escaped = escapeRegex(fn);
|
|
465
|
+
const hofPattern = new RegExp(`export\\s+(?:const|let|var)\\s+(?:GET|POST|PUT|PATCH|DELETE)\\s*=\\s*${escaped}\\s*\\(`, "m");
|
|
466
|
+
if (hofPattern.test(src)) {
|
|
467
|
+
status.satisfied = true;
|
|
468
|
+
status.enforced = true;
|
|
469
|
+
status.sources.push("hint");
|
|
470
|
+
status.details.push(`wrapped by ${fn}() (in hints)`);
|
|
471
|
+
return status;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
// 2. Wrapper evidence from introspection
|
|
476
|
+
for (const wrapperName of chain) {
|
|
477
|
+
const wrapper = wrapperIndex.wrappers.get(wrapperName);
|
|
478
|
+
if (!wrapper)
|
|
479
|
+
continue;
|
|
480
|
+
if (wrapper.resolved && wrapper.evidence.rateLimitEnforced) {
|
|
481
|
+
status.satisfied = true;
|
|
482
|
+
status.enforced = true;
|
|
483
|
+
status.sources.push("wrapper");
|
|
484
|
+
status.details.push(`${wrapperName}() enforces rate limiting: ${wrapper.evidence.rateLimitDetails.join(", ")}`);
|
|
485
|
+
return status;
|
|
486
|
+
}
|
|
487
|
+
if (wrapper.resolved && wrapper.evidence.rateLimitCallPresent && !wrapper.evidence.rateLimitEnforced) {
|
|
488
|
+
status.unverifiedWrappers.push(wrapperName);
|
|
489
|
+
status.details.push(`${wrapperName}() calls rate limiter but enforcement not proven`);
|
|
490
|
+
}
|
|
491
|
+
else if (wrapper.resolved && !wrapper.evidence.rateLimitCallPresent) {
|
|
492
|
+
// Resolved wrapper with no RL at all — defer to WRAPPER-UNRECOGNIZED
|
|
493
|
+
status.unverifiedWrappers.push(wrapperName);
|
|
494
|
+
status.details.push(`${wrapperName}() resolved but has no rate-limit evidence`);
|
|
495
|
+
}
|
|
496
|
+
if (!wrapper.resolved) {
|
|
497
|
+
status.unverifiedWrappers.push(wrapperName);
|
|
498
|
+
status.details.push(`${wrapperName}() could not be resolved`);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// 3. Middleware coverage
|
|
502
|
+
if (middleware.rateLimitLikely) {
|
|
503
|
+
status.satisfied = true;
|
|
504
|
+
status.enforced = true;
|
|
505
|
+
status.sources.push("middleware");
|
|
506
|
+
status.details.push("middleware.ts provides rate limiting");
|
|
507
|
+
return status;
|
|
508
|
+
}
|
|
509
|
+
return status;
|
|
510
|
+
}
|
|
511
|
+
function pathnameMatchesMatcher(pathname, matcher) {
|
|
512
|
+
if (matcher.endsWith("/:path*")) {
|
|
513
|
+
const prefix = matcher.replace("/:path*", "");
|
|
514
|
+
return pathname.startsWith(prefix);
|
|
515
|
+
}
|
|
516
|
+
if (matcher.endsWith("(.*)")) {
|
|
517
|
+
const prefix = matcher.replace("(.*)", "");
|
|
518
|
+
return pathname.startsWith(prefix);
|
|
519
|
+
}
|
|
520
|
+
return pathname === matcher || pathname.startsWith(matcher + "/");
|
|
521
|
+
}
|
|
522
|
+
// ---------------------------------------------------------------------------
|
|
523
|
+
// Utilities
|
|
524
|
+
// ---------------------------------------------------------------------------
|
|
525
|
+
function readSource(rootDir, file) {
|
|
526
|
+
try {
|
|
527
|
+
return readFileSync(path.join(rootDir, file), "utf8");
|
|
528
|
+
}
|
|
529
|
+
catch {
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
function escapeRegex(str) {
|
|
534
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
535
|
+
}
|
|
536
|
+
//# sourceMappingURL=wrappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.js","sourceRoot":"","sources":["../../src/next/wrappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.test.d.ts","sourceRoot":"","sources":["../../src/next/wrappers.test.ts"],"names":[],"mappings":""}
|