@next-secure-check/rules 0.3.0 → 0.5.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.
Files changed (54) hide show
  1. package/LICENSE +22 -21
  2. package/README.md +1 -1
  3. package/dist/analysis-cache.d.ts +14 -0
  4. package/dist/analysis-cache.d.ts.map +1 -0
  5. package/dist/analysis-cache.js +28 -0
  6. package/dist/analysis-cache.js.map +1 -0
  7. package/dist/analysis-facts.d.ts +62 -0
  8. package/dist/analysis-facts.d.ts.map +1 -0
  9. package/dist/analysis-facts.js +29 -0
  10. package/dist/analysis-facts.js.map +1 -0
  11. package/dist/ast-utils.d.ts +29 -0
  12. package/dist/ast-utils.d.ts.map +1 -1
  13. package/dist/ast-utils.js +95 -394
  14. package/dist/ast-utils.js.map +1 -1
  15. package/dist/command-ast.d.ts +14 -0
  16. package/dist/command-ast.d.ts.map +1 -0
  17. package/dist/command-ast.js +40 -0
  18. package/dist/command-ast.js.map +1 -0
  19. package/dist/command-discovery.d.ts +8 -0
  20. package/dist/command-discovery.d.ts.map +1 -0
  21. package/dist/command-discovery.js +92 -0
  22. package/dist/command-discovery.js.map +1 -0
  23. package/dist/command-flow.d.ts +25 -0
  24. package/dist/command-flow.d.ts.map +1 -0
  25. package/dist/command-flow.js +467 -0
  26. package/dist/command-flow.js.map +1 -0
  27. package/dist/command-guards.d.ts +4 -0
  28. package/dist/command-guards.d.ts.map +1 -0
  29. package/dist/command-guards.js +92 -0
  30. package/dist/command-guards.js.map +1 -0
  31. package/dist/password-ast.d.ts +4 -0
  32. package/dist/password-ast.d.ts.map +1 -0
  33. package/dist/password-ast.js +102 -0
  34. package/dist/password-ast.js.map +1 -0
  35. package/dist/route-ast.d.ts +9 -0
  36. package/dist/route-ast.d.ts.map +1 -0
  37. package/dist/route-ast.js +340 -0
  38. package/dist/route-ast.js.map +1 -0
  39. package/dist/rule-utils.d.ts +1 -2
  40. package/dist/rule-utils.d.ts.map +1 -1
  41. package/dist/rule-utils.js +1 -13
  42. package/dist/rule-utils.js.map +1 -1
  43. package/dist/security-rules.d.ts.map +1 -1
  44. package/dist/security-rules.js +40 -35
  45. package/dist/security-rules.js.map +1 -1
  46. package/dist/sql-ast.d.ts +6 -0
  47. package/dist/sql-ast.d.ts.map +1 -0
  48. package/dist/sql-ast.js +208 -0
  49. package/dist/sql-ast.js.map +1 -0
  50. package/dist/xss-ast.d.ts +16 -0
  51. package/dist/xss-ast.d.ts.map +1 -0
  52. package/dist/xss-ast.js +162 -0
  53. package/dist/xss-ast.js.map +1 -0
  54. package/package.json +3 -3
