couchloop-eq-mcp 1.0.3 → 1.0.5

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 (285) hide show
  1. package/README.md +24 -11
  2. package/dist/clients/shrinkChatClient.js +1 -1
  3. package/dist/clients/shrinkChatClient.js.map +1 -1
  4. package/dist/developer/analyzers/bloat-detector.d.ts +89 -0
  5. package/dist/developer/analyzers/bloat-detector.d.ts.map +1 -0
  6. package/dist/developer/analyzers/bloat-detector.js +483 -0
  7. package/dist/developer/analyzers/bloat-detector.js.map +1 -0
  8. package/dist/developer/backup/auto-backup.d.ts +96 -0
  9. package/dist/developer/backup/auto-backup.d.ts.map +1 -0
  10. package/dist/developer/backup/auto-backup.js +346 -0
  11. package/dist/developer/backup/auto-backup.js.map +1 -0
  12. package/dist/developer/blockers/package-blocker.d.ts +33 -0
  13. package/dist/developer/blockers/package-blocker.d.ts.map +1 -0
  14. package/dist/developer/blockers/package-blocker.js +224 -0
  15. package/dist/developer/blockers/package-blocker.js.map +1 -0
  16. package/dist/developer/evaluators/ai-error-preventer.d.ts +54 -0
  17. package/dist/developer/evaluators/ai-error-preventer.d.ts.map +1 -0
  18. package/dist/developer/evaluators/ai-error-preventer.js +270 -0
  19. package/dist/developer/evaluators/ai-error-preventer.js.map +1 -0
  20. package/dist/developer/evaluators/build-context-detector.d.ts +44 -0
  21. package/dist/developer/evaluators/build-context-detector.d.ts.map +1 -0
  22. package/dist/developer/evaluators/build-context-detector.js +258 -0
  23. package/dist/developer/evaluators/build-context-detector.js.map +1 -0
  24. package/dist/developer/evaluators/package-evaluator.d.ts +37 -0
  25. package/dist/developer/evaluators/package-evaluator.d.ts.map +1 -0
  26. package/dist/developer/evaluators/package-evaluator.js +278 -0
  27. package/dist/developer/evaluators/package-evaluator.js.map +1 -0
  28. package/dist/developer/guards/file-guardian.d.ts +79 -0
  29. package/dist/developer/guards/file-guardian.d.ts.map +1 -0
  30. package/dist/developer/guards/file-guardian.js +309 -0
  31. package/dist/developer/guards/file-guardian.js.map +1 -0
  32. package/dist/developer/managers/context-manager.d.ts +61 -0
  33. package/dist/developer/managers/context-manager.d.ts.map +1 -0
  34. package/dist/developer/managers/context-manager.js +302 -0
  35. package/dist/developer/managers/context-manager.js.map +1 -0
  36. package/dist/developer/metrics/complexity-calculator.d.ts +52 -0
  37. package/dist/developer/metrics/complexity-calculator.d.ts.map +1 -0
  38. package/dist/developer/metrics/complexity-calculator.js +259 -0
  39. package/dist/developer/metrics/complexity-calculator.js.map +1 -0
  40. package/dist/developer/reports/review-summary.d.ts +49 -0
  41. package/dist/developer/reports/review-summary.d.ts.map +1 -0
  42. package/dist/developer/reports/review-summary.js +249 -0
  43. package/dist/developer/reports/review-summary.js.map +1 -0
  44. package/dist/developer/scanners/review-assistant.d.ts +41 -0
  45. package/dist/developer/scanners/review-assistant.d.ts.map +1 -0
  46. package/dist/developer/scanners/review-assistant.js +374 -0
  47. package/dist/developer/scanners/review-assistant.js.map +1 -0
  48. package/dist/developer/scanners/secret-scanner.d.ts +66 -0
  49. package/dist/developer/scanners/secret-scanner.d.ts.map +1 -0
  50. package/dist/developer/scanners/secret-scanner.js +287 -0
  51. package/dist/developer/scanners/secret-scanner.js.map +1 -0
  52. package/dist/developer/scanners/sql-injection-detector.d.ts +54 -0
  53. package/dist/developer/scanners/sql-injection-detector.d.ts.map +1 -0
  54. package/dist/developer/scanners/sql-injection-detector.js +174 -0
  55. package/dist/developer/scanners/sql-injection-detector.js.map +1 -0
  56. package/dist/developer/scanners/xss-detector.d.ts +60 -0
  57. package/dist/developer/scanners/xss-detector.d.ts.map +1 -0
  58. package/dist/developer/scanners/xss-detector.js +229 -0
  59. package/dist/developer/scanners/xss-detector.js.map +1 -0
  60. package/dist/developer/types/ai-errors.d.ts +34 -0
  61. package/dist/developer/types/ai-errors.d.ts.map +1 -0
  62. package/dist/developer/types/ai-errors.js +271 -0
  63. package/dist/developer/types/ai-errors.js.map +1 -0
  64. package/dist/developer/types/package.d.ts +32 -0
  65. package/dist/developer/types/package.d.ts.map +1 -0
  66. package/dist/developer/types/package.js +5 -0
  67. package/dist/developer/types/package.js.map +1 -0
  68. package/dist/developer/updaters/dependency-updater.d.ts +102 -0
  69. package/dist/developer/updaters/dependency-updater.d.ts.map +1 -0
  70. package/dist/developer/updaters/dependency-updater.js +472 -0
  71. package/dist/developer/updaters/dependency-updater.js.map +1 -0
  72. package/dist/developer/validators/cargo.d.ts +14 -0
  73. package/dist/developer/validators/cargo.d.ts.map +1 -0
  74. package/dist/developer/validators/cargo.js +132 -0
  75. package/dist/developer/validators/cargo.js.map +1 -0
  76. package/dist/developer/validators/gem.d.ts +14 -0
  77. package/dist/developer/validators/gem.d.ts.map +1 -0
  78. package/dist/developer/validators/gem.js +85 -0
  79. package/dist/developer/validators/gem.js.map +1 -0
  80. package/dist/developer/validators/go.d.ts +14 -0
  81. package/dist/developer/validators/go.d.ts.map +1 -0
  82. package/dist/developer/validators/go.js +138 -0
  83. package/dist/developer/validators/go.js.map +1 -0
  84. package/dist/developer/validators/maven.d.ts +14 -0
  85. package/dist/developer/validators/maven.d.ts.map +1 -0
  86. package/dist/developer/validators/maven.js +99 -0
  87. package/dist/developer/validators/maven.js.map +1 -0
  88. package/dist/developer/validators/npm.d.ts +14 -0
  89. package/dist/developer/validators/npm.d.ts.map +1 -0
  90. package/dist/developer/validators/npm.js +96 -0
  91. package/dist/developer/validators/npm.js.map +1 -0
  92. package/dist/developer/validators/nuget.d.ts +15 -0
  93. package/dist/developer/validators/nuget.d.ts.map +1 -0
  94. package/dist/developer/validators/nuget.js +107 -0
  95. package/dist/developer/validators/nuget.js.map +1 -0
  96. package/dist/developer/validators/pypi.d.ts +14 -0
  97. package/dist/developer/validators/pypi.d.ts.map +1 -0
  98. package/dist/developer/validators/pypi.js +118 -0
  99. package/dist/developer/validators/pypi.js.map +1 -0
  100. package/dist/developer/validators/registry-manager.d.ts +37 -0
  101. package/dist/developer/validators/registry-manager.d.ts.map +1 -0
  102. package/dist/developer/validators/registry-manager.js +89 -0
  103. package/dist/developer/validators/registry-manager.js.map +1 -0
  104. package/dist/developer/validators/version-checker.d.ts +145 -0
  105. package/dist/developer/validators/version-checker.d.ts.map +1 -0
  106. package/dist/developer/validators/version-checker.js +529 -0
  107. package/dist/developer/validators/version-checker.js.map +1 -0
  108. package/dist/server/index.js.map +1 -1
  109. package/dist/server/middleware/auth.d.ts +7 -9
  110. package/dist/server/middleware/auth.d.ts.map +1 -1
  111. package/dist/server/middleware/auth.js.map +1 -1
  112. package/dist/tools/check-versions.d.ts +100 -0
  113. package/dist/tools/check-versions.d.ts.map +1 -0
  114. package/dist/tools/check-versions.js +328 -0
  115. package/dist/tools/check-versions.js.map +1 -0
  116. package/dist/tools/detect-code-smell.d.ts +9 -0
  117. package/dist/tools/detect-code-smell.d.ts.map +1 -0
  118. package/dist/tools/detect-code-smell.js +231 -0
  119. package/dist/tools/detect-code-smell.js.map +1 -0
  120. package/dist/tools/index.d.ts +471 -0
  121. package/dist/tools/index.d.ts.map +1 -1
  122. package/dist/tools/index.js +178 -0
  123. package/dist/tools/index.js.map +1 -1
  124. package/dist/tools/journey.js +1 -1
  125. package/dist/tools/journey.js.map +1 -1
  126. package/dist/tools/pre-review-code.d.ts +71 -0
  127. package/dist/tools/pre-review-code.d.ts.map +1 -0
  128. package/dist/tools/pre-review-code.js +159 -0
  129. package/dist/tools/pre-review-code.js.map +1 -0
  130. package/dist/tools/preserve-context.d.ts +27 -0
  131. package/dist/tools/preserve-context.d.ts.map +1 -0
  132. package/dist/tools/preserve-context.js +98 -0
  133. package/dist/tools/preserve-context.js.map +1 -0
  134. package/dist/tools/protect-files.d.ts +224 -0
  135. package/dist/tools/protect-files.d.ts.map +1 -0
  136. package/dist/tools/protect-files.js +286 -0
  137. package/dist/tools/protect-files.js.map +1 -0
  138. package/dist/tools/scan-security.d.ts +38 -0
  139. package/dist/tools/scan-security.d.ts.map +1 -0
  140. package/dist/tools/scan-security.js +237 -0
  141. package/dist/tools/scan-security.js.map +1 -0
  142. package/dist/tools/validate_packages.d.ts +8 -0
  143. package/dist/tools/validate_packages.d.ts.map +1 -0
  144. package/dist/tools/validate_packages.js +159 -0
  145. package/dist/tools/validate_packages.js.map +1 -0
  146. package/dist/types/auth.d.ts +18 -18
  147. package/dist/types/auth.d.ts.map +1 -1
  148. package/dist/types/auth.js +91 -36
  149. package/dist/types/auth.js.map +1 -1
  150. package/dist/types/context.d.ts +46 -0
  151. package/dist/types/context.d.ts.map +1 -0
  152. package/dist/types/context.js +17 -0
  153. package/dist/types/context.js.map +1 -0
  154. package/dist/types/file-protection.d.ts +50 -0
  155. package/dist/types/file-protection.d.ts.map +1 -0
  156. package/dist/types/file-protection.js +9 -0
  157. package/dist/types/file-protection.js.map +1 -0
  158. package/dist/utils/errorHandler.d.ts.map +1 -1
  159. package/dist/utils/errorHandler.js +2 -1
  160. package/dist/utils/errorHandler.js.map +1 -1
  161. package/package.json +23 -2
  162. package/dist/db/migrate.d.ts +0 -4
  163. package/dist/db/migrate.d.ts.map +0 -1
  164. package/dist/db/migrate.js +0 -34
  165. package/dist/db/migrate.js.map +0 -1
  166. package/dist/db/migrations/schema.d.ts +0 -1074
  167. package/dist/db/migrations/schema.d.ts.map +0 -1
  168. package/dist/db/migrations/schema.js +0 -160
  169. package/dist/db/migrations/schema.js.map +0 -1
  170. package/dist/db/schema.d.ts +0 -1576
  171. package/dist/db/schema.d.ts.map +0 -1
  172. package/dist/db/schema.js +0 -204
  173. package/dist/db/schema.js.map +0 -1
  174. package/dist/db/seed.d.ts +0 -4
  175. package/dist/db/seed.d.ts.map +0 -1
  176. package/dist/db/seed.js +0 -57
  177. package/dist/db/seed.js.map +0 -1
  178. package/dist/db/seedOAuth.d.ts +0 -4
  179. package/dist/db/seedOAuth.d.ts.map +0 -1
  180. package/dist/db/seedOAuth.js +0 -76
  181. package/dist/db/seedOAuth.js.map +0 -1
  182. package/dist/governance/config.d.ts +0 -66
  183. package/dist/governance/config.d.ts.map +0 -1
  184. package/dist/governance/config.js +0 -238
  185. package/dist/governance/config.js.map +0 -1
  186. package/dist/governance/detectors/hallucination.d.ts +0 -61
  187. package/dist/governance/detectors/hallucination.d.ts.map +0 -1
  188. package/dist/governance/detectors/hallucination.js +0 -338
  189. package/dist/governance/detectors/hallucination.js.map +0 -1
  190. package/dist/governance/detectors/inconsistency.d.ts +0 -99
  191. package/dist/governance/detectors/inconsistency.d.ts.map +0 -1
  192. package/dist/governance/detectors/inconsistency.js +0 -548
  193. package/dist/governance/detectors/inconsistency.js.map +0 -1
  194. package/dist/governance/detectors/toneDrift.d.ts +0 -63
  195. package/dist/governance/detectors/toneDrift.d.ts.map +0 -1
  196. package/dist/governance/detectors/toneDrift.js +0 -421
  197. package/dist/governance/detectors/toneDrift.js.map +0 -1
  198. package/dist/governance/detectors/unsafeReasoning.d.ts +0 -54
  199. package/dist/governance/detectors/unsafeReasoning.d.ts.map +0 -1
  200. package/dist/governance/detectors/unsafeReasoning.js +0 -473
  201. package/dist/governance/detectors/unsafeReasoning.js.map +0 -1
  202. package/dist/governance/evaluationEngine.d.ts +0 -112
  203. package/dist/governance/evaluationEngine.d.ts.map +0 -1
  204. package/dist/governance/evaluationEngine.js +0 -265
  205. package/dist/governance/evaluationEngine.js.map +0 -1
  206. package/dist/governance/intervention.d.ts +0 -81
  207. package/dist/governance/intervention.d.ts.map +0 -1
  208. package/dist/governance/intervention.js +0 -405
  209. package/dist/governance/intervention.js.map +0 -1
  210. package/dist/server/oauth/anomalyDetection.d.ts +0 -146
  211. package/dist/server/oauth/anomalyDetection.d.ts.map +0 -1
  212. package/dist/server/oauth/anomalyDetection.js +0 -405
  213. package/dist/server/oauth/anomalyDetection.js.map +0 -1
  214. package/dist/server/oauth/authServer.d.ts +0 -61
  215. package/dist/server/oauth/authServer.d.ts.map +0 -1
  216. package/dist/server/oauth/authServer.js +0 -283
  217. package/dist/server/oauth/authServer.js.map +0 -1
  218. package/dist/server/oauth/dpop.d.ts +0 -135
  219. package/dist/server/oauth/dpop.d.ts.map +0 -1
  220. package/dist/server/oauth/dpop.js +0 -338
  221. package/dist/server/oauth/dpop.js.map +0 -1
  222. package/dist/server/oauth/gdpr/consent.d.ts +0 -173
  223. package/dist/server/oauth/gdpr/consent.d.ts.map +0 -1
  224. package/dist/server/oauth/gdpr/consent.js +0 -388
  225. package/dist/server/oauth/gdpr/consent.js.map +0 -1
  226. package/dist/server/oauth/gdpr/dataPortability.d.ts +0 -214
  227. package/dist/server/oauth/gdpr/dataPortability.d.ts.map +0 -1
  228. package/dist/server/oauth/gdpr/dataPortability.js +0 -486
  229. package/dist/server/oauth/gdpr/dataPortability.js.map +0 -1
  230. package/dist/server/oauth/gdpr/index.d.ts +0 -103
  231. package/dist/server/oauth/gdpr/index.d.ts.map +0 -1
  232. package/dist/server/oauth/gdpr/index.js +0 -273
  233. package/dist/server/oauth/gdpr/index.js.map +0 -1
  234. package/dist/server/oauth/gdpr/rightToErasure.d.ts +0 -184
  235. package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +0 -1
  236. package/dist/server/oauth/gdpr/rightToErasure.js +0 -527
  237. package/dist/server/oauth/gdpr/rightToErasure.js.map +0 -1
  238. package/dist/server/oauth/monitoring/securityMonitor.d.ts +0 -218
  239. package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +0 -1
  240. package/dist/server/oauth/monitoring/securityMonitor.js +0 -615
  241. package/dist/server/oauth/monitoring/securityMonitor.js.map +0 -1
  242. package/dist/server/oauth/pkce.d.ts +0 -61
  243. package/dist/server/oauth/pkce.d.ts.map +0 -1
  244. package/dist/server/oauth/pkce.js +0 -157
  245. package/dist/server/oauth/pkce.js.map +0 -1
  246. package/dist/server/oauth/providers/base.d.ts +0 -147
  247. package/dist/server/oauth/providers/base.d.ts.map +0 -1
  248. package/dist/server/oauth/providers/base.js +0 -312
  249. package/dist/server/oauth/providers/base.js.map +0 -1
  250. package/dist/server/oauth/providers/github.d.ts +0 -55
  251. package/dist/server/oauth/providers/github.d.ts.map +0 -1
  252. package/dist/server/oauth/providers/github.js +0 -225
  253. package/dist/server/oauth/providers/github.js.map +0 -1
  254. package/dist/server/oauth/providers/google.d.ts +0 -49
  255. package/dist/server/oauth/providers/google.d.ts.map +0 -1
  256. package/dist/server/oauth/providers/google.js +0 -153
  257. package/dist/server/oauth/providers/google.js.map +0 -1
  258. package/dist/server/oauth/providers/index.d.ts +0 -9
  259. package/dist/server/oauth/providers/index.d.ts.map +0 -1
  260. package/dist/server/oauth/providers/index.js +0 -24
  261. package/dist/server/oauth/providers/index.js.map +0 -1
  262. package/dist/server/oauth/refreshTokenRotation.d.ts +0 -114
  263. package/dist/server/oauth/refreshTokenRotation.d.ts.map +0 -1
  264. package/dist/server/oauth/refreshTokenRotation.js +0 -344
  265. package/dist/server/oauth/refreshTokenRotation.js.map +0 -1
  266. package/dist/server/oauth/security.d.ts +0 -101
  267. package/dist/server/oauth/security.d.ts.map +0 -1
  268. package/dist/server/oauth/security.js +0 -268
  269. package/dist/server/oauth/security.js.map +0 -1
  270. package/dist/server/oauth/tokenEncryption.d.ts +0 -80
  271. package/dist/server/oauth/tokenEncryption.d.ts.map +0 -1
  272. package/dist/server/oauth/tokenEncryption.js +0 -218
  273. package/dist/server/oauth/tokenEncryption.js.map +0 -1
  274. package/dist/tools/sendMessage-complex-backup.d.ts +0 -6
  275. package/dist/tools/sendMessage-complex-backup.d.ts.map +0 -1
  276. package/dist/tools/sendMessage-complex-backup.js +0 -545
  277. package/dist/tools/sendMessage-complex-backup.js.map +0 -1
  278. package/dist/tools/sendMessage-revised.d.ts +0 -11
  279. package/dist/tools/sendMessage-revised.d.ts.map +0 -1
  280. package/dist/tools/sendMessage-revised.js +0 -429
  281. package/dist/tools/sendMessage-revised.js.map +0 -1
  282. package/dist/tools/sendMessage-truly-simple.d.ts +0 -8
  283. package/dist/tools/sendMessage-truly-simple.d.ts.map +0 -1
  284. package/dist/tools/sendMessage-truly-simple.js +0 -299
  285. package/dist/tools/sendMessage-truly-simple.js.map +0 -1
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Secret Scanner
3
+ * Detects hardcoded secrets in code including:
4
+ * - API keys (AWS, OpenAI, Stripe, etc.)
5
+ * - Passwords
6
+ * - Private keys
7
+ * - Connection strings with credentials
8
+ * - Tokens and tokens
9
+ */
10
+ export class SecretScanner {
11
+ vulnerabilities = [];
12
+ // Regex patterns for detecting different types of secrets
13
+ patterns = {
14
+ // AWS
15
+ awsAccessKey: /(?:aws_access_key_id|AKIA)[A-Z0-9]{16,}/gi,
16
+ awsSecretKey: /(?:aws_secret_access_key|aws_key)['\s=]*[A-Za-z0-9/+=]{40,}/gi,
17
+ // API Keys
18
+ openaiKey: /sk-[A-Za-z0-9\-_]{20,}/g,
19
+ stripeKey: /(?:sk_live|pk_live)_[A-Za-z0-9]{20,}/gi,
20
+ googleApiKey: /AIza[0-9A-Za-z\-_]{35}/g,
21
+ githubToken: /ghp_[A-Za-z0-9_]{36,255}/g,
22
+ digitalOceanToken: /dop_v1_[A-Za-z0-9_]{40,}/g,
23
+ // Connection Strings
24
+ mongodbUri: /mongodb\+?srv?:\/\/.+?:.+?@/gi,
25
+ postgresUri: /postgres(ql)?:\/\/.+?:.+?@/gi,
26
+ mysqlUri: /mysql:\/\/.+?:.+?@/gi,
27
+ // Private Keys
28
+ rsaPrivateKey: /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/gi,
29
+ opensshPrivateKey: /-----BEGIN\s+OPENSSH\s+PRIVATE\s+KEY-----/gi,
30
+ pgpPrivateKey: /-----BEGIN\s+PGP\s+PRIVATE\s+KEY-----/gi,
31
+ // JWT
32
+ jwtToken: /eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+/g,
33
+ // Basic Passwords
34
+ passwordAssignment: /(?:password|passwd|pwd|secret)\s*[:=]\s*['\"`]([^'\"`;]+)['\"`]/gi,
35
+ hardcodedAdmin: /(?:password|passwd)\s*=\s*['\"](?:admin|Admin123|password|123456|password123)['\"]|\b(?:admin|root|sa|user)\s*=\s*['\"](?:admin|password|123456)['\"]|\b(?:password|secret)\s*=\s*['\"][^'\"]*(?:test|temp|demo|pass|secret)[^'\"]*['\"]/gi,
36
+ };
37
+ /**
38
+ * Scan code for hardcoded secrets
39
+ */
40
+ scan(code) {
41
+ this.vulnerabilities = [];
42
+ const lines = code.split('\n');
43
+ lines.forEach((line, idx) => {
44
+ const lineNum = idx + 1;
45
+ // Skip common safe patterns
46
+ if (this.isSafeIgnore(line))
47
+ return;
48
+ this.checkAwsKeys(line, lineNum);
49
+ this.checkApiKeys(line, lineNum);
50
+ this.checkConnectionStrings(line, lineNum);
51
+ this.checkPrivateKeys(line, lineNum);
52
+ this.checkPasswords(line, lineNum);
53
+ this.checkJwtTokens(line, lineNum);
54
+ });
55
+ return this.vulnerabilities;
56
+ }
57
+ /**
58
+ * Check if line should be ignored (comments, examples, etc.)
59
+ */
60
+ isSafeIgnore(line) {
61
+ const trimmed = line.trim();
62
+ // Skip comments
63
+ if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*')) {
64
+ return true;
65
+ }
66
+ // Skip test/example files with common patterns
67
+ if (line.includes('example') || line.includes('test') || line.includes('mock') || line.includes('fixture')) {
68
+ // Unless they're clearly real assignments
69
+ if (!line.includes('=') && !line.includes(':')) {
70
+ return true;
71
+ }
72
+ }
73
+ // Skip environment variable examples with placeholder values
74
+ if ((line.includes('process.env') || line.includes('process.getenv') || line.includes('os.getenv')) &&
75
+ (line.includes('YOUR_') || line.includes('your_') || line.includes('YOUR-') || line.includes('xxxx'))) {
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ /**
81
+ * Check for AWS keys
82
+ */
83
+ checkAwsKeys(line, lineNum) {
84
+ // AWS Access Key
85
+ const accessMatches = Array.from(line.matchAll(this.patterns.awsAccessKey));
86
+ for (const match of accessMatches) {
87
+ const code = match[0];
88
+ if (this.isCommentOrString(line, line.indexOf(code)))
89
+ continue;
90
+ const column = line.indexOf(code) + 1;
91
+ this.vulnerabilities.push({
92
+ type: 'HARDCODED_API_KEY',
93
+ severity: 'CRITICAL',
94
+ line: lineNum,
95
+ column: column,
96
+ code: code,
97
+ secretType: 'AWS Access Key ID',
98
+ secretPreview: code.substring(0, 8) + '...' + code.substring(code.length - 4),
99
+ issue: `Hardcoded AWS Access Key ID found: ${this.redact(code)}. This grants access to AWS resources.`,
100
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
101
+ fix: `Use AWS IAM roles or credentials from environment:\n import { AWS_SDK } from 'aws-sdk';\n // Let AWS SDK load from env: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY\n // Or use IAM role in Lambda/EC2\n const credentials = new AWS_SDK.Credentials(process.env.AWS_ACCESS_KEY_ID, process.env.AWS_SECRET_ACCESS_KEY);\n\nOr use AWS CLI config file:\n ~/.aws/credentials or ~/.aws/config`
102
+ });
103
+ }
104
+ // AWS Secret Key
105
+ const secretMatches = Array.from(line.matchAll(this.patterns.awsSecretKey));
106
+ for (const match of secretMatches) {
107
+ const code = match[0];
108
+ if (this.isCommentOrString(line, line.indexOf(code)))
109
+ continue;
110
+ const column = line.indexOf(code) + 1;
111
+ this.vulnerabilities.push({
112
+ type: 'HARDCODED_API_KEY',
113
+ severity: 'CRITICAL',
114
+ line: lineNum,
115
+ column: column,
116
+ code: code,
117
+ secretType: 'AWS Secret Access Key',
118
+ secretPreview: code.substring(0, 8) + '...' + code.substring(code.length - 4),
119
+ issue: `Hardcoded AWS Secret Access Key found: ${this.redact(code)}. This grants full access to AWS resources.`,
120
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
121
+ fix: `Use environment variables:\n const awsSecret = process.env.AWS_SECRET_ACCESS_KEY;\n if (!awsSecret) throw new Error('Missing AWS_SECRET_ACCESS_KEY');\n\nStore in .env (add .env to .gitignore):\n AWS_ACCESS_KEY_ID=...\n AWS_SECRET_ACCESS_KEY=...\n\nOr use AWS IAM roles (recommended for production).`
122
+ });
123
+ }
124
+ }
125
+ /**
126
+ * Check for API keys (OpenAI, Stripe, GitHub, etc.)
127
+ */
128
+ checkApiKeys(line, lineNum) {
129
+ const keyPatterns = [
130
+ { pattern: this.patterns.openaiKey, type: 'OpenAI API Key', name: 'OpenAI' },
131
+ { pattern: this.patterns.stripeKey, type: 'Stripe API Key', name: 'Stripe' },
132
+ { pattern: this.patterns.googleApiKey, type: 'Google API Key', name: 'Google' },
133
+ { pattern: this.patterns.githubToken, type: 'GitHub Personal Access Token', name: 'GitHub' },
134
+ { pattern: this.patterns.digitalOceanToken, type: 'DigitalOcean Token', name: 'DigitalOcean' },
135
+ ];
136
+ for (const { pattern, type, name } of keyPatterns) {
137
+ const matches = Array.from(line.matchAll(pattern));
138
+ for (const match of matches) {
139
+ const code = match[0];
140
+ if (this.isCommentOrString(line, line.indexOf(code)))
141
+ continue;
142
+ const column = line.indexOf(code) + 1;
143
+ this.vulnerabilities.push({
144
+ type: 'HARDCODED_API_KEY',
145
+ severity: 'CRITICAL',
146
+ line: lineNum,
147
+ column: column,
148
+ code: code,
149
+ secretType: type,
150
+ secretPreview: code.substring(0, 8) + '...' + code.substring(code.length - 4),
151
+ issue: `Hardcoded ${type} found: ${this.redact(code)}. This allows unauthorized API access.`,
152
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
153
+ fix: `Use environment variables:\n const apiKey = process.env.${name.toUpperCase()}_API_KEY;\n if (!apiKey) throw new Error('Missing ${name.toUpperCase()}_API_KEY');\n const client = new ${name}Client({ apiKey });\n\nStore in .env file (add to .gitignore):\n ${name.toUpperCase()}_API_KEY=sk-...\n\nFor deployment, use secrets management:\n - GitHub Secrets (for CI/CD)\n - AWS Secrets Manager\n - Vercel Environment Variables\n - HashiCorp Vault`
154
+ });
155
+ }
156
+ }
157
+ }
158
+ /**
159
+ * Check for connection strings with embedded credentials
160
+ */
161
+ checkConnectionStrings(line, lineNum) {
162
+ const connPatterns = [
163
+ { pattern: this.patterns.mongodbUri, type: 'MongoDB Connection String', name: 'MongoDB' },
164
+ { pattern: this.patterns.postgresUri, type: 'PostgreSQL Connection String', name: 'PostgreSQL' },
165
+ { pattern: this.patterns.mysqlUri, type: 'MySQL Connection String', name: 'MySQL' },
166
+ ];
167
+ for (const { pattern, type, name } of connPatterns) {
168
+ const matches = Array.from(line.matchAll(pattern));
169
+ for (const match of matches) {
170
+ const code = match[0];
171
+ if (this.isCommentOrString(line, line.indexOf(code)))
172
+ continue;
173
+ const column = line.indexOf(code) + 1;
174
+ this.vulnerabilities.push({
175
+ type: 'CONNECTION_STRING',
176
+ severity: 'CRITICAL',
177
+ line: lineNum,
178
+ column: column,
179
+ code: code,
180
+ secretType: type,
181
+ secretPreview: this.redact(code),
182
+ issue: `Hardcoded ${type} with credentials: ${this.redact(code)}. Database credentials should never be in code.`,
183
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
184
+ fix: `Use environment variables:\n const dbUrl = process.env.DATABASE_URL;\n if (!dbUrl) throw new Error('Missing DATABASE_URL');\n const client = await new ${name}Client({ url: dbUrl });\n\nFormat for .env:\n DATABASE_URL=${name.toLowerCase()}://user:password@host:port/database\n\nFor production, use:\n - Vercel Environment Variables\n - AWS RDS proxy with IAM auth\n - Cloud provider secret managers`
185
+ });
186
+ }
187
+ }
188
+ }
189
+ /**
190
+ * Check for private keys in code
191
+ */
192
+ checkPrivateKeys(line, lineNum) {
193
+ if (line.includes('BEGIN PRIVATE KEY') || line.includes('BEGIN RSA PRIVATE KEY') ||
194
+ line.includes('BEGIN OPENSSH PRIVATE KEY') || line.includes('BEGIN PGP PRIVATE KEY')) {
195
+ const column = line.indexOf('BEGIN') + 1;
196
+ this.vulnerabilities.push({
197
+ type: 'PRIVATE_KEY',
198
+ severity: 'CRITICAL',
199
+ line: lineNum,
200
+ column: column,
201
+ code: line.substring(0, Math.min(line.length, 80)),
202
+ secretType: 'Private Key',
203
+ issue: `Private key found in code: ${line.substring(0, 40)}... This is a critical security issue.`,
204
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
205
+ fix: `Never commit private keys. Instead:\n 1. Generate key pair\n 2. Store private key in secure location (e.g., ~/.ssh/id_rsa with 600 permissions)\n 3. Store public key or certificate in code\n 4. Load private key at runtime from secure location\n 5. Use key management services:\n - AWS Secrets Manager\n - HashiCorp Vault\n - Azure Key Vault\n - GitHub encrypted secrets\n 6. Use SSH agent for authentication\n\nIf accidentally committed:\n 1. Revoke the key immediately\n 2. git filter-branch or BFG to remove from history\n 3. Generate new key`
206
+ });
207
+ }
208
+ }
209
+ /**
210
+ * Check for hardcoded passwords
211
+ */
212
+ checkPasswords(line, lineNum) {
213
+ // Skip if it's a password field definition or validation
214
+ if (line.includes('password') && !line.includes('=') && !line.includes(':')) {
215
+ return;
216
+ }
217
+ const matches = Array.from(line.matchAll(this.patterns.passwordAssignment));
218
+ for (const match of matches) {
219
+ const code = match[0];
220
+ if (this.isCommentOrString(line, line.indexOf(code)))
221
+ continue;
222
+ const column = line.indexOf(code) + 1;
223
+ const passwordValue = match[1];
224
+ this.vulnerabilities.push({
225
+ type: 'HARDCODED_PASSWORD',
226
+ severity: 'CRITICAL',
227
+ line: lineNum,
228
+ column: column,
229
+ code: code,
230
+ secretType: 'Hardcoded Password',
231
+ secretPreview: this.redact(passwordValue || ''),
232
+ issue: `Hardcoded password found: ${code}. Passwords should never be in source code.`,
233
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
234
+ fix: `Use environment variables:\n const password = process.env.DB_PASSWORD;\n if (!password) throw new Error('Missing DB_PASSWORD');\n await db.connect({ username: 'user', password });\n\nFor authentication, use bcrypt for hashing:\n import bcrypt from 'bcrypt';\n const hashedPassword = await bcrypt.hash(password, 10);\n await db.saveUser({ username, passwordHash: hashedPassword });\n\nFor verification:\n const isValid = await bcrypt.compare(inputPassword, storedHash);`
235
+ });
236
+ }
237
+ }
238
+ /**
239
+ * Check for JWT tokens
240
+ */
241
+ checkJwtTokens(line, lineNum) {
242
+ // Skip if it's in a comment explaining JWT format
243
+ if (line.includes('//') && line.indexOf('//') < line.indexOf('eyJ')) {
244
+ return;
245
+ }
246
+ const matches = Array.from(line.matchAll(this.patterns.jwtToken));
247
+ for (const match of matches) {
248
+ const code = match[0];
249
+ if (this.isCommentOrString(line, line.indexOf(code)))
250
+ continue;
251
+ const column = line.indexOf(code) + 1;
252
+ this.vulnerabilities.push({
253
+ type: 'JWT_TOKEN',
254
+ severity: 'HIGH',
255
+ line: lineNum,
256
+ column: column,
257
+ code: code,
258
+ secretType: 'JWT Token',
259
+ secretPreview: code.substring(0, 20) + '...',
260
+ issue: `JWT token found in code: ${code.substring(0, 30)}... Token may contain sensitive information.`,
261
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
262
+ fix: `Never hardcode JWT tokens. Instead:\n 1. Generate tokens at runtime:\n import jwt from 'jsonwebtoken';\n const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: '1h' });\n 2. Store JWT_SECRET in environment variable (never in code):\n const secret = process.env.JWT_SECRET;\n 3. Return token to client (not in code)\n 4. Client stores token (usually in secure httpOnly cookie)\n 5. Token expires and requires refresh`
263
+ });
264
+ }
265
+ }
266
+ /**
267
+ * Redact secret for safe display
268
+ */
269
+ redact(secret) {
270
+ if (secret.length <= 8)
271
+ return '***';
272
+ return secret.substring(0, 4) + '...' + secret.substring(secret.length - 4);
273
+ }
274
+ /**
275
+ * Check if position is inside a comment
276
+ */
277
+ isCommentOrString(line, position) {
278
+ const beforePos = line.substring(0, position);
279
+ // Simple heuristic: if there's a // before this position and no quotes after //, it's a comment
280
+ const commentIdx = beforePos.lastIndexOf('//');
281
+ if (commentIdx !== -1) {
282
+ return true;
283
+ }
284
+ return false;
285
+ }
286
+ }
287
+ //# sourceMappingURL=secret-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scanner.js","sourceRoot":"","sources":["../../../src/developer/scanners/secret-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * SQL Injection Detector
3
+ * Scans code for SQL injection vulnerabilities including:
4
+ * - String concatenation in queries
5
+ * - Unparameterized queries
6
+ * - Dynamic table/column names
7
+ * - Direct user input in SQL
8
+ */
9
+ export interface SqlVulnerability {
10
+ type: 'SQL_INJECTION' | 'UNPARAMETERIZED_QUERY' | 'DYNAMIC_TABLE_NAME' | 'DYNAMIC_COLUMN_NAME';
11
+ severity: 'CRITICAL' | 'HIGH' | 'MEDIUM';
12
+ line: number;
13
+ column: number;
14
+ code: string;
15
+ issue: string;
16
+ cwe: string;
17
+ fix: string;
18
+ }
19
+ export declare class SqlInjectionDetector {
20
+ private vulnerabilities;
21
+ /**
22
+ * Scan code for SQL injection vulnerabilities
23
+ */
24
+ scan(code: string): SqlVulnerability[];
25
+ /**
26
+ * Detect template literals with variables in SQL strings
27
+ * Pattern: `SELECT * FROM users WHERE id = ${variable}`
28
+ */
29
+ private checkStringConcatenation;
30
+ /**
31
+ * Detect unparameterized queries with + or concat()
32
+ * Pattern: "SELECT * FROM users WHERE id = " + id
33
+ */
34
+ private checkUnparameterizedQueries;
35
+ /**
36
+ * Detect dynamic table names
37
+ * Pattern: `SELECT * FROM ${tableName}`
38
+ */
39
+ private checkDynamicTableNames;
40
+ /**
41
+ * Detect dynamic column names
42
+ * Pattern: `SELECT ${columnName} FROM users`
43
+ */
44
+ private checkDynamicColumnNames;
45
+ /**
46
+ * Check if code looks like SQL
47
+ */
48
+ private isSqlLike;
49
+ /**
50
+ * Check if position is inside a comment or string
51
+ */
52
+ private isCommentOrString;
53
+ }
54
+ //# sourceMappingURL=sql-injection-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-injection-detector.d.ts","sourceRoot":"","sources":["../../../src/developer/scanners/sql-injection-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,uBAAuB,GAAG,oBAAoB,GAAG,qBAAqB,CAAC;IAC/F,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,eAAe,CAA0B;IAEjD;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAetC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA6BhC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAoCnC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA8B9B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAqC/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAK1B"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * SQL Injection Detector
3
+ * Scans code for SQL injection vulnerabilities including:
4
+ * - String concatenation in queries
5
+ * - Unparameterized queries
6
+ * - Dynamic table/column names
7
+ * - Direct user input in SQL
8
+ */
9
+ export class SqlInjectionDetector {
10
+ vulnerabilities = [];
11
+ /**
12
+ * Scan code for SQL injection vulnerabilities
13
+ */
14
+ scan(code) {
15
+ this.vulnerabilities = [];
16
+ const lines = code.split('\n');
17
+ lines.forEach((line, idx) => {
18
+ const lineNum = idx + 1;
19
+ this.checkStringConcatenation(line, lineNum);
20
+ this.checkUnparameterizedQueries(line, lineNum);
21
+ this.checkDynamicTableNames(line, lineNum);
22
+ this.checkDynamicColumnNames(line, lineNum);
23
+ });
24
+ return this.vulnerabilities;
25
+ }
26
+ /**
27
+ * Detect template literals with variables in SQL strings
28
+ * Pattern: `SELECT * FROM users WHERE id = ${variable}`
29
+ */
30
+ checkStringConcatenation(line, lineNum) {
31
+ // Template literal with SQL - check for variable interpolation
32
+ const templatePattern = /`[^`]*\$\{[^}]+\}[^`]*`/g;
33
+ const matches = Array.from(line.matchAll(templatePattern));
34
+ for (const match of matches) {
35
+ const code = match[0];
36
+ // Check if it looks like SQL
37
+ if (this.isSqlLike(code)) {
38
+ const column = line.indexOf(code) + 1;
39
+ // Extract the variable name
40
+ const varMatch = code.match(/\$\{([^}]+)\}/);
41
+ const varName = varMatch ? varMatch[1] : 'variable';
42
+ this.vulnerabilities.push({
43
+ type: 'SQL_INJECTION',
44
+ severity: 'CRITICAL',
45
+ line: lineNum,
46
+ column: column,
47
+ code: code,
48
+ issue: `String interpolation in SQL query: ${code}. User input (${varName}) directly concatenated into SQL.`,
49
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
50
+ fix: `Use parameterized queries instead:\n db.query('SELECT * FROM users WHERE id = ?', [${varName}])\n Or with named parameters:\n db.query('SELECT * FROM users WHERE id = $1', [${varName}])`
51
+ });
52
+ }
53
+ }
54
+ }
55
+ /**
56
+ * Detect unparameterized queries with + or concat()
57
+ * Pattern: "SELECT * FROM users WHERE id = " + id
58
+ */
59
+ checkUnparameterizedQueries(line, lineNum) {
60
+ // String concatenation patterns
61
+ const concatenationPatterns = [
62
+ // Double quotes with +
63
+ /"[^"]*"\s*\+\s*[^;]+/g,
64
+ // Single quotes with +
65
+ /'[^']*'\s*\+\s*[^;]+/g,
66
+ // concat() function
67
+ /concat\s*\([^)]*\)/gi,
68
+ // String.concat()
69
+ /\.concat\s*\([^)]*\)/g,
70
+ ];
71
+ for (const pattern of concatenationPatterns) {
72
+ const matches = Array.from(line.matchAll(pattern));
73
+ for (const match of matches) {
74
+ const code = match[0];
75
+ if (this.isSqlLike(code) && !this.isCommentOrString(line, line.indexOf(code))) {
76
+ const column = line.indexOf(code) + 1;
77
+ this.vulnerabilities.push({
78
+ type: 'UNPARAMETERIZED_QUERY',
79
+ severity: 'CRITICAL',
80
+ line: lineNum,
81
+ column: column,
82
+ code: code,
83
+ issue: `Unparameterized SQL query with string concatenation: ${code}. Values should be passed as parameters, not concatenated.`,
84
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
85
+ fix: `Use parameterized query:\n db.query('SELECT * FROM users WHERE id = ? AND name = ?', [id, name])\n Instead of:\n db.query("SELECT * FROM users WHERE id = " + id + " AND name = " + name)`
86
+ });
87
+ }
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Detect dynamic table names
93
+ * Pattern: `SELECT * FROM ${tableName}`
94
+ */
95
+ checkDynamicTableNames(line, lineNum) {
96
+ const patterns = [
97
+ /FROM\s+`?[^;]*\$\{[^}]+\}[^;]*`?/gi,
98
+ /FROM\s+\(?\s*[^;]*\$\{[^}]+\}[^;]*\)?/gi,
99
+ /FROM\s+\(\s*?["']?[^)]*\$\{[^}]+\}[^)]*["']?\s*\)/gi,
100
+ ];
101
+ for (const pattern of patterns) {
102
+ const matches = Array.from(line.matchAll(pattern));
103
+ for (const match of matches) {
104
+ const code = match[0];
105
+ const column = line.indexOf(code) + 1;
106
+ const varMatch = code.match(/\$\{([^}]+)\}/);
107
+ const varName = varMatch ? varMatch[1] : 'variable';
108
+ this.vulnerabilities.push({
109
+ type: 'DYNAMIC_TABLE_NAME',
110
+ severity: 'HIGH',
111
+ line: lineNum,
112
+ column: column,
113
+ code: code,
114
+ issue: `Dynamic table name in SQL: ${code}. Table name (${varName}) comes from user input, allowing table injection attacks.`,
115
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
116
+ fix: `Use identifier escaping or whitelist allowed tables:\n const allowedTables = ['users', 'orders', 'products'];\n if (!allowedTables.includes(tableName)) throw new Error('Invalid table');\n const query = \`SELECT * FROM \\\"\${tableName}\\\"\`; // Quoted identifier\n Or use an ORM that handles this safely.`
117
+ });
118
+ }
119
+ }
120
+ }
121
+ /**
122
+ * Detect dynamic column names
123
+ * Pattern: `SELECT ${columnName} FROM users`
124
+ */
125
+ checkDynamicColumnNames(line, lineNum) {
126
+ const patterns = [
127
+ /SELECT\s+[^;]*\$\{[^}]+\}[^;]*/gi,
128
+ /ORDER\s+BY\s+[^;]*\$\{[^}]+\}[^;]*/gi,
129
+ /WHERE\s+[^;]*\$\{[^}]+\}[^;]*/gi,
130
+ ];
131
+ for (const pattern of patterns) {
132
+ const matches = Array.from(line.matchAll(pattern));
133
+ for (const match of matches) {
134
+ const code = match[0];
135
+ // Skip if it's in VALUES clause (less critical)
136
+ if (code.includes('VALUES'))
137
+ continue;
138
+ // Skip if it looks like a parameter placeholder
139
+ if (code.includes('?') || code.includes('$1'))
140
+ continue;
141
+ const column = line.indexOf(code) + 1;
142
+ const varMatch = code.match(/\$\{([^}]+)\}/);
143
+ const varName = varMatch ? varMatch[1] : 'variable';
144
+ this.vulnerabilities.push({
145
+ type: 'DYNAMIC_COLUMN_NAME',
146
+ severity: 'MEDIUM',
147
+ line: lineNum,
148
+ column: column,
149
+ code: code,
150
+ issue: `Dynamic column name in SQL: ${code}. Column name (${varName}) from user input could allow column-based injection attacks.`,
151
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
152
+ fix: `Use identifier escaping or whitelist allowed columns:\n const allowedColumns = ['id', 'name', 'email'];\n if (!allowedColumns.includes(columnName)) throw new Error('Invalid column');\n const query = \`SELECT \\\"\${columnName}\\\", * FROM users\`; // Quoted identifier\n Or use an ORM's dynamic select methods.`
153
+ });
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Check if code looks like SQL
159
+ */
160
+ isSqlLike(code) {
161
+ const sqlKeywords = ['SELECT', 'INSERT', 'UPDATE', 'DELETE', 'FROM', 'WHERE', 'JOIN', 'ORDER', 'GROUP', 'UNION'];
162
+ const upperCode = code.toUpperCase();
163
+ return sqlKeywords.some(keyword => upperCode.includes(keyword));
164
+ }
165
+ /**
166
+ * Check if position is inside a comment or string
167
+ */
168
+ isCommentOrString(line, position) {
169
+ // Simple check - look for comment markers before position
170
+ const beforePos = line.substring(0, position);
171
+ return beforePos.includes('//') || beforePos.includes('/*');
172
+ }
173
+ }
174
+ //# sourceMappingURL=sql-injection-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-injection-detector.js","sourceRoot":"","sources":["../../../src/developer/scanners/sql-injection-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * XSS (Cross-Site Scripting) Detector
3
+ * Scans code for XSS vulnerabilities including:
4
+ * - innerHTML usage with untrusted data
5
+ * - Unescaped user input in DOM
6
+ * - eval() and similar dangerous functions
7
+ * - Dangerous DOM manipulation patterns
8
+ */
9
+ export interface XssVulnerability {
10
+ type: 'INNERHTML_XSS' | 'EVAL_XSS' | 'UNESCAPED_DOM' | 'DANGEROUS_DOM_METHOD' | 'REACT_DANGEROUSHTML';
11
+ severity: 'CRITICAL' | 'HIGH' | 'MEDIUM';
12
+ line: number;
13
+ column: number;
14
+ code: string;
15
+ issue: string;
16
+ cwe: string;
17
+ fix: string;
18
+ }
19
+ export declare class XssDetector {
20
+ private vulnerabilities;
21
+ /**
22
+ * Scan code for XSS vulnerabilities
23
+ */
24
+ scan(code: string): XssVulnerability[];
25
+ /**
26
+ * Detect innerHTML usage with variables or user input
27
+ * Pattern: element.innerHTML = userInput
28
+ * Pattern: element.innerHTML = `content ${userVar}`
29
+ */
30
+ private checkInnerHtmlUsage;
31
+ /**
32
+ * Detect eval() and similar dangerous functions
33
+ * Pattern: eval(userInput)
34
+ * Pattern: Function(userInput)
35
+ * Pattern: setTimeout(userInput)
36
+ */
37
+ private checkEvalUsage;
38
+ /**
39
+ * Detect unescaped DOM manipulation
40
+ * Pattern: element.insertAdjacentHTML('beforeend', userInput)
41
+ * Pattern: document.write(userInput)
42
+ */
43
+ private checkUnescapedDomManipulation;
44
+ /**
45
+ * Detect dangerous DOM methods
46
+ * Pattern: element.click(userEvent)
47
+ * Pattern: element.setAttribute('onclick', userInput)
48
+ */
49
+ private checkDangerousDomMethods;
50
+ /**
51
+ * Detect React dangerouslySetInnerHTML usage
52
+ * Pattern: dangerouslySetInnerHTML={{ __html: userInput }}
53
+ */
54
+ private checkReactDangerousHtml;
55
+ /**
56
+ * Check if position is inside a comment or string
57
+ */
58
+ private isCommentOrString;
59
+ }
60
+ //# sourceMappingURL=xss-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xss-detector.d.ts","sourceRoot":"","sources":["../../../src/developer/scanners/xss-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,UAAU,GAAG,eAAe,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;IACtG,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,eAAe,CAA0B;IAEjD;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAgBtC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAuC3B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAgDtB;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IA6CrC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAI1B"}