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,343 @@
1
+ import pytest
2
+ from unittest.mock import patch
3
+ from regscale.integrations.commercial.wizv2.issue import WizIssue
4
+ from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
5
+ from regscale.models import IssueSeverity, IssueStatus
6
+
7
+
8
+ @patch("regscale.integrations.scanner_integration.ScannerIntegration.get_assessor_id")
9
+ def test_parse_finding_control_labels(mock_get_assessor):
10
+ """Test that WizIssue correctly parses control labels from a Wiz issue."""
11
+ # Mock the assessor ID
12
+ mock_get_assessor.return_value = "test-assessor"
13
+
14
+ # Create test instance with a test plan ID
15
+ wiz_issue = WizIssue(plan_id=1)
16
+
17
+ # Sample Wiz issue data with security subcategories
18
+ test_issue = {
19
+ "id": "66013c7a-de84-4b46-a3c7-934521cb9e3b",
20
+ "sourceRule": {
21
+ "__typename": "Control",
22
+ "id": "wc-id-15",
23
+ "name": "Publicly exposed PaaS database server",
24
+ "controlDescription": "This database is exposed to the public internet.",
25
+ "resolutionRecommendation": "Limit external exposure",
26
+ "securitySubCategories": [
27
+ {
28
+ "title": "AC-4(21) Information Flow Enforcement | Physical or Logical Separation of Information Flows",
29
+ "externalId": "AC-4(21)",
30
+ "category": {"name": "AC Access Control", "framework": {"name": "NIST SP 800-53 Revision 5"}},
31
+ },
32
+ {
33
+ "title": "SC-7 Boundary Protection",
34
+ "externalId": "SC-7",
35
+ "category": {
36
+ "name": "SC System And Communications Protection",
37
+ "framework": {"name": "NIST SP 800-53 Revision 5"},
38
+ },
39
+ },
40
+ {
41
+ "title": "AC-3 Access Enforcement",
42
+ "externalId": "AC-3",
43
+ "category": {"name": "AC Access Control", "framework": {"name": "NIST SP 800-53 Revision 5"}},
44
+ },
45
+ ],
46
+ },
47
+ "severity": "HIGH",
48
+ "status": "OPEN",
49
+ "createdAt": "2024-02-21T08:22:22.696689Z",
50
+ "entitySnapshot": {
51
+ "id": "474c2882-b98a-5b2b-b2f5-40f6cbdbf04f",
52
+ "type": "DB_SERVER",
53
+ "name": "releasetest-sqlserver",
54
+ },
55
+ }
56
+
57
+ # Parse the finding
58
+ finding = wiz_issue.parse_finding(test_issue, WizVulnerabilityType.ISSUE)
59
+
60
+ # Expected control labels based on NIST SP 800-53 controls
61
+ expected_control_labels = ["ac-4.21", "sc-7", "ac-3"]
62
+
63
+ # Verify the finding attributes
64
+ assert finding is not None
65
+ assert finding.control_labels == expected_control_labels
66
+ assert finding.severity == IssueSeverity.High
67
+ assert finding.title == "Publicly exposed PaaS database server"
68
+ assert finding.asset_identifier == "474c2882-b98a-5b2b-b2f5-40f6cbdbf04f"
69
+ assert finding.external_id == "66013c7a-de84-4b46-a3c7-934521cb9e3b"
70
+ assert finding.plugin_name == "Wiz-Control-AC"
71
+ assert finding.source_rule_id == "Control-wc-id-15"
72
+ assert finding.vulnerability_type == WizVulnerabilityType.ISSUE.value
73
+
74
+
75
+ @patch("regscale.integrations.scanner_integration.ScannerIntegration.get_assessor_id")
76
+ def test_parse_finding_no_security_subcategories(mock_get_assessor):
77
+ """Test that WizIssue handles issues without security subcategories."""
78
+ # Mock the assessor ID
79
+ mock_get_assessor.return_value = "test-assessor"
80
+
81
+ wiz_issue = WizIssue(plan_id=1)
82
+
83
+ test_issue = {
84
+ "id": "test-id",
85
+ "sourceRule": {
86
+ "__typename": "Control",
87
+ "id": "wc-id-1",
88
+ "name": "Test security configuration",
89
+ "controlDescription": "Test description",
90
+ "resolutionRecommendation": "Test recommendation",
91
+ "securitySubCategories": [],
92
+ },
93
+ "severity": "MEDIUM",
94
+ "status": "OPEN",
95
+ "createdAt": "2024-02-21T08:22:22Z",
96
+ "entitySnapshot": {"id": "test-entity-id", "type": "DB_SERVER", "name": "test-server"},
97
+ }
98
+
99
+ finding = wiz_issue.parse_finding(test_issue, WizVulnerabilityType.VULNERABILITY)
100
+
101
+ assert finding is not None
102
+ assert finding.control_labels == []
103
+ assert finding.severity == IssueSeverity.Moderate
104
+ assert finding.title == "Test security configuration"
105
+ assert finding.plugin_name == "Wiz-Control-Test"
106
+ assert finding.source_rule_id == "Control-wc-id-1"
107
+ assert finding.vulnerability_type == WizVulnerabilityType.VULNERABILITY.value
108
+
109
+
110
+ @patch("regscale.integrations.scanner_integration.ScannerIntegration.get_assessor_id")
111
+ def test_parse_finding_non_nist_controls(mock_get_assessor):
112
+ """Test that WizIssue correctly handles non-NIST controls."""
113
+ # Mock the assessor ID
114
+ mock_get_assessor.return_value = "test-assessor"
115
+
116
+ wiz_issue = WizIssue(plan_id=1)
117
+
118
+ test_issue = {
119
+ "id": "test-id",
120
+ "sourceRule": {
121
+ "__typename": "Control",
122
+ "id": "wc-id-1",
123
+ "name": "Database exposed to internet",
124
+ "controlDescription": "Test description",
125
+ "resolutionRecommendation": "Test recommendation",
126
+ "securitySubCategories": [
127
+ {
128
+ "title": "8.12 Data leakage prevention",
129
+ "externalId": "8.12",
130
+ "category": {"name": "Technological controls", "framework": {"name": "ISO/IEC 27001-2022"}},
131
+ }
132
+ ],
133
+ },
134
+ "severity": "LOW",
135
+ "status": "OPEN",
136
+ "createdAt": "2024-02-21T08:22:22Z",
137
+ "entitySnapshot": {"id": "test-entity-id", "type": "DB_SERVER", "name": "test-server"},
138
+ }
139
+
140
+ finding = wiz_issue.parse_finding(test_issue, WizVulnerabilityType.HOST_FINDING)
141
+
142
+ assert finding is not None
143
+ assert finding.control_labels == []
144
+ assert finding.severity == IssueSeverity.Low
145
+ assert finding.title == "Database exposed to internet"
146
+ assert finding.plugin_name == "Wiz-Control-Database"
147
+ assert finding.source_rule_id == "Control-wc-id-1"
148
+ assert finding.vulnerability_type == WizVulnerabilityType.HOST_FINDING.value
149
+
150
+
151
+ @patch("regscale.integrations.scanner_integration.ScannerIntegration.get_assessor_id")
152
+ def test_parse_finding_cloud_config_rule(mock_get_assessor):
153
+ """Test that WizIssue correctly parses a cloud configuration rule."""
154
+ # Mock the assessor ID
155
+ mock_get_assessor.return_value = "test-assessor"
156
+
157
+ wiz_issue = WizIssue(plan_id=1)
158
+
159
+ test_issue = {
160
+ "id": "test-id",
161
+ "sourceRule": {
162
+ "__typename": "CloudConfigurationRule",
163
+ "id": "ffcade8d-7961-4b71-93d3-0098d7e4b3e1",
164
+ "name": "App Configuration public network access should be disabled",
165
+ "cloudConfigurationRuleDescription": "Test description",
166
+ "remediationInstructions": "Test remediation",
167
+ "serviceType": "Azure",
168
+ },
169
+ "severity": "HIGH",
170
+ "status": "OPEN",
171
+ "createdAt": "2024-02-21T08:22:22Z",
172
+ "entitySnapshot": {"id": "test-entity-id", "type": "SERVICE_CONFIGURATION", "name": "test-config"},
173
+ }
174
+
175
+ finding = wiz_issue.parse_finding(test_issue, WizVulnerabilityType.CONFIGURATION)
176
+
177
+ assert finding is not None
178
+ assert finding.plugin_name == "Wiz-Azure-AppConfiguration"
179
+ assert finding.severity == IssueSeverity.High
180
+ assert finding.title == "App Configuration public network access should be disabled"
181
+ assert finding.source_rule_id == "CloudConfigurationRule-Azure-ffcade8d-7961-4b71-93d3-0098d7e4b3e1"
182
+ assert finding.vulnerability_type == WizVulnerabilityType.CONFIGURATION.value
183
+
184
+
185
+ @patch("regscale.integrations.scanner_integration.ScannerIntegration.get_assessor_id")
186
+ def test_parse_finding_cloud_event(mock_get_assessor):
187
+ """Test that WizIssue correctly parses a cloud event rule."""
188
+ # Mock the assessor ID
189
+ mock_get_assessor.return_value = "test-assessor"
190
+
191
+ wiz_issue = WizIssue(plan_id=1)
192
+
193
+ test_issue = {
194
+ "id": "test-id",
195
+ "sourceRule": {
196
+ "__typename": "CloudEventRule",
197
+ "id": "event-1",
198
+ "name": "Suspicious activity detection in cloud resources",
199
+ "cloudEventRuleDescription": "Test description",
200
+ "sourceType": "test",
201
+ "type": "test",
202
+ "serviceType": "AWS",
203
+ },
204
+ "severity": "LOW",
205
+ "status": "OPEN",
206
+ "createdAt": "2024-02-21T08:22:22Z",
207
+ "entitySnapshot": {"id": "test-entity-id", "type": "CLOUD_ORGANIZATION", "name": "test-org"},
208
+ }
209
+
210
+ finding = wiz_issue.parse_finding(test_issue, WizVulnerabilityType.DATA_FINDING)
211
+
212
+ assert finding is not None
213
+ assert finding.plugin_name == "Wiz-AWS-SuspiciousActivity"
214
+ assert finding.severity == IssueSeverity.Low
215
+ assert finding.title == "Suspicious activity detection in cloud resources"
216
+ assert finding.source_rule_id == "CloudEventRule-AWS-event-1"
217
+ assert finding.vulnerability_type == WizVulnerabilityType.DATA_FINDING.value
218
+
219
+
220
+ @patch("regscale.integrations.scanner_integration.ScannerIntegration.get_assessor_id")
221
+ def test_title_based_consolidation(mock_get_assessor):
222
+ """Test that issues with same title are consolidated regardless of asset."""
223
+ # Mock the assessor ID
224
+ mock_get_assessor.return_value = "test-assessor"
225
+
226
+ wiz_issue = WizIssue(plan_id=1)
227
+
228
+ # Create two issues with same title but different assets
229
+ issue1 = {
230
+ "id": "issue-576",
231
+ "sourceRule": {
232
+ "__typename": "CloudConfigurationRule",
233
+ "id": "rule-app-config",
234
+ "name": "App Configuration public network access should be disabled",
235
+ "serviceType": "Azure",
236
+ "resolutionRecommendation": "Disable public network access",
237
+ },
238
+ "severity": "HIGH",
239
+ "status": "OPEN",
240
+ "createdAt": "2024-01-15T10:00:00Z",
241
+ "entitySnapshot": {
242
+ "id": "asset-001",
243
+ "providerId": "/subscriptions/sub1/resourceGroups/rg1/providers/Microsoft.AppConfiguration/configurationStores/store1",
244
+ "type": "SERVICE_CONFIGURATION",
245
+ "name": "store1",
246
+ },
247
+ }
248
+
249
+ issue2 = {
250
+ "id": "issue-663",
251
+ "sourceRule": {
252
+ "__typename": "CloudConfigurationRule",
253
+ "id": "rule-app-config",
254
+ "name": "App Configuration public network access should be disabled",
255
+ "serviceType": "Azure",
256
+ "resolutionRecommendation": "Disable public network access",
257
+ },
258
+ "severity": "MEDIUM",
259
+ "status": "RESOLVED",
260
+ "createdAt": "2024-01-20T10:00:00Z",
261
+ "entitySnapshot": {
262
+ "id": "asset-002",
263
+ "providerId": "/subscriptions/sub1/resourceGroups/rg2/providers/Microsoft.AppConfiguration/configurationStores/store2",
264
+ "type": "SERVICE_CONFIGURATION",
265
+ "name": "store2",
266
+ },
267
+ }
268
+
269
+ # Test grouping - should group by title only
270
+ groups = wiz_issue._group_issues_for_consolidation([issue1, issue2])
271
+
272
+ # Should have only 1 group with the same title
273
+ assert len(groups) == 1, f"Expected 1 group, got {len(groups)}"
274
+
275
+ group_key = "App Configuration public network access should be disabled"
276
+ assert group_key in groups, f"Expected to find '{group_key}' in groups"
277
+ assert len(groups[group_key]) == 2, f"Expected 2 issues in group, got {len(groups[group_key])}"
278
+
279
+ # Test consolidation
280
+ consolidated = wiz_issue._create_consolidated_finding(groups[group_key], WizVulnerabilityType.CONFIGURATION)
281
+
282
+ # Verify consolidation properties
283
+ assert consolidated.title == "App Configuration public network access should be disabled"
284
+ assert consolidated.severity == IssueSeverity.High # Should use highest severity
285
+ assert consolidated.status == IssueStatus.Open # Should use most urgent status
286
+ assert consolidated.asset_identifier == "asset-001" # Primary asset
287
+
288
+ # Should have both provider IDs
289
+ provider_ids = consolidated.issue_asset_identifier_value.split("\n")
290
+ assert len(provider_ids) == 2, f"Expected 2 provider IDs, got {len(provider_ids)}"
291
+ assert "/configurationStores/store1" in provider_ids[0]
292
+ assert "/configurationStores/store2" in provider_ids[1]
293
+
294
+
295
+ @patch("regscale.integrations.scanner_integration.ScannerIntegration.get_assessor_id")
296
+ def test_consolidation_priority_rules(mock_get_assessor):
297
+ """Test that consolidation correctly applies priority rules for severity and status."""
298
+ mock_get_assessor.return_value = "test-assessor"
299
+
300
+ wiz_issue = WizIssue(plan_id=1)
301
+
302
+ # Create issues with different severities and statuses
303
+ issues = [
304
+ {
305
+ "id": "issue-1",
306
+ "sourceRule": {"name": "Test Rule", "__typename": "Control"},
307
+ "severity": "LOW",
308
+ "status": "RESOLVED",
309
+ "createdAt": "2024-01-20T10:00:00Z",
310
+ "entitySnapshot": {"id": "asset-1", "providerId": "provider-1"},
311
+ },
312
+ {
313
+ "id": "issue-2",
314
+ "sourceRule": {"name": "Test Rule", "__typename": "Control"},
315
+ "severity": "CRITICAL", # Highest severity
316
+ "status": "RESOLVED",
317
+ "createdAt": "2024-01-15T10:00:00Z", # Earlier date
318
+ "entitySnapshot": {"id": "asset-2", "providerId": "provider-2"},
319
+ },
320
+ {
321
+ "id": "issue-3",
322
+ "sourceRule": {"name": "Test Rule", "__typename": "Control"},
323
+ "severity": "MEDIUM",
324
+ "status": "OPEN", # Most urgent status
325
+ "createdAt": "2024-01-18T10:00:00Z",
326
+ "entitySnapshot": {"id": "asset-3", "providerId": "provider-3"},
327
+ },
328
+ ]
329
+
330
+ consolidated = wiz_issue._create_consolidated_finding(issues, WizVulnerabilityType.ISSUE)
331
+
332
+ # Should use CRITICAL severity (highest)
333
+ assert consolidated.severity == IssueSeverity.Critical
334
+
335
+ # Should use OPEN status (most urgent)
336
+ assert consolidated.status == IssueStatus.Open
337
+
338
+ # Should use earliest date
339
+ assert "2024-01-15" in consolidated.date_created
340
+
341
+ # Should have all 3 provider IDs
342
+ provider_ids = consolidated.issue_asset_identifier_value.split("\n")
343
+ assert len(provider_ids) == 3