@@ -0,0 +1,4 @@
1
+ import ts from "typescript";
2
+ export declare function isCommandAllowlistMembershipCall(node: ts.CallExpression): boolean;
3
+ export declare function hasCommandAllowlistGuard(node: ts.CallExpression, commandName: string): boolean;
4
+ //# sourceMappingURL=command-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-guards.d.ts","sourceRoot":"","sources":["../src/command-guards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,GAAG,OAAO,CAMjF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE9F"}
@@ -0,0 +1,92 @@
1
+ import ts from "typescript";
2
+ const ALLOWLIST_METHODS = new Set(["includes", "has"]);
3
+ export function isCommandAllowlistMembershipCall(node) {
4
+ if (!ts.isPropertyAccessExpression(node.expression) || !ALLOWLIST_METHODS.has(node.expression.name.text)) {
5
+ return false;
6
+ }
7
+ return node.arguments.length === 1 && ts.isIdentifier(node.arguments[0]);
8
+ }
9
+ export function hasCommandAllowlistGuard(node, commandName) {
10
+ return hasSiblingEarlyExitGuard(node, commandName) || hasPositiveAllowlistBranch(node, commandName);
11
+ }
12
+ function hasSiblingEarlyExitGuard(node, commandName) {
13
+ const statement = containingStatement(node);
14
+ if (!statement || !ts.isBlock(statement.parent)) {
15
+ return false;
16
+ }
17
+ const statementIndex = statement.parent.statements.indexOf(statement);
18
+ if (statementIndex <= 0) {
19
+ return false;
20
+ }
21
+ const previousStatement = statement.parent.statements[statementIndex - 1];
22
+ return isRejectingAllowlistGuard(previousStatement, commandName);
23
+ }
24
+ function isRejectingAllowlistGuard(node, commandName) {
25
+ if (!ts.isIfStatement(node) || node.elseStatement || !isNegatedAllowlistCheck(node.expression, commandName)) {
26
+ return false;
27
+ }
28
+ return isExitStatement(node.thenStatement);
29
+ }
30
+ function hasPositiveAllowlistBranch(node, commandName) {
31
+ let current = node;
32
+ while (current.parent) {
33
+ const parent = current.parent;
34
+ if (ts.isIfStatement(parent) && parent.thenStatement === current && isAllowlistCheck(parent.expression, commandName)) {
35
+ return true;
36
+ }
37
+ if (isFunctionBoundary(parent)) {
38
+ return false;
39
+ }
40
+ current = parent;
41
+ }
42
+ return false;
43
+ }
44
+ function isNegatedAllowlistCheck(expression, commandName) {
45
+ const normalized = unwrapParenthesized(expression);
46
+ return ts.isPrefixUnaryExpression(normalized) && normalized.operator === ts.SyntaxKind.ExclamationToken && isAllowlistCheck(normalized.operand, commandName);
47
+ }
48
+ function isAllowlistCheck(expression, commandName) {
49
+ const normalized = unwrapParenthesized(expression);
50
+ if (!ts.isCallExpression(normalized) || !isCommandAllowlistMembershipCall(normalized)) {
51
+ return false;
52
+ }
53
+ const [argument] = normalized.arguments;
54
+ return ts.isIdentifier(argument) && argument.text === commandName;
55
+ }
56
+ function isExitStatement(node) {
57
+ if (ts.isReturnStatement(node) || ts.isThrowStatement(node)) {
58
+ return true;
59
+ }
60
+ if (!ts.isBlock(node) || node.statements.length === 0) {
61
+ return false;
62
+ }
63
+ const lastStatement = node.statements[node.statements.length - 1];
64
+ return ts.isReturnStatement(lastStatement) || ts.isThrowStatement(lastStatement);
65
+ }
66
+ function containingStatement(node) {
67
+ let current = node;
68
+ while (current) {
69
+ if (ts.isStatement(current)) {
70
+ return current;
71
+ }
72
+ current = current.parent;
73
+ }
74
+ return undefined;
75
+ }
76
+ function unwrapParenthesized(expression) {
77
+ let current = expression;
78
+ while (ts.isParenthesizedExpression(current)) {
79
+ current = current.expression;
80
+ }
81
+ return current;
82
+ }
83
+ function isFunctionBoundary(node) {
84
+ return (ts.isArrowFunction(node) ||
85
+ ts.isConstructorDeclaration(node) ||
86
+ ts.isFunctionDeclaration(node) ||
87
+ ts.isFunctionExpression(node) ||
88
+ ts.isGetAccessorDeclaration(node) ||
89
+ ts.isMethodDeclaration(node) ||
90
+ ts.isSetAccessorDeclaration(node));
91
+ }
92
+ //# sourceMappingURL=command-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-guards.js","sourceRoot":"","sources":["../src/command-guards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import ts from "typescript";
2
+ export declare function hasPasswordHashingCall(sourceFile: ts.SourceFile): boolean;
3
+ export declare function findPasswordHandlingNodes(sourceFile: ts.SourceFile): ts.Node[];
4
+ //# sourceMappingURL=password-ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-ast.d.ts","sourceRoot":"","sources":["../src/password-ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CAYzE;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAU9E"}
@@ -0,0 +1,102 @@
1
+ import ts from "typescript";
2
+ import { bindingElementName } from "./command-ast.js";
3
+ export function hasPasswordHashingCall(sourceFile) {
4
+ let hasHashingCall = false;
5
+ visitPasswordNodes(sourceFile, (node) => {
6
+ if (hasHashingCall || !ts.isCallExpression(node)) {
7
+ return;
8
+ }
9
+ hasHashingCall = isPasswordHashingCall(node);
10
+ });
11
+ return hasHashingCall;
12
+ }
13
+ export function findPasswordHandlingNodes(sourceFile) {
14
+ const matches = [];
15
+ visitPasswordNodes(sourceFile, (node) => {
16
+ if (isPasswordHandlingNode(node)) {
17
+ matches.push(node);
18
+ }
19
+ });
20
+ return matches;
21
+ }
22
+ function isPasswordHashingCall(node) {
23
+ const expression = node.expression;
24
+ if (ts.isIdentifier(expression)) {
25
+ return /^scrypt(?:Sync)?$/i.test(expression.text);
26
+ }
27
+ if (!ts.isPropertyAccessExpression(expression)) {
28
+ return false;
29
+ }
30
+ const methodName = expression.name.text;
31
+ const targetName = expressionNameText(expression.expression);
32
+ if (/^scrypt(?:Sync)?$/i.test(methodName) && targetName === "crypto") {
33
+ return true;
34
+ }
35
+ return methodName === "hash" && (targetName === "bcrypt" || targetName === "argon2");
36
+ }
37
+ function isPasswordHandlingNode(node) {
38
+ if (ts.isVariableDeclaration(node)) {
39
+ return isPasswordVariableDeclaration(node);
40
+ }
41
+ return (ts.isPropertyAccessExpression(node) &&
42
+ node.name.text === "password" &&
43
+ isRequestBodyExpression(node.expression) &&
44
+ !isVariableDeclarationInitializer(node));
45
+ }
46
+ function isPasswordVariableDeclaration(node) {
47
+ if (!node.initializer) {
48
+ return false;
49
+ }
50
+ if (ts.isIdentifier(node.name) && node.name.text === "password") {
51
+ return isPasswordSourceExpression(node.initializer);
52
+ }
53
+ if (!ts.isObjectBindingPattern(node.name)) {
54
+ return false;
55
+ }
56
+ return node.name.elements.some((element) => bindingElementName(element) === "password") && isCredentialJsonExpression(node.initializer);
57
+ }
58
+ function isPasswordSourceExpression(expression) {
59
+ return isPasswordPropertyAccess(expression) || isPasswordFormDataGetCall(expression);
60
+ }
61
+ function isPasswordPropertyAccess(expression) {
62
+ return ts.isPropertyAccessExpression(expression) && expression.name.text === "password" && isCredentialContainerExpression(expression.expression);
63
+ }
64
+ function isPasswordFormDataGetCall(expression) {
65
+ if (!ts.isCallExpression(expression) || !ts.isPropertyAccessExpression(expression.expression) || expression.expression.name.text !== "get") {
66
+ return false;
67
+ }
68
+ const [fieldName] = expression.arguments;
69
+ return fieldName !== undefined && ts.isStringLiteralLike(fieldName) && fieldName.text === "password";
70
+ }
71
+ function isVariableDeclarationInitializer(expression) {
72
+ return ts.isVariableDeclaration(expression.parent) && expression.parent.initializer === expression;
73
+ }
74
+ function isCredentialContainerExpression(expression) {
75
+ return isRequestBodyExpression(expression) || isCredentialLikeIdentifier(expression);
76
+ }
77
+ function isRequestBodyExpression(expression) {
78
+ return ((ts.isIdentifier(expression) && /^(body|credentials|credential|data|payload|formData)$/i.test(expression.text)) ||
79
+ (ts.isPropertyAccessExpression(expression) &&
80
+ expression.name.text === "body" &&
81
+ ts.isIdentifier(expression.expression) &&
82
+ /^(req|request)$/i.test(expression.expression.text)));
83
+ }
84
+ function isCredentialJsonExpression(expression) {
85
+ const unwrappedExpression = ts.isAwaitExpression(expression) ? expression.expression : expression;
86
+ return (ts.isCallExpression(unwrappedExpression) &&
87
+ ts.isPropertyAccessExpression(unwrappedExpression.expression) &&
88
+ unwrappedExpression.expression.name.text === "json" &&
89
+ ts.isIdentifier(unwrappedExpression.expression.expression) &&
90
+ /^(request|req)$/i.test(unwrappedExpression.expression.expression.text));
91
+ }
92
+ function isCredentialLikeIdentifier(expression) {
93
+ return ts.isIdentifier(expression) && /^(credentials?|user|account)$/i.test(expression.text);
94
+ }
95
+ function expressionNameText(expression) {
96
+ return ts.isIdentifier(expression) ? expression.text : undefined;
97
+ }
98
+ function visitPasswordNodes(node, callback) {
99
+ callback(node);
100
+ ts.forEachChild(node, (child) => visitPasswordNodes(child, callback));
101
+ }
102
+ //# sourceMappingURL=password-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-ast.js","sourceRoot":"","sources":["../src/password-ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import ts from "typescript";
2
+ export declare const ROUTE_HANDLER_NAMES: Set<string>;
3
+ export declare function hasAuthIntentInSource(sourceFile: ts.SourceFile): boolean;
4
+ export declare function hasValidationIntentInSource(sourceFile: ts.SourceFile): boolean;
5
+ export declare function hasRateLimitIntentInSource(sourceFile: ts.SourceFile): boolean;
6
+ export declare function exportedRouteHandlerName(node: ts.Node): string | undefined;
7
+ export declare function isApiRouteFilePath(filePath: string): boolean;
8
+ export declare function isUploadHandlingNode(node: ts.Node): boolean;
9
+ //# sourceMappingURL=route-ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-ast.d.ts","sourceRoot":"","sources":["../src/route-ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,eAAO,MAAM,mBAAmB,aAAqD,CAAC;AAwCtF,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CA0BxE;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CA6B9E;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CA6B7E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,CAe1E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAS5D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAsB3D"}
@@ -0,0 +1,340 @@
1
+ import ts from "typescript";
2
+ export const ROUTE_HANDLER_NAMES = new Set(["GET", "POST", "PUT", "DELETE", "PATCH"]);
3
+ const ALWAYS_RECOGNIZED_AUTH_CALL_NAMES = new Set([
4
+ "currentUser",
5
+ "getServerSession",
6
+ "isAdmin",
7
+ "requireAuth",
8
+ "verifyToken",
9
+ "withAuth",
10
+ "clerkMiddleware"
11
+ ]);
12
+ const CONDITIONAL_AUTH_CALL_NAMES = new Set(["auth", "clerk", "getUser"]);
13
+ const KNOWN_AUTH_MODULE_PATTERN = /^(?:next-auth(?:\/|$)|@auth(?:\/|$)|@clerk\/nextjs(?:\/|$)|@supabase\/(?:ssr|auth-helpers-nextjs)(?:\/|$)|better-auth(?:\/|$))/i;
14
+ const AUTH_GUARD_PROPERTY_NAMES = new Set(["permission", "role"]);
15
+ const AUTH_GUARD_TARGET_NAMES = new Set(["account", "claims", "session", "user"]);
16
+ const VALIDATION_CALL_NAMES = new Set(["isValid", "parse", "safeParse", "validate", "validateSync"]);
17
+ const VALIDATION_MODULE_PATTERN = /^(?:arktype|joi|superstruct|valibot|yup|zod)(?:\/|$)/i;
18
+ const RATE_LIMIT_CALL_NAMES = new Set([
19
+ "applyRateLimit",
20
+ "checkRateLimit",
21
+ "enforceRateLimit",
22
+ "rateLimit",
23
+ "rateLimited",
24
+ "slowDown",
25
+ "throttle",
26
+ "withRateLimit"
27
+ ]);
28
+ const RATE_LIMIT_METHOD_NAMES = new Set(["check", "consume", "limit", "rateLimit"]);
29
+ const RATE_LIMIT_RECEIVER_PATTERN = /^(?:limiter|rateLimit|rateLimiter|ratelimit|redis|throttle|upstash)$/i;
30
+ const RESPONSE_FACTORY_NAMES = new Set(["json", "redirect", "rewrite"]);
31
+ const RESPONSE_NAMES = new Set(["NextResponse", "Response"]);
32
+ const RESPONSE_OBJECT_NAMES = new Set(["reply", "res", "response"]);
33
+ const VALIDATION_TYPE_NAMES = new Set(["boolean", "function", "number", "object", "string"]);
34
+ const TYPEOF_COMPARISON_OPERATORS = new Set([
35
+ ts.SyntaxKind.EqualsEqualsToken,
36
+ ts.SyntaxKind.EqualsEqualsEqualsToken,
37
+ ts.SyntaxKind.ExclamationEqualsToken,
38
+ ts.SyntaxKind.ExclamationEqualsEqualsToken
39
+ ]);
40
+ export function hasAuthIntentInSource(sourceFile) {
41
+ const bindings = collectAuthIntentBindings(sourceFile);
42
+ for (const root of routeHandlerRoots(sourceFile)) {
43
+ let found = false;
44
+ visitRouteNodes(root, (node) => {
45
+ if (found) {
46
+ return;
47
+ }
48
+ if (ts.isCallExpression(node) && isAuthIntentCall(node.expression, bindings)) {
49
+ found = true;
50
+ return;
51
+ }
52
+ if (ts.isPropertyAccessExpression(node) && isAuthGuardProperty(node)) {
53
+ found = true;
54
+ }
55
+ });
56
+ if (!found) {
57
+ return false;
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+ export function hasValidationIntentInSource(sourceFile) {
63
+ let found = false;
64
+ if (sourceFile.statements.some((node) => ts.isImportDeclaration(node) && isValidationLibraryImport(node))) {
65
+ return true;
66
+ }
67
+ for (const root of routeHandlerRoots(sourceFile)) {
68
+ visitRouteNodes(root, (node) => {
69
+ if (found) {
70
+ return;
71
+ }
72
+ if (ts.isCallExpression(node) && isValidationCall(node)) {
73
+ found = true;
74
+ return;
75
+ }
76
+ if (ts.isBinaryExpression(node) && isTypeofValidationCheck(node)) {
77
+ found = true;
78
+ }
79
+ });
80
+ if (found) {
81
+ break;
82
+ }
83
+ }
84
+ return found;
85
+ }
86
+ export function hasRateLimitIntentInSource(sourceFile) {
87
+ for (const root of routeHandlerRoots(sourceFile)) {
88
+ let found = false;
89
+ visitRouteNodes(root, (node) => {
90
+ if (found) {
91
+ return;
92
+ }
93
+ if (ts.isCallExpression(node) && (isRateLimitCall(node.expression) || isRateLimitResponseCall(node))) {
94
+ found = true;
95
+ return;
96
+ }
97
+ if (ts.isNewExpression(node) && isRateLimitResponseConstructor(node)) {
98
+ found = true;
99
+ return;
100
+ }
101
+ if (ts.isBinaryExpression(node) && isRateLimitStatusAssignment(node)) {
102
+ found = true;
103
+ }
104
+ });
105
+ if (!found) {
106
+ return false;
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+ export function exportedRouteHandlerName(node) {
112
+ if (ts.isFunctionDeclaration(node) && hasDefaultExportModifier(node)) {
113
+ return "DEFAULT";
114
+ }
115
+ if (ts.isFunctionDeclaration(node) && hasExportModifier(node) && node.name) {
116
+ return node.name.text;
117
+ }
118
+ if (!ts.isVariableStatement(node) || !hasExportModifier(node)) {
119
+ return undefined;
120
+ }
121
+ const [declaration] = node.declarationList.declarations;
122
+ return declaration && ts.isIdentifier(declaration.name) ? declaration.name.text : undefined;
123
+ }
124
+ export function isApiRouteFilePath(filePath) {
125
+ const normalizedPath = filePath.replace(/\\/g, "/");
126
+ return (/^(?:(?:apps|packages)\/[^/]+\/)?(?:src\/)?app\/api(?:\/[^/]+)*\/route\.[tj]s$/i.test(normalizedPath) ||
127
+ /^pages\/api\/.*\.([tj]s)$/i.test(normalizedPath) ||
128
+ /^src\/pages\/api\/.*\.([tj]s)$/i.test(normalizedPath) ||
129
+ /^(?:apps|packages)\/[^/]+\/pages\/api\/.*\.([tj]s)$/i.test(normalizedPath) ||
130
+ /^(?:apps|packages)\/[^/]+\/src\/pages\/api\/.*\.([tj]s)$/i.test(normalizedPath));
131
+ }
132
+ export function isUploadHandlingNode(node) {
133
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
134
+ const methodName = node.expression.name.text;
135
+ if (methodName === "formData") {
136
+ return true;
137
+ }
138
+ if (methodName === "get") {
139
+ const [fieldName] = node.arguments;
140
+ return fieldName !== undefined && ts.isStringLiteralLike(fieldName) && /^(file|files|blob|image|avatar|media)$/i.test(fieldName.text);
141
+ }
142
+ }
143
+ if (ts.isIdentifier(node)) {
144
+ return /^(file|files|blob|formData)$/i.test(node.text);
145
+ }
146
+ if (ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName)) {
147
+ return /^(File|Blob|FormData)$/i.test(node.typeName.text);
148
+ }
149
+ return false;
150
+ }
151
+ function isAuthIntentCall(expression, bindings) {
152
+ if (ts.isIdentifier(expression)) {
153
+ return ALWAYS_RECOGNIZED_AUTH_CALL_NAMES.has(expression.text) || bindings.trusted.has(expression.text);
154
+ }
155
+ if (!ts.isPropertyAccessExpression(expression)) {
156
+ return false;
157
+ }
158
+ if (ALWAYS_RECOGNIZED_AUTH_CALL_NAMES.has(expression.name.text) || bindings.trusted.has(expression.name.text)) {
159
+ return true;
160
+ }
161
+ if (expression.name.text === "protect") {
162
+ const receiver = rootIdentifier(expression.expression);
163
+ if (receiver && bindings.trusted.has(receiver.text)) {
164
+ return true;
165
+ }
166
+ }
167
+ return (expression.name.text === "verify" &&
168
+ ts.isIdentifier(expression.expression) &&
169
+ /^(auth|jwt|session|token)$/i.test(expression.expression.text));
170
+ }
171
+ function isAuthGuardProperty(node) {
172
+ const target = rootIdentifier(node.expression);
173
+ return (AUTH_GUARD_PROPERTY_NAMES.has(node.name.text) &&
174
+ target !== undefined &&
175
+ AUTH_GUARD_TARGET_NAMES.has(target.text) &&
176
+ isWithinGuardCondition(node));
177
+ }
178
+ function isWithinGuardCondition(node) {
179
+ let current = node;
180
+ while (current.parent) {
181
+ const parent = current.parent;
182
+ if ((ts.isIfStatement(parent) && parent.expression === current) ||
183
+ (ts.isWhileStatement(parent) && parent.expression === current) ||
184
+ (ts.isDoStatement(parent) && parent.expression === current) ||
185
+ (ts.isForStatement(parent) && parent.condition === current) ||
186
+ (ts.isConditionalExpression(parent) && parent.condition === current)) {
187
+ return true;
188
+ }
189
+ current = parent;
190
+ }
191
+ return false;
192
+ }
193
+ function collectAuthIntentBindings(sourceFile) {
194
+ const trusted = new Set();
195
+ for (const statement of sourceFile.statements) {
196
+ if (!ts.isImportDeclaration(statement) || !statement.importClause) {
197
+ continue;
198
+ }
199
+ const moduleName = ts.isStringLiteralLike(statement.moduleSpecifier) ? statement.moduleSpecifier.text : "";
200
+ const knownModule = KNOWN_AUTH_MODULE_PATTERN.test(moduleName);
201
+ const importClause = statement.importClause;
202
+ if (importClause.name && CONDITIONAL_AUTH_CALL_NAMES.has(importClause.name.text)) {
203
+ addAuthBinding(importClause.name.text, knownModule, trusted);
204
+ }
205
+ if (!importClause.namedBindings || ts.isNamespaceImport(importClause.namedBindings)) {
206
+ continue;
207
+ }
208
+ for (const element of importClause.namedBindings.elements) {
209
+ const importedName = element.propertyName?.text ?? element.name.text;
210
+ if (!CONDITIONAL_AUTH_CALL_NAMES.has(importedName)) {
211
+ continue;
212
+ }
213
+ addAuthBinding(element.name.text, knownModule, trusted);
214
+ }
215
+ }
216
+ return { trusted };
217
+ }
218
+ function addAuthBinding(name, knownModule, trusted) {
219
+ if (knownModule) {
220
+ trusted.add(name);
221
+ }
222
+ }
223
+ function isValidationLibraryImport(node) {
224
+ return ts.isStringLiteralLike(node.moduleSpecifier) && VALIDATION_MODULE_PATTERN.test(node.moduleSpecifier.text);
225
+ }
226
+ function isValidationCall(node) {
227
+ const expression = node.expression;
228
+ if (ts.isIdentifier(expression)) {
229
+ return VALIDATION_CALL_NAMES.has(expression.text);
230
+ }
231
+ if (!ts.isPropertyAccessExpression(expression)) {
232
+ return false;
233
+ }
234
+ if (expression.name.text === "isArray" && isArrayTarget(expression.expression)) {
235
+ return true;
236
+ }
237
+ if (!VALIDATION_CALL_NAMES.has(expression.name.text)) {
238
+ return false;
239
+ }
240
+ return expression.name.text !== "parse" || !isBuiltInParserTarget(expression.expression);
241
+ }
242
+ function isRateLimitCall(expression) {
243
+ if (ts.isIdentifier(expression)) {
244
+ return RATE_LIMIT_CALL_NAMES.has(expression.text);
245
+ }
246
+ if (!ts.isPropertyAccessExpression(expression) || !RATE_LIMIT_METHOD_NAMES.has(expression.name.text)) {
247
+ return false;
248
+ }
249
+ const receiver = rootIdentifier(expression.expression);
250
+ return receiver !== undefined && RATE_LIMIT_RECEIVER_PATTERN.test(receiver.text);
251
+ }
252
+ function isRateLimitResponseCall(node) {
253
+ const expression = node.expression;
254
+ if (ts.isPropertyAccessExpression(expression)) {
255
+ const receiver = rootIdentifier(expression.expression);
256
+ if (receiver && RESPONSE_NAMES.has(receiver.text) && RESPONSE_FACTORY_NAMES.has(expression.name.text)) {
257
+ return hasRateLimitStatusArgument(node.arguments[1]);
258
+ }
259
+ if (receiver && RESPONSE_OBJECT_NAMES.has(receiver.text) && expression.name.text === "status") {
260
+ return isNumeric429(node.arguments[0]);
261
+ }
262
+ }
263
+ return false;
264
+ }
265
+ function isRateLimitResponseConstructor(node) {
266
+ return ts.isIdentifier(node.expression) && RESPONSE_NAMES.has(node.expression.text) && hasRateLimitStatusArgument(node.arguments?.[1]);
267
+ }
268
+ function isRateLimitStatusAssignment(node) {
269
+ if (node.operatorToken.kind !== ts.SyntaxKind.EqualsToken || !ts.isPropertyAccessExpression(node.left)) {
270
+ return false;
271
+ }
272
+ const receiver = rootIdentifier(node.left.expression);
273
+ return (receiver !== undefined &&
274
+ RESPONSE_OBJECT_NAMES.has(receiver.text) &&
275
+ node.left.name.text === "statusCode" &&
276
+ isNumeric429(node.right));
277
+ }
278
+ function hasRateLimitStatusArgument(node) {
279
+ if (!node) {
280
+ return false;
281
+ }
282
+ let found = false;
283
+ visitRouteNodes(node, (child) => {
284
+ if (found || !ts.isPropertyAssignment(child)) {
285
+ return;
286
+ }
287
+ const propertyName = ts.isStringLiteralLike(child.name) ? child.name.text : child.name.getText();
288
+ if (propertyName === "status") {
289
+ found = isNumeric429(child.initializer);
290
+ }
291
+ });
292
+ return found;
293
+ }
294
+ function isNumeric429(node) {
295
+ return node !== undefined && ts.isNumericLiteral(node) && Number(node.text) === 429;
296
+ }
297
+ function routeHandlerRoots(sourceFile) {
298
+ const routeHandlers = sourceFile.statements.filter((statement) => {
299
+ const name = exportedRouteHandlerName(statement);
300
+ return name === "DEFAULT" || (name !== undefined && ROUTE_HANDLER_NAMES.has(name));
301
+ });
302
+ return routeHandlers.length > 0 ? routeHandlers : [sourceFile];
303
+ }
304
+ function rootIdentifier(expression) {
305
+ if (ts.isIdentifier(expression)) {
306
+ return expression;
307
+ }
308
+ if (ts.isPropertyAccessExpression(expression)) {
309
+ return rootIdentifier(expression.expression);
310
+ }
311
+ if (ts.isElementAccessExpression(expression)) {
312
+ return rootIdentifier(expression.expression);
313
+ }
314
+ return undefined;
315
+ }
316
+ function isArrayTarget(expression) {
317
+ return ts.isIdentifier(expression) && expression.text === "Array";
318
+ }
319
+ function isBuiltInParserTarget(expression) {
320
+ return ts.isIdentifier(expression) && /^(?:Date|JSON|Number|URL)$/i.test(expression.text);
321
+ }
322
+ function isTypeofValidationCheck(node) {
323
+ if (!TYPEOF_COMPARISON_OPERATORS.has(node.operatorToken.kind) || !ts.isTypeOfExpression(node.left)) {
324
+ return false;
325
+ }
326
+ return ts.isStringLiteralLike(node.right) && VALIDATION_TYPE_NAMES.has(node.right.text);
327
+ }
328
+ function hasExportModifier(node) {
329
+ return ts.canHaveModifiers(node) && (ts.getModifiers(node) ?? []).some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword);
330
+ }
331
+ function hasDefaultExportModifier(node) {
332
+ const modifiers = ts.canHaveModifiers(node) ? (ts.getModifiers(node) ?? []) : [];
333
+ return (modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) &&
334
+ modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword));
335
+ }
336
+ function visitRouteNodes(node, callback) {
337
+ callback(node);
338
+ ts.forEachChild(node, (child) => visitRouteNodes(child, callback));
339
+ }
340
+ //# sourceMappingURL=route-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-ast.js","sourceRoot":"","sources":["../src/route-ast.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export type FindingInput = {
7
7
  line?: number;
8
8
  column?: number;
9
9
  evidence?: string;
10
+ evidencePath?: string;
10
11
  description: string;
11
12
  recommendation: string;
12
13
  confidence?: Confidence;
@@ -19,8 +20,6 @@ export declare function findMatches(file: SourceFile, pattern: RegExp): Array<{
19
20
  evidence: string;
20
21
  sourceLine: string;
21
22
  }>;
22
- export declare function hasDependency(context: ScanContext, packageNames: string[]): boolean;
23
- export declare function projectContains(context: ScanContext, pattern: RegExp): boolean;
24
23
  export declare function codeFiles(context: ScanContext): SourceFile[];
25
24
  export declare function configFiles(context: ScanContext): SourceFile[];
26
25
  //# sourceMappingURL=rule-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule-utils.d.ts","sourceRoot":"","sources":["../src/rule-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAElG,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAgB1D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAOnF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAK9E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAE5D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAE9D"}
1
+ {"version":3,"file":"rule-utils.d.ts","sourceRoot":"","sources":["../src/rule-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAElG,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAiB1D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAE5D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAE9D"}