@cdxgen/cdxgen 13.5.0 → 13.7.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 (380) hide show
  1. package/README.md +17 -10
  2. package/bin/audit.js +7 -4
  3. package/bin/cdxgen.js +260 -37
  4. package/bin/convert.js +146 -22
  5. package/bin/evinse.js +28 -3
  6. package/bin/repl.js +47 -3
  7. package/bin/sign.js +211 -34
  8. package/bin/tracebom.js +18 -6
  9. package/bin/validate.js +24 -3
  10. package/bin/verify.js +113 -5
  11. package/data/behavior-taxonomy.schema.json +1491 -0
  12. package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
  13. package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
  14. package/data/license-aliases.json +24 -2
  15. package/data/pqc-migration.json +239 -0
  16. package/data/remediations.json +176 -0
  17. package/data/rules/ai-bom.yaml +1 -1
  18. package/data/rules/brotli-decoder.yaml +107 -0
  19. package/data/rules/cbom-security.yaml +4 -3
  20. package/data/rules/package-integrity.yaml +28 -0
  21. package/data/rules/vscode-extensions.yaml +75 -0
  22. package/data/spdx-license-list.json +121 -7
  23. package/data/spdx-licenses.json +69 -0
  24. package/data/spdx.schema.json +845 -2
  25. package/lib/audit/index.js +25 -3
  26. package/lib/cli/bomAssembly.js +172 -4
  27. package/lib/cli/cliOptions.js +121 -17
  28. package/lib/cli/index.js +720 -902
  29. package/lib/cli/jsBom.js +156 -64
  30. package/lib/cli/jvmBom.js +602 -86
  31. package/lib/cli/managedBom.js +161 -19
  32. package/lib/cli/nativeBom.js +52 -5
  33. package/lib/core/boundedFile.js +344 -0
  34. package/lib/core/brotliProbe.js +182 -0
  35. package/lib/core/env.js +34 -0
  36. package/lib/core/fs.js +138 -3
  37. package/lib/core/globPatterns.js +218 -0
  38. package/lib/core/httpClient.js +98 -1
  39. package/lib/core/lockPaths.js +38 -0
  40. package/lib/core/paths.js +24 -1
  41. package/lib/core/processTree.js +100 -8
  42. package/lib/core/projectConfig.js +332 -25
  43. package/lib/core/toolRegistry.js +184 -0
  44. package/lib/ecosystems/cppEvidence.js +263 -106
  45. package/lib/ecosystems/cppIncludeResolver.js +16 -5
  46. package/lib/ecosystems/denoutils.js +2 -2
  47. package/lib/ecosystems/ecosystems.js +25 -10
  48. package/lib/ecosystems/gemHostProbe.js +301 -0
  49. package/lib/ecosystems/golem.js +3 -8
  50. package/lib/ecosystems/gradleutils.js +1909 -229
  51. package/lib/ecosystems/jsEvidence.js +90 -38
  52. package/lib/ecosystems/kosi.js +3 -5
  53. package/lib/ecosystems/npmVersionResolution.js +376 -0
  54. package/lib/ecosystems/parsers-bazel.js +107 -6
  55. package/lib/ecosystems/parsers-js.js +505 -22
  56. package/lib/ecosystems/parsers-misc.js +209 -20
  57. package/lib/ecosystems/parsers-python.js +178 -30
  58. package/lib/ecosystems/parsers-rust.js +117 -15
  59. package/lib/ecosystems/pythonutils.js +128 -2
  60. package/lib/ecosystems/remote/huggingface.js +22 -0
  61. package/lib/ecosystems/rubyutils.js +538 -31
  62. package/lib/ecosystems/rusi.js +2 -4
  63. package/lib/ecosystems/scalacliutils.js +2 -0
  64. package/lib/ecosystems/scalasem.js +798 -152
  65. package/lib/ecosystems/vendoredCode.js +237 -3
  66. package/lib/ecosystems/venvProbe.js +360 -0
  67. package/lib/evinser/evinser.js +536 -71
  68. package/lib/evinser/scalasem.js +5 -1
  69. package/lib/helpers/agenticToolutils.js +525 -94
  70. package/lib/helpers/bomSigner.js +43 -9
  71. package/lib/helpers/jssSigner.js +1276 -0
  72. package/lib/helpers/vsixutils.js +1574 -315
  73. package/lib/inventory/agentBlueprint.js +193 -0
  74. package/lib/inventory/agentToolNames.js +145 -0
  75. package/lib/inventory/aiCollector.js +153 -7
  76. package/lib/inventory/aiInventory.js +44 -8
  77. package/lib/inventory/aiProviders.js +324 -0
  78. package/lib/inventory/atomUtils.js +77 -0
  79. package/lib/inventory/bomUtils.js +8 -1
  80. package/lib/inventory/brotliDecoder.js +142 -0
  81. package/lib/inventory/buildToolRateLimit.js +1 -1
  82. package/lib/inventory/cbomutils.js +56 -7
  83. package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
  84. package/lib/inventory/citations.js +31 -2
  85. package/lib/inventory/communityAiConfigParser.js +978 -80
  86. package/lib/inventory/cyclonedx20.js +152 -0
  87. package/lib/inventory/cyclonedx20Common.js +286 -0
  88. package/lib/inventory/cyclonedx20Derived.js +159 -0
  89. package/lib/inventory/cyclonedx20Parties.js +552 -0
  90. package/lib/inventory/cyclonedx20Read.js +768 -0
  91. package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
  92. package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
  93. package/lib/inventory/cyclonedx20ReadContext.js +380 -0
  94. package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
  95. package/lib/inventory/cyclonedx20ReadSections.js +599 -0
  96. package/lib/inventory/cyclonedx20Render.js +766 -0
  97. package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
  98. package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
  99. package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
  100. package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
  101. package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
  102. package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
  103. package/lib/inventory/cyclonedx20RenderSections.js +499 -0
  104. package/lib/inventory/cyclonedx20Tables.js +594 -0
  105. package/lib/inventory/deps.js +141 -13
  106. package/lib/inventory/dosai.js +375 -6
  107. package/lib/inventory/dosaiParsers.js +3 -6
  108. package/lib/inventory/dotnetRuntime.js +367 -0
  109. package/lib/inventory/ecosystemFormulationParsers.js +979 -0
  110. package/lib/inventory/envcontext.js +436 -48
  111. package/lib/inventory/evidenceUtils.js +13 -1
  112. package/lib/inventory/fetchBatch.js +1 -1
  113. package/lib/inventory/formulationParsers.js +124 -14
  114. package/lib/inventory/gtfobins.js +13 -0
  115. package/lib/inventory/hbom.js +45 -6
  116. package/lib/inventory/hbomLoader.js +166 -0
  117. package/lib/inventory/hostRuntimeProbe.js +686 -0
  118. package/lib/inventory/jvmLocalRepos.js +9 -2
  119. package/lib/inventory/jvmToolEnv.js +29 -0
  120. package/lib/inventory/licenseEnhancer.js +12 -0
  121. package/lib/inventory/mavenCentralMirror.js +534 -0
  122. package/lib/inventory/mcpConfigParser.js +5 -0
  123. package/lib/inventory/nodeBuildInfo.js +218 -0
  124. package/lib/inventory/nodeHostProbe.js +202 -0
  125. package/lib/inventory/occurrenceKey.js +90 -0
  126. package/lib/inventory/osPackageResolver.js +182 -0
  127. package/lib/inventory/phpBuildInfo.js +10 -59
  128. package/lib/inventory/phpHostProbe.js +32 -488
  129. package/lib/inventory/pqcMigration.js +426 -0
  130. package/lib/inventory/rubyBuildInfo.js +972 -0
  131. package/lib/inventory/rubyHostProbe.js +218 -0
  132. package/lib/inventory/rustFormulationParser.js +21 -10
  133. package/lib/inventory/scalaCoords.js +4 -3
  134. package/lib/inventory/scalaDedupe.js +440 -0
  135. package/lib/inventory/source.js +114 -8
  136. package/lib/managers/binary.js +337 -3
  137. package/lib/managers/docker.js +79 -0
  138. package/lib/parsers/huggingfaceManifest.js +9 -1
  139. package/lib/parsers/huggingfaceUtils.js +18 -0
  140. package/lib/parsers/kiroPermissions.js +166 -0
  141. package/lib/parsers/largeJson.js +28 -11
  142. package/lib/parsers/vscodeExtensionId.js +183 -0
  143. package/lib/server/server.js +48 -35
  144. package/lib/stages/postgen/postgen.js +41 -1
  145. package/lib/stages/postgen/ruleEngine.js +13 -5
  146. package/lib/stages/postgen/specVersionCompat.js +76 -0
  147. package/lib/stages/pregen/envAudit.js +1 -0
  148. package/lib/stages/pregen/pregen.js +114 -57
  149. package/lib/validator/bomValidator.js +14 -2
  150. package/lib/validator/complianceEngine.js +30 -3
  151. package/lib/validator/complianceRules.js +1416 -4
  152. package/lib/validator/generated/validate-1.6.mjs +1 -1
  153. package/lib/validator/generated/validate-1.7.mjs +1 -1
  154. package/lib/validator/generated/validate-2.0.mjs +57554 -13851
  155. package/lib/validator/index.js +49 -8
  156. package/lib/validator/reporters/json.js +6 -0
  157. package/package.json +11 -10
  158. package/types/bin/repl.d.ts.map +1 -1
  159. package/types/lib/audit/index.d.ts +6 -2
  160. package/types/lib/audit/index.d.ts.map +1 -1
  161. package/types/lib/cli/bomAssembly.d.ts +29 -1
  162. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  163. package/types/lib/cli/cliOptions.d.ts +6 -0
  164. package/types/lib/cli/cliOptions.d.ts.map +1 -1
  165. package/types/lib/cli/index.d.ts.map +1 -1
  166. package/types/lib/cli/jsBom.d.ts +3 -18
  167. package/types/lib/cli/jsBom.d.ts.map +1 -1
  168. package/types/lib/cli/jvmBom.d.ts +15 -0
  169. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  170. package/types/lib/cli/managedBom.d.ts.map +1 -1
  171. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  172. package/types/lib/core/boundedFile.d.ts +100 -0
  173. package/types/lib/core/boundedFile.d.ts.map +1 -0
  174. package/types/lib/core/brotliProbe.d.ts +37 -0
  175. package/types/lib/core/brotliProbe.d.ts.map +1 -0
  176. package/types/lib/core/env.d.ts +14 -0
  177. package/types/lib/core/env.d.ts.map +1 -1
  178. package/types/lib/core/fs.d.ts +4 -0
  179. package/types/lib/core/fs.d.ts.map +1 -1
  180. package/types/lib/core/globPatterns.d.ts +70 -0
  181. package/types/lib/core/globPatterns.d.ts.map +1 -0
  182. package/types/lib/core/httpClient.d.ts +24 -0
  183. package/types/lib/core/httpClient.d.ts.map +1 -1
  184. package/types/lib/core/lockPaths.d.ts +19 -0
  185. package/types/lib/core/lockPaths.d.ts.map +1 -0
  186. package/types/lib/core/paths.d.ts +9 -0
  187. package/types/lib/core/paths.d.ts.map +1 -1
  188. package/types/lib/core/processTree.d.ts +17 -4
  189. package/types/lib/core/processTree.d.ts.map +1 -1
  190. package/types/lib/core/projectConfig.d.ts +47 -8
  191. package/types/lib/core/projectConfig.d.ts.map +1 -1
  192. package/types/lib/core/toolRegistry.d.ts +36 -0
  193. package/types/lib/core/toolRegistry.d.ts.map +1 -0
  194. package/types/lib/ecosystems/cppEvidence.d.ts +40 -13
  195. package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
  196. package/types/lib/ecosystems/cppIncludeResolver.d.ts +2 -1
  197. package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -1
  198. package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
  199. package/types/lib/ecosystems/gemHostProbe.d.ts +28 -0
  200. package/types/lib/ecosystems/gemHostProbe.d.ts.map +1 -0
  201. package/types/lib/ecosystems/golem.d.ts.map +1 -1
  202. package/types/lib/ecosystems/gradleutils.d.ts +294 -20
  203. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  204. package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
  205. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
  206. package/types/lib/ecosystems/kosi.d.ts.map +1 -1
  207. package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
  208. package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
  209. package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -1
  210. package/types/lib/ecosystems/parsers-js.d.ts +17 -20
  211. package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
  212. package/types/lib/ecosystems/parsers-misc.d.ts +19 -0
  213. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
  214. package/types/lib/ecosystems/parsers-python.d.ts +10 -0
  215. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  216. package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
  217. package/types/lib/ecosystems/pythonutils.d.ts +19 -1
  218. package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
  219. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
  220. package/types/lib/ecosystems/rubyutils.d.ts +144 -12
  221. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
  222. package/types/lib/ecosystems/rusi.d.ts.map +1 -1
  223. package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -1
  224. package/types/lib/ecosystems/scalasem.d.ts +58 -16
  225. package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
  226. package/types/lib/ecosystems/vendoredCode.d.ts +26 -0
  227. package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -1
  228. package/types/lib/ecosystems/venvProbe.d.ts +40 -0
  229. package/types/lib/ecosystems/venvProbe.d.ts.map +1 -0
  230. package/types/lib/evinser/evinser.d.ts +120 -13
  231. package/types/lib/evinser/evinser.d.ts.map +1 -1
  232. package/types/lib/evinser/scalasem.d.ts.map +1 -1
  233. package/types/lib/helpers/agenticToolutils.d.ts +53 -19
  234. package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
  235. package/types/lib/helpers/bomSigner.d.ts +20 -3
  236. package/types/lib/helpers/bomSigner.d.ts.map +1 -1
  237. package/types/lib/helpers/jssSigner.d.ts +288 -0
  238. package/types/lib/helpers/jssSigner.d.ts.map +1 -0
  239. package/types/lib/helpers/vsixutils.d.ts +303 -19
  240. package/types/lib/helpers/vsixutils.d.ts.map +1 -1
  241. package/types/lib/inventory/agentBlueprint.d.ts +70 -0
  242. package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
  243. package/types/lib/inventory/agentToolNames.d.ts +51 -0
  244. package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
  245. package/types/lib/inventory/aiCollector.d.ts.map +1 -1
  246. package/types/lib/inventory/aiInventory.d.ts.map +1 -1
  247. package/types/lib/inventory/aiProviders.d.ts +85 -0
  248. package/types/lib/inventory/aiProviders.d.ts.map +1 -0
  249. package/types/lib/inventory/atomUtils.d.ts +19 -0
  250. package/types/lib/inventory/atomUtils.d.ts.map +1 -1
  251. package/types/lib/inventory/bomUtils.d.ts.map +1 -1
  252. package/types/lib/inventory/brotliDecoder.d.ts +58 -0
  253. package/types/lib/inventory/brotliDecoder.d.ts.map +1 -0
  254. package/types/lib/inventory/cbomutils.d.ts +17 -0
  255. package/types/lib/inventory/cbomutils.d.ts.map +1 -1
  256. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
  257. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
  258. package/types/lib/inventory/citations.d.ts +5 -0
  259. package/types/lib/inventory/citations.d.ts.map +1 -1
  260. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
  261. package/types/lib/inventory/cyclonedx20.d.ts +99 -0
  262. package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
  263. package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
  264. package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
  265. package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
  266. package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
  267. package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
  268. package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
  269. package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
  270. package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
  271. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
  272. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
  273. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
  274. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
  275. package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
  276. package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
  277. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
  278. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
  279. package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
  280. package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
  281. package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
  282. package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
  283. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
  284. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
  285. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
  286. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
  287. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
  288. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
  289. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
  290. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
  291. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
  292. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
  293. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
  294. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
  295. package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
  296. package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
  297. package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
  298. package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
  299. package/types/lib/inventory/deps.d.ts +35 -2
  300. package/types/lib/inventory/deps.d.ts.map +1 -1
  301. package/types/lib/inventory/dosai.d.ts +36 -1
  302. package/types/lib/inventory/dosai.d.ts.map +1 -1
  303. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
  304. package/types/lib/inventory/dotnetRuntime.d.ts +91 -0
  305. package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -0
  306. package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
  307. package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
  308. package/types/lib/inventory/envcontext.d.ts +74 -12
  309. package/types/lib/inventory/envcontext.d.ts.map +1 -1
  310. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  311. package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
  312. package/types/lib/inventory/gtfobins.d.ts.map +1 -1
  313. package/types/lib/inventory/hbom.d.ts +11 -0
  314. package/types/lib/inventory/hbom.d.ts.map +1 -1
  315. package/types/lib/inventory/hbomLoader.d.ts +54 -0
  316. package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
  317. package/types/lib/inventory/hostRuntimeProbe.d.ts +44 -0
  318. package/types/lib/inventory/hostRuntimeProbe.d.ts.map +1 -0
  319. package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
  320. package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
  321. package/types/lib/inventory/jvmToolEnv.d.ts +12 -0
  322. package/types/lib/inventory/jvmToolEnv.d.ts.map +1 -1
  323. package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -1
  324. package/types/lib/inventory/mavenCentralMirror.d.ts +170 -0
  325. package/types/lib/inventory/mavenCentralMirror.d.ts.map +1 -0
  326. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
  327. package/types/lib/inventory/nodeBuildInfo.d.ts +95 -0
  328. package/types/lib/inventory/nodeBuildInfo.d.ts.map +1 -0
  329. package/types/lib/inventory/nodeHostProbe.d.ts +15 -0
  330. package/types/lib/inventory/nodeHostProbe.d.ts.map +1 -0
  331. package/types/lib/inventory/occurrenceKey.d.ts +52 -0
  332. package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
  333. package/types/lib/inventory/osPackageResolver.d.ts +38 -0
  334. package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
  335. package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -1
  336. package/types/lib/inventory/phpHostProbe.d.ts.map +1 -1
  337. package/types/lib/inventory/pqcMigration.d.ts +84 -0
  338. package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
  339. package/types/lib/inventory/rubyBuildInfo.d.ts +271 -0
  340. package/types/lib/inventory/rubyBuildInfo.d.ts.map +1 -0
  341. package/types/lib/inventory/rubyHostProbe.d.ts +47 -0
  342. package/types/lib/inventory/rubyHostProbe.d.ts.map +1 -0
  343. package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
  344. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
  345. package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
  346. package/types/lib/inventory/scalaDedupe.d.ts +43 -0
  347. package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
  348. package/types/lib/inventory/source.d.ts +25 -0
  349. package/types/lib/inventory/source.d.ts.map +1 -1
  350. package/types/lib/managers/binary.d.ts.map +1 -1
  351. package/types/lib/managers/docker.d.ts +12 -0
  352. package/types/lib/managers/docker.d.ts.map +1 -1
  353. package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
  354. package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
  355. package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
  356. package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
  357. package/types/lib/parsers/kiroPermissions.d.ts +62 -0
  358. package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
  359. package/types/lib/parsers/largeJson.d.ts +4 -3
  360. package/types/lib/parsers/largeJson.d.ts.map +1 -1
  361. package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
  362. package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
  363. package/types/lib/server/server.d.ts.map +1 -1
  364. package/types/lib/stages/postgen/postgen.d.ts +7 -0
  365. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  366. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  367. package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
  368. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
  369. package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
  370. package/types/lib/stages/pregen/pregen.d.ts +12 -8
  371. package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
  372. package/types/lib/validator/bomValidator.d.ts +5 -1
  373. package/types/lib/validator/bomValidator.d.ts.map +1 -1
  374. package/types/lib/validator/complianceEngine.d.ts +4 -4
  375. package/types/lib/validator/complianceEngine.d.ts.map +1 -1
  376. package/types/lib/validator/complianceRules.d.ts +14 -2
  377. package/types/lib/validator/complianceRules.d.ts.map +1 -1
  378. package/types/lib/validator/index.d.ts +10 -0
  379. package/types/lib/validator/index.d.ts.map +1 -1
  380. package/types/lib/validator/reporters/json.d.ts.map +1 -1
