regscale-cli 6.21.2.0__py3-none-any.whl → 6.28.2.1__py3-none-any.whl

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 (314) hide show
  1. regscale/_version.py +1 -1
  2. regscale/airflow/hierarchy.py +2 -2
  3. regscale/core/app/api.py +5 -2
  4. regscale/core/app/application.py +36 -6
  5. regscale/core/app/internal/control_editor.py +73 -21
  6. regscale/core/app/internal/evidence.py +727 -204
  7. regscale/core/app/internal/login.py +4 -2
  8. regscale/core/app/internal/model_editor.py +219 -64
  9. regscale/core/app/utils/app_utils.py +86 -12
  10. regscale/core/app/utils/catalog_utils/common.py +1 -1
  11. regscale/core/login.py +21 -4
  12. regscale/core/utils/async_graphql_client.py +363 -0
  13. regscale/core/utils/date.py +77 -1
  14. regscale/dev/cli.py +26 -0
  15. regscale/dev/code_gen.py +109 -24
  16. regscale/dev/version.py +72 -0
  17. regscale/integrations/commercial/__init__.py +30 -2
  18. regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
  19. regscale/integrations/commercial/aws/cli.py +3107 -54
  20. regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
  21. regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
  22. regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
  23. regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
  24. regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
  25. regscale/integrations/commercial/aws/config_compliance.py +914 -0
  26. regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
  27. regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
  28. regscale/integrations/commercial/aws/evidence_generator.py +283 -0
  29. regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
  30. regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
  31. regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
  32. regscale/integrations/commercial/aws/iam_evidence.py +574 -0
  33. regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
  34. regscale/integrations/commercial/aws/inventory/base.py +107 -5
  35. regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
  36. regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
  37. regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
  38. regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
  39. regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
  40. regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
  41. regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
  42. regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
  43. regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
  44. regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
  45. regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
  46. regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
  47. regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
  48. regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
  49. regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
  50. regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
  51. regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
  52. regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
  53. regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
  54. regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
  55. regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
  56. regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
  57. regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
  58. regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
  59. regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
  60. regscale/integrations/commercial/aws/kms_evidence.py +879 -0
  61. regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
  62. regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
  63. regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
  64. regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
  65. regscale/integrations/commercial/aws/org_evidence.py +666 -0
  66. regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
  67. regscale/integrations/commercial/aws/s3_evidence.py +632 -0
  68. regscale/integrations/commercial/aws/scanner.py +1072 -205
  69. regscale/integrations/commercial/aws/security_hub.py +319 -0
  70. regscale/integrations/commercial/aws/session_manager.py +282 -0
  71. regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
  72. regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
  73. regscale/integrations/commercial/jira.py +489 -153
  74. regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
  75. regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
  76. regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
  77. regscale/integrations/commercial/qualys/__init__.py +167 -68
  78. regscale/integrations/commercial/qualys/scanner.py +305 -39
  79. regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
  80. regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
  81. regscale/integrations/commercial/sicura/api.py +79 -42
  82. regscale/integrations/commercial/sicura/commands.py +8 -2
  83. regscale/integrations/commercial/sicura/scanner.py +83 -44
  84. regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
  85. regscale/integrations/commercial/synqly/assets.py +133 -16
  86. regscale/integrations/commercial/synqly/edr.py +2 -8
  87. regscale/integrations/commercial/synqly/query_builder.py +536 -0
  88. regscale/integrations/commercial/synqly/ticketing.py +27 -0
  89. regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
  90. regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
  91. regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
  92. regscale/integrations/commercial/tenablev2/commands.py +146 -5
  93. regscale/integrations/commercial/tenablev2/scanner.py +1 -3
  94. regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
  95. regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
  96. regscale/integrations/commercial/wizv2/click.py +191 -76
  97. regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
  98. regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
  99. regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
  100. regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
  101. regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
  102. regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
  103. regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
  104. regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
  105. regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
  106. regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
  107. regscale/integrations/commercial/wizv2/issue.py +776 -28
  108. regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
  109. regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
  110. regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
  111. regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
  112. regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
  113. regscale/integrations/commercial/wizv2/reports.py +243 -0
  114. regscale/integrations/commercial/wizv2/sbom.py +1 -1
  115. regscale/integrations/commercial/wizv2/scanner.py +1031 -441
  116. regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
  117. regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
  118. regscale/integrations/commercial/wizv2/variables.py +89 -3
  119. regscale/integrations/compliance_integration.py +1036 -151
  120. regscale/integrations/control_matcher.py +432 -0
  121. regscale/integrations/due_date_handler.py +333 -0
  122. regscale/integrations/milestone_manager.py +291 -0
  123. regscale/integrations/public/__init__.py +14 -0
  124. regscale/integrations/public/cci_importer.py +834 -0
  125. regscale/integrations/public/csam/__init__.py +0 -0
  126. regscale/integrations/public/csam/csam.py +938 -0
  127. regscale/integrations/public/csam/csam_agency_defined.py +179 -0
  128. regscale/integrations/public/csam/csam_common.py +154 -0
  129. regscale/integrations/public/csam/csam_controls.py +432 -0
  130. regscale/integrations/public/csam/csam_poam.py +124 -0
  131. regscale/integrations/public/fedramp/click.py +77 -6
  132. regscale/integrations/public/fedramp/docx_parser.py +10 -1
  133. regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
  134. regscale/integrations/public/fedramp/fedramp_five.py +1 -1
  135. regscale/integrations/public/fedramp/poam/scanner.py +75 -7
  136. regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
  137. regscale/integrations/scanner_integration.py +1961 -430
  138. regscale/models/integration_models/CCI_List.xml +1 -0
  139. regscale/models/integration_models/aqua.py +2 -2
  140. regscale/models/integration_models/cisa_kev_data.json +805 -11
  141. regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
  142. regscale/models/integration_models/nexpose.py +36 -10
  143. regscale/models/integration_models/qualys.py +3 -4
  144. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  145. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
  146. regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
  147. regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
  148. regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
  149. regscale/models/locking.py +12 -8
  150. regscale/models/platform.py +4 -2
  151. regscale/models/regscale_models/__init__.py +7 -0
  152. regscale/models/regscale_models/assessment.py +2 -1
  153. regscale/models/regscale_models/catalog.py +1 -1
  154. regscale/models/regscale_models/compliance_settings.py +251 -1
  155. regscale/models/regscale_models/component.py +1 -0
  156. regscale/models/regscale_models/control_implementation.py +236 -41
  157. regscale/models/regscale_models/control_objective.py +74 -5
  158. regscale/models/regscale_models/file.py +2 -0
  159. regscale/models/regscale_models/form_field_value.py +5 -3
  160. regscale/models/regscale_models/inheritance.py +44 -0
  161. regscale/models/regscale_models/issue.py +301 -102
  162. regscale/models/regscale_models/milestone.py +33 -14
  163. regscale/models/regscale_models/organization.py +3 -0
  164. regscale/models/regscale_models/regscale_model.py +310 -73
  165. regscale/models/regscale_models/security_plan.py +4 -2
  166. regscale/models/regscale_models/vulnerability.py +3 -3
  167. regscale/regscale.py +25 -4
  168. regscale/templates/__init__.py +0 -0
  169. regscale/utils/threading/threadhandler.py +20 -15
  170. regscale/validation/record.py +23 -1
  171. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
  172. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
  173. tests/core/__init__.py +0 -0
  174. tests/core/utils/__init__.py +0 -0
  175. tests/core/utils/test_async_graphql_client.py +472 -0
  176. tests/fixtures/test_fixture.py +13 -8
  177. tests/regscale/core/test_login.py +171 -4
  178. tests/regscale/integrations/commercial/__init__.py +0 -0
  179. tests/regscale/integrations/commercial/aws/__init__.py +0 -0
  180. tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
  181. tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
  182. tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
  183. tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
  184. tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
  185. tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
  186. tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
  187. tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
  188. tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
  189. tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
  190. tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
  191. tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
  192. tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
  193. tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
  194. tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
  195. tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
  196. tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
  197. tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
  198. tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
  199. tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
  200. tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
  201. tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
  202. tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
  203. tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
  204. tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
  205. tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
  206. tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
  207. tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
  208. tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
  209. tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
  210. tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
  211. tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
  212. tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
  213. tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
  214. tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
  215. tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
  216. tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
  217. tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
  218. tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
  219. tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
  220. tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
  221. tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
  222. tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
  223. tests/regscale/integrations/commercial/conftest.py +28 -0
  224. tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
  225. tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
  226. tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
  227. tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
  228. tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
  229. tests/regscale/integrations/commercial/test_aws.py +3742 -0
  230. tests/regscale/integrations/commercial/test_burp.py +48 -0
  231. tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
  232. tests/regscale/integrations/commercial/test_dependabot.py +341 -0
  233. tests/regscale/integrations/commercial/test_gcp.py +1543 -0
  234. tests/regscale/integrations/commercial/test_gitlab.py +549 -0
  235. tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
  236. tests/regscale/integrations/commercial/test_jira.py +2204 -0
  237. tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
  238. tests/regscale/integrations/commercial/test_okta.py +1228 -0
  239. tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
  240. tests/regscale/integrations/commercial/test_sicura.py +349 -0
  241. tests/regscale/integrations/commercial/test_snow.py +423 -0
  242. tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
  243. tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
  244. tests/regscale/integrations/commercial/test_stig.py +33 -0
  245. tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
  246. tests/regscale/integrations/commercial/test_stigv2.py +406 -0
  247. tests/regscale/integrations/commercial/test_wiz.py +1365 -0
  248. tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
  249. tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
  250. tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
  251. tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
  252. tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
  253. tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
  254. tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
  255. tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
  256. tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
  257. tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
  258. tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
  259. tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
  260. tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
  261. tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
  262. tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
  263. tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
  264. tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
  265. tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
  266. tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
  267. tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
  268. tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
  269. tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
  270. tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
  271. tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
  272. tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
  273. tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
  274. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
  275. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
  276. tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
  277. tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
  278. tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
  279. tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
  280. tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
  281. tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
  282. tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
  283. tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
  284. tests/regscale/integrations/public/__init__.py +0 -0
  285. tests/regscale/integrations/public/fedramp/__init__.py +1 -0
  286. tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
  287. tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
  288. tests/regscale/integrations/public/test_alienvault.py +220 -0
  289. tests/regscale/integrations/public/test_cci.py +1053 -0
  290. tests/regscale/integrations/public/test_cisa.py +1021 -0
  291. tests/regscale/integrations/public/test_emass.py +518 -0
  292. tests/regscale/integrations/public/test_fedramp.py +1152 -0
  293. tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
  294. tests/regscale/integrations/public/test_file_uploads.py +506 -0
  295. tests/regscale/integrations/public/test_oscal.py +453 -0
  296. tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
  297. tests/regscale/integrations/test_control_matcher.py +1421 -0
  298. tests/regscale/integrations/test_control_matching.py +155 -0
  299. tests/regscale/integrations/test_milestone_manager.py +408 -0
  300. tests/regscale/models/test_control_implementation.py +118 -3
  301. tests/regscale/models/test_form_field_value_integration.py +304 -0
  302. tests/regscale/models/test_issue.py +378 -1
  303. tests/regscale/models/test_module_integration.py +582 -0
  304. tests/regscale/models/test_tenable_integrations.py +811 -105
  305. regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
  306. regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
  307. regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
  308. regscale/integrations/public/fedramp/parts_mapper.py +0 -107
  309. /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
  310. /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
  311. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
  312. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
  313. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
  314. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Parsers module for Wiz integration - re-exports from main.py for clean imports."""
4
+
5
+ # Import all parser functions from the main parsers module
6
+ from regscale.integrations.commercial.wizv2.parsers.main import (
7
+ collect_components_to_create,
8
+ fetch_wiz_data,
9
+ get_disk_storage,
10
+ get_ip_address,
11
+ get_latest_version,
12
+ get_network_info,
13
+ get_product_ids,
14
+ get_software_name_from_cpe,
15
+ handle_container_image_version,
16
+ handle_provider,
17
+ handle_software_version,
18
+ pull_resource_info_from_props,
19
+ )
20
+
21
+ __all__ = [
22
+ "collect_components_to_create",
23
+ "fetch_wiz_data",
24
+ "get_disk_storage",
25
+ "get_ip_address",
26
+ "get_latest_version",
27
+ "get_network_info",
28
+ "get_product_ids",
29
+ "get_software_name_from_cpe",
30
+ "handle_container_image_version",
31
+ "handle_provider",
32
+ "handle_software_version",
33
+ "pull_resource_info_from_props",
34
+ ]
@@ -3,7 +3,7 @@ import logging
3
3
  from typing import Dict, Optional, Tuple, Union, List, Any
4
4
 
5
5
  from regscale.integrations.commercial.cpe import extract_product_name_and_version
6
- from regscale.integrations.commercial.wizv2.constants import CONTENT_TYPE
6
+ from regscale.integrations.commercial.wizv2.core.constants import CONTENT_TYPE
7
7
  from regscale.integrations.commercial.wizv2.variables import WizVariables
8
8
  from regscale.models import regscale_models
9
9
  from regscale.utils import PaginatedGraphQLClient
@@ -0,0 +1,11 @@
1
+ """Processors for Wiz integration - handles business logic and data transformation."""
2
+
3
+ from regscale.integrations.commercial.wizv2.processors.finding import (
4
+ FindingConsolidator,
5
+ FindingToIssueProcessor,
6
+ )
7
+
8
+ __all__ = [
9
+ "FindingConsolidator",
10
+ "FindingToIssueProcessor",
11
+ ]
@@ -7,7 +7,7 @@ from typing import Dict, List, Optional, Iterator, Any, Set, Union
7
7
  from collections import defaultdict
8
8
 
9
9
  from regscale.integrations.scanner_integration import IntegrationFinding
10
- from regscale.integrations.commercial.wizv2.policy_compliance_helpers import AssetConsolidator
10
+ from regscale.integrations.commercial.wizv2.compliance.helpers import AssetConsolidator
11
11
  from regscale.models import regscale_models
12
12
 
13
13
  logger = logging.getLogger("regscale")
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Wiz Report Management for RegScale CLI."""
4
+
5
+ import logging
6
+ import time
7
+ from typing import Dict, Any, Optional
8
+
9
+ import requests
10
+
11
+ from regscale.integrations.commercial.wizv2.core.constants import (
12
+ CREATE_REPORT_QUERY,
13
+ REPORTS_QUERY,
14
+ DOWNLOAD_QUERY,
15
+ RERUN_REPORT_QUERY,
16
+ get_compliance_report_variables,
17
+ CHECK_INTERVAL_FOR_DOWNLOAD_REPORT,
18
+ MAX_RETRIES,
19
+ )
20
+
21
+ logger = logging.getLogger("regscale")
22
+
23
+
24
+ class WizReportManager:
25
+ """Manages Wiz report operations including creation, monitoring, and download."""
26
+
27
+ def __init__(self, api_url: str, access_token: str):
28
+ """
29
+ Initialize the report manager.
30
+
31
+ :param str api_url: The Wiz GraphQL API URL
32
+ :param str access_token: The authentication token
33
+ """
34
+ self.api_url = api_url
35
+ self.access_token = access_token
36
+ self.headers = {"Content-Type": "application/json", "Authorization": f"Bearer {access_token}"}
37
+
38
+ def create_compliance_report(self, project_id: str, run_starts_at: Optional[str] = None) -> Optional[str]:
39
+ """
40
+ Create a compliance report for the specified project.
41
+
42
+ :param str project_id: The Wiz project ID
43
+ :param Optional[str] run_starts_at: ISO timestamp for when the report should start
44
+ :return: Report ID if successful, None otherwise
45
+ :rtype: Optional[str]
46
+ """
47
+ variables = get_compliance_report_variables(project_id, run_starts_at)
48
+
49
+ payload = {"query": CREATE_REPORT_QUERY, "variables": variables}
50
+
51
+ try:
52
+ response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
53
+ response.raise_for_status()
54
+
55
+ data = response.json()
56
+ if "errors" in data:
57
+ logger.error(f"GraphQL errors: {data['errors']}")
58
+ return None
59
+
60
+ report_data = data.get("data", {}).get("createReport", {}).get("report", {})
61
+ report_id = report_data.get("id")
62
+
63
+ if report_id:
64
+ logger.info(f"Successfully created compliance report with ID: {report_id}")
65
+ return report_id
66
+ else:
67
+ logger.error("No report ID returned from create report mutation")
68
+ return None
69
+
70
+ except requests.exceptions.RequestException as e:
71
+ logger.error(f"Error creating compliance report: {e}")
72
+ return None
73
+ except (KeyError, ValueError) as e:
74
+ logger.error(f"Error parsing create report response: {e}")
75
+ return None
76
+
77
+ def get_report_status(self, report_id: str) -> Dict[str, Any]:
78
+ """
79
+ Get the status and details of a report.
80
+
81
+ :param str report_id: The report ID
82
+ :return: Report status information
83
+ :rtype: Dict[str, Any]
84
+ """
85
+ variables = {"reportId": report_id}
86
+
87
+ payload = {"query": DOWNLOAD_QUERY, "variables": variables}
88
+
89
+ try:
90
+ response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
91
+ response.raise_for_status()
92
+
93
+ data = response.json()
94
+ if "errors" in data:
95
+ logger.error(f"GraphQL errors: {data['errors']}")
96
+ return {}
97
+
98
+ report_data = data.get("data", {}).get("report", {})
99
+ last_run = report_data.get("lastRun", {})
100
+
101
+ return {
102
+ "status": last_run.get("status", "UNKNOWN"),
103
+ "url": last_run.get("url", ""),
104
+ "report_data": report_data,
105
+ }
106
+
107
+ except requests.exceptions.RequestException as e:
108
+ logger.error(f"Error getting report status: {e}")
109
+ return {}
110
+ except (KeyError, ValueError) as e:
111
+ logger.error(f"Error parsing report status response: {e}")
112
+ return {}
113
+
114
+ def wait_for_report_completion(self, report_id: str) -> Optional[str]:
115
+ """
116
+ Wait for a report to complete and return the download URL.
117
+
118
+ :param str report_id: The report ID
119
+ :return: Download URL if successful, None otherwise
120
+ :rtype: Optional[str]
121
+ """
122
+ logger.info(f"Waiting for report {report_id} to complete...")
123
+
124
+ for attempt in range(MAX_RETRIES):
125
+ status_info = self.get_report_status(report_id)
126
+ status = status_info.get("status", "UNKNOWN")
127
+
128
+ logger.info(f"Report status (attempt {attempt + 1}/{MAX_RETRIES}): {status}")
129
+
130
+ if status in ["SUCCESS", "COMPLETED"]:
131
+ download_url = status_info.get("url", "")
132
+ if download_url:
133
+ logger.info(f"Report completed successfully. Download URL: {download_url}")
134
+ return download_url
135
+ else:
136
+ logger.warning("Report completed but no download URL available")
137
+ return None
138
+
139
+ elif status in ["FAILED", "CANCELLED", "TIMEOUT"]:
140
+ logger.error(f"Report failed with status: {status}")
141
+ return None
142
+
143
+ elif status in ["PENDING", "RUNNING", "IN_PROGRESS", "UNKNOWN"]:
144
+ logger.info(
145
+ f"Report is still {status.lower()}, waiting {CHECK_INTERVAL_FOR_DOWNLOAD_REPORT} seconds..."
146
+ )
147
+ time.sleep(CHECK_INTERVAL_FOR_DOWNLOAD_REPORT)
148
+ else:
149
+ logger.warning(f"Unknown report status: {status}")
150
+ time.sleep(CHECK_INTERVAL_FOR_DOWNLOAD_REPORT)
151
+
152
+ logger.error(f"Report did not complete after {MAX_RETRIES} attempts")
153
+ return None
154
+
155
+ def download_report(self, download_url: str, output_path: str) -> bool:
156
+ """
157
+ Download a report from the given URL.
158
+
159
+ :param str download_url: The download URL
160
+ :param str output_path: Path where the report should be saved
161
+ :return: True if successful, False otherwise
162
+ :rtype: bool
163
+ """
164
+ try:
165
+ logger.info(f"Downloading report to: {output_path}")
166
+
167
+ response = requests.get(download_url, timeout=300)
168
+ response.raise_for_status()
169
+
170
+ with open(output_path, "wb") as f:
171
+ f.write(response.content)
172
+
173
+ logger.info(f"Report downloaded successfully to: {output_path}")
174
+ return True
175
+
176
+ except requests.exceptions.RequestException as e:
177
+ logger.error(f"Error downloading report: {e}")
178
+ return False
179
+ except IOError as e:
180
+ logger.error(f"Error saving report to file: {e}")
181
+ return False
182
+
183
+ def rerun_report(self, report_id: str) -> Optional[str]:
184
+ """
185
+ Rerun an existing report.
186
+
187
+ :param str report_id: The report ID
188
+ :return: Download URL if successful, None otherwise
189
+ :rtype: Optional[str]
190
+ """
191
+ variables = {"reportId": report_id}
192
+
193
+ payload = {"query": RERUN_REPORT_QUERY, "variables": variables}
194
+
195
+ try:
196
+ response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
197
+ response.raise_for_status()
198
+
199
+ data = response.json()
200
+ if "errors" in data:
201
+ logger.error(f"GraphQL errors: {data['errors']}")
202
+ return None
203
+
204
+ logger.info(f"Successfully triggered rerun for report {report_id}")
205
+ return self.wait_for_report_completion(report_id)
206
+
207
+ except requests.exceptions.RequestException as e:
208
+ logger.error(f"Error rerunning report: {e}")
209
+ return None
210
+ except (KeyError, ValueError) as e:
211
+ logger.error(f"Error parsing rerun report response: {e}")
212
+ return None
213
+
214
+ def list_reports(self, filter_by: Optional[Dict[str, Any]] = None) -> list:
215
+ """
216
+ List available reports.
217
+
218
+ :param Optional[Dict[str, Any]] filter_by: Optional filter criteria
219
+ :return: List of reports
220
+ :rtype: list
221
+ """
222
+ variables = {"first": 50, "filterBy": filter_by or {}}
223
+
224
+ payload = {"query": REPORTS_QUERY, "variables": variables}
225
+
226
+ try:
227
+ response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
228
+ response.raise_for_status()
229
+
230
+ data = response.json()
231
+ if "errors" in data:
232
+ logger.error(f"GraphQL errors: {data['errors']}")
233
+ return []
234
+
235
+ reports = data.get("data", {}).get("reports", {}).get("nodes", [])
236
+ return reports
237
+
238
+ except requests.exceptions.RequestException as e:
239
+ logger.error(f"Error listing reports: {e}")
240
+ return []
241
+ except (KeyError, ValueError) as e:
242
+ logger.error(f"Error parsing list reports response: {e}")
243
+ return []
@@ -6,7 +6,7 @@ from typing import List, Dict, Optional
6
6
  from regscale.core.app.utils.app_utils import error_and_exit
7
7
  from regscale.integrations.commercial.wizv2.WizDataMixin import WizMixin
8
8
  from regscale.models.regscale_models.sbom import Sbom
9
- from regscale.integrations.commercial.wizv2.constants import SBOM_QUERY, SBOM_FILE_PATH
9
+ from regscale.integrations.commercial.wizv2.core.constants import SBOM_QUERY, SBOM_FILE_PATH
10
10
  from regscale.utils import get_value
11
11
 
12
12
  logger = logging.getLogger(__name__)