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,48 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Utils module for Wiz integration - re-exports from main.py for clean imports."""
4
+
5
+ # Import all util functions from the main utils module
6
+ from regscale.integrations.commercial.wizv2.utils.main import (
7
+ create_asset_type,
8
+ get_notes_from_wiz_props,
9
+ handle_management_type,
10
+ map_category,
11
+ is_report_expired,
12
+ convert_first_seen_to_days,
13
+ fetch_report_by_id,
14
+ download_file,
15
+ fetch_sbom_report,
16
+ compliance_job_progress,
17
+ get_report_url_and_status,
18
+ get_or_create_report_id,
19
+ create_compliance_report,
20
+ download_report,
21
+ rerun_expired_report,
22
+ )
23
+
24
+ # Import constants needed by tests and other modules
25
+ from regscale.integrations.commercial.wizv2.core.constants import (
26
+ CHECK_INTERVAL_FOR_DOWNLOAD_REPORT,
27
+ MAX_RETRIES,
28
+ )
29
+
30
+ __all__ = [
31
+ "create_asset_type",
32
+ "get_notes_from_wiz_props",
33
+ "handle_management_type",
34
+ "map_category",
35
+ "is_report_expired",
36
+ "convert_first_seen_to_days",
37
+ "fetch_report_by_id",
38
+ "download_file",
39
+ "fetch_sbom_report",
40
+ "compliance_job_progress",
41
+ "get_report_url_and_status",
42
+ "get_or_create_report_id",
43
+ "create_compliance_report",
44
+ "download_report",
45
+ "rerun_expired_report",
46
+ "CHECK_INTERVAL_FOR_DOWNLOAD_REPORT",
47
+ "MAX_RETRIES",
48
+ ]
@@ -28,7 +28,7 @@ from regscale.core.app.utils.app_utils import (
28
28
  )
29
29
  from regscale.core.utils.date import datetime_obj
30
30
  from regscale.integrations.commercial.cpe import extract_product_name_and_version
31
- from regscale.integrations.commercial.wizv2.constants import (
31
+ from regscale.integrations.commercial.wizv2.core.constants import (
32
32
  BEARER,
33
33
  CHECK_INTERVAL_FOR_DOWNLOAD_REPORT,
34
34
  CONTENT_TYPE,
@@ -42,7 +42,7 @@ from regscale.integrations.commercial.wizv2.constants import (
42
42
  )
43
43
  from regscale.models.integration_models.wizv2 import ComplianceReport, ComplianceCheckStatus
44
44
  from regscale.integrations.commercial.wizv2.variables import WizVariables
45
- from regscale.integrations.commercial.wizv2.wiz_auth import wiz_authenticate
45
+ from regscale.integrations.commercial.wizv2.core.auth import wiz_authenticate
46
46
  from regscale.models import (
47
47
  File,
48
48
  Sbom,
@@ -167,34 +167,57 @@ def map_category(node: dict[str, Any]) -> regscale_models.AssetCategory:
167
167
  :return: RegScale AssetCategory
168
168
  :rtype: regscale_models.AssetCategory
169
169
  """
170
-
171
170
  # First check if there is a CPE which can tell us the category directly.
171
+ if category := _get_category_from_cpe(node):
172
+ return category
173
+
174
+ # Then try mapping by the configured Wiz hardware asset and technology deployment model types.
175
+ asset_type = node.get("type", "")
176
+ if category := _get_category_from_hardware_types(node, asset_type):
177
+ return category
178
+
179
+ # Finally try matching the asset type directly by name.
180
+ if category := _get_category_from_asset_type(asset_type, node):
181
+ return category
182
+
183
+ # If all else fails, default to software.
184
+ return regscale_models.AssetCategory.Software
185
+
186
+
187
+ def _get_category_from_cpe(node: dict[str, Any]) -> Optional[regscale_models.AssetCategory]:
188
+ """Get asset category from CPE information."""
172
189
  cpe = node.get("graphEntity", {}).get("properties", {}).get("cpe", "")
173
190
  cpe_part = extract_product_name_and_version(cpe).get("part", "")
174
191
  if cpe_part and cpe_part.lower() in CPE_PART_TO_CATEGORY_MAPPING:
175
192
  return CPE_PART_TO_CATEGORY_MAPPING[cpe_part]
193
+ return None
176
194
 
177
- # Then try mapping by the configured Wiz hardware asset and technology deployment model types.
178
- asset_type = node.get("type", "")
179
- if WizVariables.useWizHardwareAssetTypes:
180
- if asset_type in WizVariables.wizHardwareAssetTypes:
181
- return regscale_models.AssetCategory.Hardware
182
- if (graph_entity := node.get("graphEntity", {})) and (techs := graph_entity.get("technologies", [])):
183
- for tech in techs:
184
- # We double check just in case we get an explicit None for the technologies.
185
- if tech and tech.get("deploymentModel", None) in WizVariables.wizHardwareAssetTypes:
186
- return regscale_models.AssetCategory.Hardware
187
- else:
188
- logger.debug("No graphEntity set for node %r, default to Software.", node)
189
195
 