@@ -77,6 +77,7 @@ import {
77
77
  findMavenCoordinatesBySha1,
78
78
  inferMavenCoordinatesFromPath,
79
79
  } from "../inventory/jvmLocalRepos.js";
80
+ import { mavenCentralFetchUrl } from "../inventory/mavenCentralMirror.js";
80
81
  import {
81
82
  applyPurl,
82
83
  genericPurl,
@@ -92,6 +93,7 @@ import {
92
93
  guessLicenseId,
93
94
  spdxLicenses,
94
95
  } from "../inventory/spdx.js";
96
+ import { parseSpdxExpression } from "../inventory/spdxExpression.js";
95
97
  import { extractLicenseText, extractRepoUrl } from "../parsers/htmlExtract.js";
96
98
  import { xml2js } from "../parsers/xml.js";
97
99
  import {
@@ -1050,7 +1052,8 @@ export async function getMvnMetadata(
1050
1052
  }
1051
1053
  const repos = {
1052
1054
  MAVEN_CENTRAL_URL: withTrailingSlash(
1053
- readEnvironmentVariable("MAVEN_CENTRAL_URL") ||
1055
+ mavenCentralFetchUrl() ||
1056
+ readEnvironmentVariable("MAVEN_CENTRAL_URL") ||
1054
1057
  "https://repo1.maven.org/maven2/",
1055
1058
  ),
1056
1059
  ANDROID_MAVEN_URL: withTrailingSlash(
@@ -1771,6 +1774,10 @@ export function parseBdistMetadata(mDataFile, rawMetadata = undefined) {
1771
1774
  }
1772
1775
  const lines = mData.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
1773
1776
  let isBody = false;
1777
+ // PEP 639 (metadata 2.4) `License-Expression` is a validated SPDX expression
1778
+ // that wins over the free-text `License` field whichever header comes first.
1779
+ let licenseExpression;
1780
+ let licenseName;
1774
1781
  for (const line of lines) {
1775
1782
  if (line.trim() === "") {
1776
1783
  isBody = true;
@@ -1797,17 +1804,11 @@ export function parseBdistMetadata(mDataFile, rawMetadata = undefined) {
1797
1804
  pkg.author = value;
1798
1805
  break;
1799
1806
  case "license-expression":
1800
- pkg.licenses.push({
1801
- expression: value,
1802
- });
1807
+ licenseExpression = value;
1803
1808
  break;
1804
1809
  case "license":
1805
- if (value !== "UNKNOWN" && pkg.licenses.length === 0) {
1806
- pkg.licenses.push({
1807
- license: {
1808
- name: value,
1809
- },
1810
- });
1810
+ if (value !== "UNKNOWN" && licenseName === undefined) {
1811
+ licenseName = value;
1811
1812
  }
1812
1813
  break;
1813
1814
  case "home-page":
@@ -1867,6 +1868,20 @@ export function parseBdistMetadata(mDataFile, rawMetadata = undefined) {
1867
1868
  break;
1868
1869
  }
1869
1870
  }
1871
+ if (licenseExpression && parseSpdxExpression(licenseExpression).valid) {
1872
+ // PEP 639 guarantees a valid SPDX expression here, including `LicenseRef-`
1873
+ // document references, which travel as an expression and never as an id.
1874
+ pkg.licenses = [{ expression: licenseExpression }];
1875
+ } else {
1876
+ if (licenseExpression && DEBUG_MODE) {
1877
+ console.log(
1878
+ `License-Expression "${licenseExpression}" of ${pkg.name} is not a valid SPDX expression, so the older license fields are used`,
1879
+ );
1880
+ }
1881
+ if (licenseName) {
1882
+ pkg.licenses = [{ license: { name: licenseName } }];
1883
+ }
1884
+ }
1870
1885
  if (mDataFile) {
1871
1886
  pkg.evidence = {
1872
1887
  identity: {
@@ -0,0 +1,301 @@
1
+ // Bounded, read-only inventory of the gems installed on a live host, for
2
+ // `-t os` / obom. osquery has no table for RubyGems, so without this an OBOM
3
+ // lists no gems at all: neither the default gems that ship with each Ruby
4
+ // (resolv, net-http, uri, ...), nor what `gem install` and the distro's
5
+ // ruby-* packages put in the system gem homes, nor the gems of the version
6
+ // manager installs.
7
+ //
8
+ // Gem homes are found in fixed places, one wildcard level at a time: a
9
+ // directory holding a `specifications` directory is a gem home. Only the
10
+ // `*.gemspec` files under specifications/ and specifications/default/ are
11
+ // read, statically; nothing is executed. A gemspec a package database lists is
12
+ // marked with `cdx:os:installedBy`, so a consumer judges it by that package,
13
+ // which may carry backported fixes under the same gem version.
14
+
15
+ import { readdirSync, statSync } from "node:fs";
16
+ import { join, posix, relative, sep, win32 } from "node:path";
17
+ import process from "node:process";
18
+
19
+ import { isDryRun, recordActivity } from "../core/activity.js";
20
+ import { readRegularTextFile } from "../core/boundedFile.js";
21
+ import { safeExistsSync } from "../core/fs.js";
22
+ import { thoughtLog } from "../core/logger.js";
23
+ import { findHostPathOwners } from "../inventory/hostRuntimeProbe.js";
24
+ import {
25
+ expandDirectories,
26
+ homeDirectories,
27
+ windowsRubyRoots,
28
+ } from "../inventory/rubyHostProbe.js";
29
+ import { parseGemspecData } from "./rubyutils.js";
30
+
31
+ const MAX_GEM_HOMES = 128;
32
+ const MAX_GEMSPECS = 8192;
33
+ const MAX_GEMSPEC_BYTES = 1024 * 1024;
34
+
35
+ // Gem homes relative to the root.
36
+ const ROOT_GEM_HOMES = {
37
+ linux: [
38
+ "usr/lib/ruby/gems/*",
39
+ "usr/lib64/ruby/gems/*",
40
+ "usr/share/gems",
41
+ // Debian and Ubuntu ruby-* packages register their gems here
42
+ "usr/share/rubygems-integration/*",
43
+ "usr/lib/*/rubygems-integration/*",
44
+ "usr/local/share/gems",
45
+ "var/lib/gems/*",
46
+ "usr/local/lib/ruby/gems/*",
47
+ "usr/local/bundle",
48
+ "opt/*/lib/ruby/gems/*",
49
+ "opt/rubies/*/lib/ruby/gems/*",
50
+ "opt/hostedtoolcache/Ruby/*/*/lib/ruby/gems/*",
51
+ "usr/local/rbenv/versions/*/lib/ruby/gems/*",
52
+ "usr/local/rvm/rubies/*/lib/ruby/gems/*",
53
+ "usr/local/rvm/gems/*",
54
+ ],
55
+ darwin: [
56
+ "Library/Ruby/Gems/*",
57
+ "usr/local/lib/ruby/gems/*",
58
+ "opt/homebrew/lib/ruby/gems/*",
59
+ "opt/*/lib/ruby/gems/*",
60
+ "opt/rubies/*/lib/ruby/gems/*",
61
+ ],
62
+ };
63
+
64
+ // Gem homes relative to a home directory.
65
+ const USER_GEM_HOMES = [
66
+ ".gem/ruby/*",
67
+ ".local/share/gem/ruby/*",
68
+ ".rbenv/versions/*/lib/ruby/gems/*",
69
+ ".rvm/rubies/*/lib/ruby/gems/*",
70
+ ".rvm/gems/*",
71
+ ".asdf/installs/ruby/*/lib/ruby/gems/*",
72
+ ".local/share/mise/installs/ruby/*/lib/ruby/gems/*",
73
+ ".rubies/*/lib/ruby/gems/*",
74
+ ".frum/versions/*/lib/ruby/gems/*",
75
+ ".local/share/rv/rubies/*/lib/ruby/gems/*",
76
+ ];
77
+
78
+ function listGemspecs(directory) {
79
+ try {
80
+ return readdirSync(directory)
81
+ .filter((name) => name.endsWith(".gemspec"))
82
+ .sort();
83
+ } catch {
84
+ return [];
85
+ }
86
+ }
87
+
88
+ function isDirectory(path) {
89
+ try {
90
+ return statSync(path).isDirectory();
91
+ } catch {
92
+ return false;
93
+ }
94
+ }
95
+
96
+ /**
97
+ * The gem homes of a host, each a directory with a `specifications` directory.
98
+ *
99
+ * @param {string} rootPath root directory
100
+ * @param {string} platform `linux`, `darwin` or `win32`
101
+ * @returns {string[]} absolute gem home directories
102
+ */
103
+ export function findGemHomes(rootPath, platform) {
104
+ const context = { rootPath, platform };
105
+ const candidates = [];
106
+ if (platform === "win32") {
107
+ for (const root of windowsRubyRoots(context)) {
108
+ candidates.push(...expandDirectories(root, "lib/ruby/gems/*"));
109
+ }
110
+ } else {
111
+ for (const pattern of ROOT_GEM_HOMES[platform] || []) {
112
+ candidates.push(...expandDirectories(rootPath, pattern));
113
+ }
114
+ for (const home of homeDirectories(context)) {
115
+ for (const pattern of USER_GEM_HOMES) {
116
+ candidates.push(...expandDirectories(home, pattern));
117
+ }
118
+ }
119
+ }
120
+ const homes = [];
121
+ const seen = new Set();
122
+ for (const candidate of candidates) {
123
+ if (
124
+ seen.has(candidate) ||
125
+ !isDirectory(join(candidate, "specifications"))
126
+ ) {
127
+ continue;
128
+ }
129
+ seen.add(candidate);
130
+ homes.push(candidate);
131
+ if (homes.length >= MAX_GEM_HOMES) {
132
+ break;
133
+ }
134
+ }
135
+ return homes;
136
+ }
137
+
138
+ // The path as the host names it, for the package databases and evidence.
139
+ function logicalPath(rootPath, platform, absolutePath) {
140
+ const parts = relative(rootPath, absolutePath).split(sep);
141
+ if (platform === "win32") {
142
+ return win32.join(rootPath, ...parts);
143
+ }
144
+ return posix.join("/", ...parts);
145
+ }
146
+
147
+ /**
148
+ * Inventory the gems of a host's gem homes. One component per distinct gem
149
+ * and version, with an occurrence for each gemspec it was read from, so no
150
+ * host path reaches a purl.
151
+ *
152
+ * @param {Object} [options] options
153
+ * @param {string} [options.rootPath="/"] root directory; tests point it at a built tree
154
+ * @param {string} [options.platform] `linux`, `darwin` or `win32`
155
+ * @param {function(string): (Object[]|undefined)} [options.executeOsQuery] runs
156
+ * an osquery query, for rpm ownership
157
+ * @param {Object[]} [options.packageComponents] the OS packages the scan has
158
+ * inventoried, which name the owners
159
+ * @param {Object} [options.packageDatabases] where the package databases are
160
+ * @returns {Promise<Object[]>} gem components
161
+ */
162
+ export async function probeHostRubyGems(options = {}) {
163
+ const platform = options.platform || process.platform;
164
+ const rootPath =
165
+ options.rootPath ||
166
+ (platform === "win32" ? `${process.env.SystemDrive || "C:"}\\` : "/");
167
+ if (isDryRun) {
168
+ recordActivity({
169
+ capability: "ruby-gem-probe",
170
+ kind: "read",
171
+ reason:
172
+ "Dry run mode blocks the RubyGems probe, which reads gem specifications outside the project.",
173
+ status: "blocked",
174
+ target: rootPath,
175
+ });
176
+ return [];
177
+ }
178
+ if (!safeExistsSync(rootPath)) {
179
+ return [];
180
+ }
181
+ const homes = findGemHomes(rootPath, platform);
182
+ const gemspecs = [];
183
+ for (const home of homes) {
184
+ for (const subdir of [
185
+ "specifications",
186
+ join("specifications", "default"),
187
+ ]) {
188
+ const directory = join(home, subdir);
189
+ for (const name of listGemspecs(directory)) {
190
+ if (gemspecs.length >= MAX_GEMSPECS) {
191
+ break;
192
+ }
193
+ const absolutePath = join(directory, name);
194
+ gemspecs.push({
195
+ absolutePath,
196
+ logical: logicalPath(rootPath, platform, absolutePath),
197
+ });
198
+ }
199
+ }
200
+ }
201
+ if (!gemspecs.length) {
202
+ return [];
203
+ }
204
+ const { owners, unreadable } = findHostPathOwners(
205
+ { ...options, platform, rootPath },
206
+ gemspecs.map((gemspec) => gemspec.logical),
207
+ );
208
+ // An OBOM names a package once; its purl says how the distro named it.
209
+ const packagePurls = new Map();
210
+ for (const component of options.packageComponents || []) {
211
+ if (
212
+ component?.name &&
213
+ typeof component.purl === "string" &&
214
+ /^pkg:(deb|rpm|apk)\//.test(component.purl) &&
215
+ !packagePurls.has(component.name)
216
+ ) {
217
+ packagePurls.set(component.name, decodeURIComponent(component.purl));
218
+ }
219
+ }
220
+ const byRef = new Map();
221
+ for (const gemspec of gemspecs) {
222
+ // Only a regular file under the root, within the cap: any user can leave
223
+ // `~/.gem/ruby/*/specifications/x.gemspec -> /dev/zero` for a root scan.
224
+ const text = readRegularTextFile(
225
+ gemspec.absolutePath,
226
+ MAX_GEMSPEC_BYTES,
227
+ rootPath,
228
+ );
229
+ if (typeof text !== "string") {
230
+ continue;
231
+ }
232
+ // The gemspec files RubyGems writes on install are Ruby source, read here
233
+ // without evaluating them. Thousands of them are no reason to ask the
234
+ // registry about each.
235
+ const [pkg] = await parseGemspecData(text, gemspec.logical, {
236
+ noFetch: true,
237
+ });
238
+ if (!pkg?.name || !pkg.version || !pkg["bom-ref"]) {
239
+ continue;
240
+ }
241
+ const owner = owners.get(gemspec.logical);
242
+ // cdx:os:installedBy holds a purl, as everywhere else; an owner the
243
+ // OBOM did not list cannot be named by one.
244
+ const ownerRef = owner ? packagePurls.get(owner.packageName) : undefined;
245
+ let component = byRef.get(pkg["bom-ref"]);
246
+ if (!component) {
247
+ component = pkg;
248
+ component.evidence = {
249
+ ...(component.evidence || {}),
250
+ occurrences: [],
251
+ };
252
+ byRef.set(pkg["bom-ref"], component);
253
+ }
254
+ component.properties = component.properties || [];
255
+ if (
256
+ ownerRef &&
257
+ !component.properties.some(
258
+ (prop) => prop.name === "cdx:os:installedBy" && prop.value === ownerRef,
259
+ )
260
+ ) {
261
+ component.properties.push({
262
+ name: "cdx:os:installedBy",
263
+ value: ownerRef,
264
+ });
265
+ }
266
+ if (
267
+ !component.evidence.occurrences.some(
268
+ (occurrence) => occurrence.location === gemspec.logical,
269
+ )
270
+ ) {
271
+ component.evidence.occurrences.push({ location: gemspec.logical });
272
+ }
273
+ }
274
+ // A gem a package owns in one gem home and `gem install` put in another is
275
+ // not wholly that package's, so it keeps no owner.
276
+ for (const component of byRef.values()) {
277
+ const owned = component.evidence.occurrences.every((occurrence) =>
278
+ owners.has(occurrence.location),
279
+ );
280
+ if (!owned) {
281
+ component.properties = component.properties.filter(
282
+ (prop) => prop.name !== "cdx:os:installedBy",
283
+ );
284
+ }
285
+ }
286
+ recordActivity({
287
+ capability: "ruby-gem-probe",
288
+ kind: "read",
289
+ reason: `Read ${gemspecs.length} gemspec(s) from ${homes.length} gem home(s) in the fixed places${unreadable.length ? `; the ${unreadable.join(", ")} database could not be read in full, so gem ownership is incomplete` : ""}.`,
290
+ status: "completed",
291
+ target: rootPath,
292
+ });
293
+ if (byRef.size) {
294
+ thoughtLog(
295
+ `I found ${byRef.size} gem(s) in ${homes.length} gem home(s) on this host.`,
296
+ );
297
+ }
298
+ return Array.from(byRef.values()).sort((a, b) =>
299
+ a["bom-ref"] < b["bom-ref"] ? -1 : a["bom-ref"] > b["bom-ref"] ? 1 : 0,
300
+ );
301
+ }
@@ -20,6 +20,7 @@ import {
20
20
  hasInlineCredential,
21
21
  sanitizeBomUrl,
22
22
  } from "../core/propertySanitizer.js";
23
+ import { occurrenceLocationKey } from "../inventory/occurrenceKey.js";
23
24
  import { resolvePluginBinary } from "../inventory/plugins.js";
24
25
  import { canonicalPurlFromLooseString } from "../inventory/purl.js";
25
26
 
@@ -93,20 +94,14 @@ function rangeLocation(range) {
93
94
  if (!start?.filename) {
94
95
  return undefined;
95
96
  }
96
- if (start.line && start.line > 0) {
97
- return `${start.filename}#${start.line}`;
98
- }
99
- return start.filename;
97
+ return occurrenceLocationKey(start.filename, start.line);
100
98
  }
101
99
 
102
100
  function positionLocation(position) {
103
101
  if (!position?.filename) {
104
102
  return undefined;
105
103
  }
106
- if (position.line && position.line > 0) {
107
- return `${position.filename}#${position.line}`;
108
- }
109
- return position.filename;
104
+ return occurrenceLocationKey(position.filename, position.line);
110
105
  }
111
106
 
112
107
  function purlWithoutVersion(purl) {