190
- # Finally try matching the asset type directly by name.
196
+ def _get_category_from_hardware_types(node: dict[str, Any], asset_type: str) -> Optional[regscale_models.AssetCategory]:
197
+ """Get asset category from configured hardware types."""
198
+ if not WizVariables.useWizHardwareAssetTypes:
199
+ return None
200
+
201
+ if asset_type in WizVariables.wizHardwareAssetTypes:
202
+ return regscale_models.AssetCategory.Hardware
203
+
204
+ if (graph_entity := node.get("graphEntity", {})) and (techs := graph_entity.get("technologies", [])):
205
+ for tech in techs:
206
+ if tech and tech.get("deploymentModel", None) in WizVariables.wizHardwareAssetTypes:
207
+ return regscale_models.AssetCategory.Hardware
208
+ else:
209
+ logger.debug("No graphEntity set for node %r, default to Software.", node)
210
+
211
+ return None
212
+
213
+
214
+ def _get_category_from_asset_type(asset_type: str, node: dict[str, Any]) -> Optional[regscale_models.AssetCategory]:
215
+ """Get asset category from asset type name."""
191
216
  if hasattr(regscale_models.AssetCategory, asset_type):
192
217
  if asset_category := getattr(regscale_models.AssetCategory, asset_type):
193
218
  return asset_category
194
219
  logger.debug("Unknown AssetType %r for node %r. Defaulting to Software.", asset_type, node)
195
-
196
- # If all else fails, default to software.
197
- return regscale_models.AssetCategory.Software
220
+ return None
198
221
 
199
222
 
200
223
  def convert_first_seen_to_days(first_seen: str) -> int:
@@ -753,27 +776,41 @@ def get_report_url_and_status(report_id: str) -> str:
753
776
  raise requests.RequestException("Failed to download report")
754
777
 
755
778
  response_json = response.json()
756
- if errors := response_json.get("errors"):
757
- message = errors[0]["message"]
758
- if RATE_LIMIT_MSG in message:
759
- rate = errors[0]["extensions"]["retryAfter"]
760
- logger.warning("Sleeping %i seconds due to rate limit", rate)
761
- time.sleep(rate)
762
- continue
763
-
764
- logger.error(errors)
765
- else:
766
- status = response_json.get("data", {}).get("report", {}).get("lastRun", {}).get("status")
767
- if status == "COMPLETED":
768
- return response_json["data"]["report"]["lastRun"]["url"]
769
- elif status == "EXPIRED":
770
- logger.warning("Report %s is expired, rerunning report...", report_id)
771
- rerun_expired_report({"reportId": report_id})
772
- return get_report_url_and_status(report_id)
779
+ if url := _handle_report_response(response_json, report_id):
780
+ return url
773
781
 
774
782
  raise requests.RequestException("Download failed, exceeding the maximum number of retries")
775
783
 
776
784
 
785
+ def _handle_report_response(response_json: dict, report_id: str) -> Optional[str]:
786
+ """Handle report response and return URL if ready."""
787
+ if errors := response_json.get("errors"):
788
+ if _handle_rate_limit_error(errors):
789
+ return None
790
+ logger.error(errors)
791
+ return None
792
+
793
+ status = response_json.get("data", {}).get("report", {}).get("lastRun", {}).get("status")
794
+ if status == "COMPLETED":
795
+ return response_json["data"]["report"]["lastRun"]["url"]
796
+ if status == "EXPIRED":
797
+ logger.warning("Report %s is expired, rerunning report...", report_id)
798
+ rerun_expired_report({"reportId": report_id})
799
+ return get_report_url_and_status(report_id)
800
+ return None
801
+
802
+
803
+ def _handle_rate_limit_error(errors: list) -> bool:
804
+ """Handle rate limit error and return True if rate limited."""
805
+ message = errors[0]["message"]
806
+ if RATE_LIMIT_MSG in message:
807
+ rate = errors[0]["extensions"]["retryAfter"]
808
+ logger.warning("Sleeping %i seconds due to rate limit", rate)
809
+ time.sleep(rate)
810
+ return True
811
+ return False
812
+
813
+
777
814
  def download_report(variables: Dict) -> requests.Response:
778
815
  """
779
816
  Return a download URL for a provided Wiz report id
@@ -1264,35 +1301,53 @@ def report_result_to_implementation_status(result: str) -> str:
1264
1301
  compliance_settings = get_wiz_compliance_settings()
1265
1302
 
1266
1303
  if compliance_settings:
1267
- try:
1268
- # Get implementation status labels from compliance settings
1269
- status_labels = compliance_settings.get_field_labels("implementationStatus")
1270
-
1271
- # Map compliance check result to implementation status
1272
- result_lower = result.lower()
1273
- for label in status_labels:
1274
- label_lower = label.lower()
1275
- if result_lower == ComplianceCheckStatus.PASS.value.lower():
1276
- if label_lower in ["implemented", "complete", "compliant"]:
1277
- return label
1278
- elif result_lower == ComplianceCheckStatus.FAIL.value.lower():
1279
- if label_lower in ["inremediation", "in remediation", "remediation", "failed", "non-compliant"]:
1280
- return label
1281
- else: # Not implemented or other status
1282
- if label_lower in ["notimplemented", "not implemented", "pending", "planned"]:
1283
- return label
1284
-
1285
- logger.debug(f"No matching compliance setting found for result: {result}")
1286
- except Exception as e:
1287
- logger.debug(f"Error using compliance settings for implementation status mapping: {e}")
1304
+ if status := _try_get_status_from_settings(compliance_settings, result):
1305
+ return status
1288
1306
 
1289
1307
  # Fallback to default mapping
1308
+ return _get_default_status_mapping(result)
1309
+
1310
+
1311
+ def _try_get_status_from_settings(compliance_settings, result: str) -> Optional[str]:
1312
+ """Try to get status from compliance settings."""
1313
+ try:
1314
+ status_labels = compliance_settings.get_field_labels("implementationStatus")
1315
+ result_lower = result.lower()
1316
+
1317
+ for label in status_labels:
1318
+ if status := _match_label_to_result(label, result_lower):
1319
+ return status
1320
+
1321
+ logger.debug(f"No matching compliance setting found for result: {result}")
1322
+ except Exception as e:
1323
+ logger.debug(f"Error using compliance settings for implementation status mapping: {e}")
1324
+ return None
1325
+
1326
+
1327
+ def _match_label_to_result(label: str, result_lower: str) -> Optional[str]:
1328
+ """Match a label to a result status."""
1329
+ label_lower = label.lower()
1330
+
1331
+ if result_lower == ComplianceCheckStatus.PASS.value.lower():
1332
+ if label_lower in ["implemented", "complete", "compliant"]:
1333
+ return label
1334
+ elif result_lower == ComplianceCheckStatus.FAIL.value.lower():
1335
+ if label_lower in ["inremediation", "in remediation", "remediation", "failed", "non-compliant"]:
1336
+ return label
1337
+ else: # Not implemented or other status
1338
+ if label_lower in ["notimplemented", "not implemented", "pending", "planned"]:
1339
+ return label
1340
+
1341
+ return None
1342
+
1343
+
1344
+ def _get_default_status_mapping(result: str) -> str:
1345
+ """Get default status mapping for result."""
1290
1346
  if result == ComplianceCheckStatus.PASS.value:
1291
1347
  return ControlImplementationStatus.Implemented.value
1292
- elif result == ComplianceCheckStatus.FAIL.value:
1348
+ if result == ComplianceCheckStatus.FAIL.value:
1293
1349
  return ControlImplementationStatus.InRemediation.value
1294
- else:
1295
- return ControlImplementationStatus.NotImplemented.value
1350
+ return ControlImplementationStatus.NotImplemented.value
1296
1351
 
1297
1352
 
1298
1353
  def create_vulnerabilities_from_wiz_findings(
@@ -1385,7 +1440,7 @@ def create_single_vulnerability_from_wiz_data(
1385
1440
  """
1386
1441
  # Import here to avoid circular imports
1387
1442
  from regscale.integrations.commercial.wizv2.scanner import WizVulnerabilityIntegration
1388
- from regscale.integrations.commercial.wizv2.constants import WizVulnerabilityType
1443
+ from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
1389
1444
 
1390
1445
  try:
1391
1446
  # Create integration instance
@@ -3,7 +3,93 @@
3
3
  """Wiz Variables"""
4
4
 
5
5
  from regscale.core.app.utils.variables import RsVariableType, RsVariablesMeta
6
- from regscale.integrations.commercial.wizv2.constants import RECOMMENDED_WIZ_INVENTORY_TYPES, DEFAULT_WIZ_HARDWARE_TYPES
6
+
7
+ # Define constants locally to avoid circular import with core.constants
8
+ _RECOMMENDED_WIZ_INVENTORY_TYPES = [
9
+ # Compute resources
10
+ "CONTAINER",
11
+ "CONTAINER_GROUP",
12
+ "CONTAINER_IMAGE",
13
+ "POD",
14
+ "SERVERLESS",
15
+ "SERVERLESS_PACKAGE",
16
+ "VIRTUAL_DESKTOP",
17
+ "VIRTUAL_MACHINE",
18
+ "VIRTUAL_MACHINE_IMAGE",
19
+ # Network and exposure
20
+ "API_GATEWAY",
21
+ "CDN",
22
+ "CERTIFICATE",
23
+ "DNS_RECORD",
24
+ "ENDPOINT",
25
+ "FIREWALL",
26
+ "GATEWAY",
27
+ "LOAD_BALANCER",
28
+ "MANAGED_CERTIFICATE",
29
+ "NETWORK_ADDRESS",
30
+ "NETWORK_INTERFACE",
31
+ "PRIVATE_ENDPOINT",
32
+ "PRIVATE_LINK",
33
+ "PROXY",
34
+ "WEB_SERVICE",
35
+ # Storage and data
36
+ "BACKUP_SERVICE",
37
+ "BUCKET",
38
+ "DATABASE",
39
+ "DATA_WORKLOAD",
40
+ "DB_SERVER",
41
+ "FILE_SYSTEM_SERVICE",
42
+ "SECRET",
43
+ "SECRET_CONTAINER",
44
+ "STORAGE_ACCOUNT",
45
+ "VOLUME",
46
+ # Identity and access management
47
+ "ACCESS_ROLE",
48
+ "AUTHENTICATION_CONFIGURATION",
49
+ "IAM_BINDING",
50
+ "RAW_ACCESS_POLICY",
51
+ "SERVICE_ACCOUNT",
52
+ # Development and CI/CD
53
+ "APPLICATION",
54
+ "CICD_SERVICE",
55
+ "CONFIG_MAP",
56
+ "CONTAINER_REGISTRY",
57
+ "CONTAINER_SERVICE",
58
+ # Kubernetes resources
59
+ "CONTROLLER_REVISION",
60
+ "KUBERNETES_CLUSTER",
61
+ "KUBERNETES_INGRESS",
62
+ "KUBERNETES_NODE",
63
+ "KUBERNETES_SERVICE",
64
+ "NAMESPACE",
65
+ # Infrastructure and management
66
+ "CLOUD_LOG_CONFIGURATION",
67
+ "CLOUD_ORGANIZATION",
68
+ "DOMAIN",
69
+ "EMAIL_SERVICE",
70
+ "ENCRYPTION_KEY",
71
+ "MANAGEMENT_SERVICE",
72
+ "MESSAGING_SERVICE",
73
+ "REGISTERED_DOMAIN",
74
+ "RESOURCE_GROUP",
75
+ "SERVICE_CONFIGURATION",
76
+ "SUBNET",
77
+ "SUBSCRIPTION",
78
+ "VIRTUAL_NETWORK",
79
+ ]
80
+
81
+ _DEFAULT_WIZ_HARDWARE_TYPES = [
82
+ # CloudResource types
83
+ "VIRTUAL_MACHINE",
84
+ "VIRTUAL_MACHINE_IMAGE",
85
+ "CONTAINER",
86
+ "CONTAINER_IMAGE",
87
+ "DB_SERVER",
88
+ # technology deploymentModels
89
+ "SERVER_APPLICATION",
90
+ "CLIENT_APPLICATION",
91
+ "VIRTUAL_APPLIANCE",
92
+ ]
7
93
 
8
94
 
9
95
  class WizVariables(metaclass=RsVariablesMeta):
@@ -23,7 +109,7 @@ class WizVariables(metaclass=RsVariablesMeta):
23
109
  wizInventoryFilterBy: RsVariableType(
24
110
  str,
25
111
  '{"projectId": ["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"], "type": ["API_GATEWAY"]}',
26
- default="""{"type": ["%s"] }""" % '","'.join(RECOMMENDED_WIZ_INVENTORY_TYPES), # type: ignore
112
+ default="""{"type": ["%s"] }""" % '","'.join(_RECOMMENDED_WIZ_INVENTORY_TYPES), # type: ignore
27
113
  ) # type: ignore
28
114
  wizAccessToken: RsVariableType(str, "", sensitive=True, required=False) # type: ignore
29
115
  wizClientId: RsVariableType(str, "", sensitive=True) # type: ignore
@@ -34,7 +120,7 @@ class WizVariables(metaclass=RsVariablesMeta):
34
120
  list,
35
121
  '["CONTAINER", "CONTAINER_IMAGE", "VIRTUAL_MACHINE", "VIRTUAL_MACHINE_IMAGE", "DB_SERVER", '
36
122
  '"CLIENT_APPLICATION", "SERVER_APPLICATION", "VIRTUAL_APPLIANCE"]',
37
- default=DEFAULT_WIZ_HARDWARE_TYPES,
123
+ default=_DEFAULT_WIZ_HARDWARE_TYPES,
38
124
  required=False,
39
125
  ) # type: ignore
40
126
  wizReportAge: RsVariableType(int, "14", default=14, required=False) # type: ignore