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,327 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Tests for Microsoft Defender constants"""
4
+ import pytest
5
+
6
+ from regscale.integrations.commercial.microsoft_defender import defender_constants
7
+
8
+
9
+ class TestDefenderConstants:
10
+ """Test class for Microsoft Defender constants"""
11
+
12
+ def test_date_format_constant(self):
13
+ """Test DATE_FORMAT constant exists and has correct value"""
14
+ assert hasattr(defender_constants, "DATE_FORMAT")
15
+ assert defender_constants.DATE_FORMAT == "%Y-%m-%dT%H:%M:%S"
16
+
17
+ def test_identification_type_constant(self):
18
+ """Test IDENTIFICATION_TYPE constant exists and has correct value"""
19
+ assert hasattr(defender_constants, "IDENTIFICATION_TYPE")
20
+ assert defender_constants.IDENTIFICATION_TYPE == "Vulnerability Assessment"
21
+
22
+ def test_cloud_recs_constant(self):
23
+ """Test CLOUD_RECS constant exists and has correct value"""
24
+ assert hasattr(defender_constants, "CLOUD_RECS")
25
+ assert defender_constants.CLOUD_RECS == "Microsoft Defender for Cloud Recommendation"
26
+
27
+ def test_app_json_constant(self):
28
+ """Test APP_JSON constant exists and has correct value"""
29
+ assert hasattr(defender_constants, "APP_JSON")
30
+ assert defender_constants.APP_JSON == "application/json"
31
+
32
+ def test_afd_endpoints_constant(self):
33
+ """Test AFD_ENDPOINTS constant exists and has correct value"""
34
+ assert hasattr(defender_constants, "AFD_ENDPOINTS")
35
+ assert defender_constants.AFD_ENDPOINTS == "microsoft.cdn/profiles/afdendpoints"
36
+
37
+ def test_resources_query_constant(self):
38
+ """Test RESOURCES_QUERY constant exists and contains expected content"""
39
+ assert hasattr(defender_constants, "RESOURCES_QUERY")
40
+ assert isinstance(defender_constants.RESOURCES_QUERY, str)
41
+ assert "resources" in defender_constants.RESOURCES_QUERY
42
+ assert "subscriptionId" in defender_constants.RESOURCES_QUERY
43
+ assert "{SUBSCRIPTION_ID}" in defender_constants.RESOURCES_QUERY
44
+ assert "resourceName = name" in defender_constants.RESOURCES_QUERY
45
+ assert "resourceType = type" in defender_constants.RESOURCES_QUERY
46
+ assert "resourceLocation = location" in defender_constants.RESOURCES_QUERY
47
+ assert "resourceGroup = resourceGroup" in defender_constants.RESOURCES_QUERY
48
+ assert "resourceId = id" in defender_constants.RESOURCES_QUERY
49
+
50
+ def test_container_scan_query_constant(self):
51
+ """Test CONTAINER_SCAN_QUERY constant exists and contains expected content"""
52
+ assert hasattr(defender_constants, "CONTAINER_SCAN_QUERY")
53
+ assert isinstance(defender_constants.CONTAINER_SCAN_QUERY, str)
54
+ assert "securityresources" in defender_constants.CONTAINER_SCAN_QUERY
55
+ assert "microsoft.security/assessments" in defender_constants.CONTAINER_SCAN_QUERY
56
+ assert "{RESOURCE_GROUP}" in defender_constants.CONTAINER_SCAN_QUERY
57
+ assert "subassessments" in defender_constants.CONTAINER_SCAN_QUERY
58
+ assert "severity" in defender_constants.CONTAINER_SCAN_QUERY
59
+
60
+ def test_db_scan_query_constant(self):
61
+ """Test DB_SCAN_QUERY constant exists and contains expected content"""
62
+ assert hasattr(defender_constants, "DB_SCAN_QUERY")
63
+ assert isinstance(defender_constants.DB_SCAN_QUERY, str)
64
+ assert "securityresources" in defender_constants.DB_SCAN_QUERY
65
+ assert "microsoft.security/assessments/subassessments" in defender_constants.DB_SCAN_QUERY
66
+ assert "{ASSESSMENT_KEY}" in defender_constants.DB_SCAN_QUERY
67
+ assert "{SUBSCRIPTION_ID}" in defender_constants.DB_SCAN_QUERY
68
+ assert "Unhealthy" in defender_constants.DB_SCAN_QUERY
69
+
70
+ def test_resources_query_formatting(self):
71
+ """Test that RESOURCES_QUERY can be formatted with subscription ID"""
72
+ subscription_id = "test-subscription-123"
73
+ formatted_query = defender_constants.RESOURCES_QUERY.format(SUBSCRIPTION_ID=subscription_id)
74
+
75
+ assert subscription_id in formatted_query
76
+ assert "{SUBSCRIPTION_ID}" not in formatted_query
77
+
78
+ def test_container_scan_query_formatting(self):
79
+ """Test that CONTAINER_SCAN_QUERY can be formatted with resource group"""
80
+ resource_group = "test-resource-group"
81
+ formatted_query = defender_constants.CONTAINER_SCAN_QUERY.format(RESOURCE_GROUP=resource_group)
82
+
83
+ assert resource_group in formatted_query
84
+ assert "{RESOURCE_GROUP}" not in formatted_query
85
+
86
+ def test_db_scan_query_formatting(self):
87
+ """Test that DB_SCAN_QUERY can be formatted with assessment key and subscription ID"""
88
+ assessment_key = "test-assessment-key"
89
+ subscription_id = "test-subscription-123"
90
+ formatted_query = defender_constants.DB_SCAN_QUERY.format(
91
+ ASSESSMENT_KEY=assessment_key, SUBSCRIPTION_ID=subscription_id
92
+ )
93
+
94
+ assert assessment_key in formatted_query
95
+ assert subscription_id in formatted_query
96
+ assert "{ASSESSMENT_KEY}" not in formatted_query
97
+ assert "{SUBSCRIPTION_ID}" not in formatted_query
98
+
99
+ def test_all_constants_are_strings(self):
100
+ """Test that all constants are strings"""
101
+ constants_to_check = [
102
+ "DATE_FORMAT",
103
+ "IDENTIFICATION_TYPE",
104
+ "CLOUD_RECS",
105
+ "APP_JSON",
106
+ "AFD_ENDPOINTS",
107
+ "RESOURCES_QUERY",
108
+ "CONTAINER_SCAN_QUERY",
109
+ "DB_SCAN_QUERY",
110
+ ]
111
+
112
+ for constant_name in constants_to_check:
113
+ constant_value = getattr(defender_constants, constant_name)
114
+ assert isinstance(constant_value, str), f"{constant_name} should be a string"
115
+
116
+ def test_query_constants_multiline(self):
117
+ """Test that query constants are properly formatted multiline strings"""
118
+ query_constants = ["RESOURCES_QUERY", "CONTAINER_SCAN_QUERY", "DB_SCAN_QUERY"]
119
+
120
+ for constant_name in query_constants:
121
+ query = getattr(defender_constants, constant_name)
122
+ # Should contain newlines indicating multiline format
123
+ assert "\n" in query, f"{constant_name} should be a multiline string"
124
+ # Should not start or end with excessive whitespace
125
+ assert not query.startswith("\n\n"), f"{constant_name} should not start with excessive newlines"
126
+ assert not query.endswith("\n\n\n"), f"{constant_name} should not end with excessive newlines"
127
+
128
+ def test_resources_query_kusto_syntax(self):
129
+ """Test that RESOURCES_QUERY contains valid Kusto query syntax"""
130
+ query = defender_constants.RESOURCES_QUERY
131
+
132
+ # Check for key Kusto operators and functions
133
+ assert "extend" in query
134
+ assert "case(" in query
135
+ assert "project" in query
136
+ assert "tostring(" in query
137
+ # Check for proper field references
138
+ assert "resourceType =~" in query
139
+ assert "properties" in query
140
+
141
+ def test_container_scan_query_kusto_syntax(self):
142
+ """Test that CONTAINER_SCAN_QUERY contains valid Kusto query syntax"""
143
+ query = defender_constants.CONTAINER_SCAN_QUERY
144
+
145
+ # Check for key Kusto operators
146
+ assert "summarize" in query
147
+ assert "join" in query
148
+ assert "kind=inner" in query
149
+ assert "extract(" in query
150
+ assert "where" in query
151
+ assert "parse_json(" in query
152
+ assert "order by" in query
153
+
154
+ def test_db_scan_query_kusto_syntax(self):
155
+ """Test that DB_SCAN_QUERY contains valid Kusto query syntax"""
156
+ query = defender_constants.DB_SCAN_QUERY
157
+
158
+ # Check for key Kusto operators and functions
159
+ assert "extend" in query
160
+ assert "extract(" in query
161
+ assert "strcat(" in query
162
+ assert "iff(" in query
163
+ assert "project" in query
164
+ assert "where" in query
165
+
166
+ # ==============================
167
+ # NEW TESTS FOR ENTRA CONSTANTS
168
+ # ==============================
169
+
170
+ def test_entra_endpoints_constant(self):
171
+ """Test ENTRA_ENDPOINTS constant exists and has correct structure"""
172
+ assert hasattr(defender_constants, "ENTRA_ENDPOINTS")
173
+ entra_endpoints = defender_constants.ENTRA_ENDPOINTS
174
+ assert isinstance(entra_endpoints, dict)
175
+ assert len(entra_endpoints) > 0
176
+
177
+ # Test a few key endpoints exist
178
+ expected_endpoints = [
179
+ "users",
180
+ "guest_users",
181
+ "groups_and_members",
182
+ "security_groups",
183
+ "role_assignments",
184
+ "role_definitions",
185
+ "pim_assignments",
186
+ "pim_eligibility",
187
+ "conditional_access",
188
+ "auth_methods_policy",
189
+ "user_mfa_registration",
190
+ "mfa_registered_users",
191
+ "sign_in_logs",
192
+ "directory_audits",
193
+ "provisioning_logs",
194
+ "access_review_definitions",
195
+ "access_review_instances",
196
+ "access_review_decisions",
197
+ ]
198
+
199
+ for endpoint in expected_endpoints:
200
+ assert endpoint in entra_endpoints, f"Missing endpoint: {endpoint}"
201
+
202
+ def test_entra_endpoints_url_format(self):
203
+ """Test ENTRA_ENDPOINTS URLs have correct format"""
204
+ entra_endpoints = defender_constants.ENTRA_ENDPOINTS
205
+ for key, url in entra_endpoints.items():
206
+ assert isinstance(url, str), f"URL for {key} should be string"
207
+ assert url.startswith("/"), f"URL for {key} should start with forward slash (relative URL)"
208
+ assert (
209
+ "?" in url or "$" in url or url.count("/") > 1
210
+ ), f"URL for {key} should contain query parameters or path segments"
211
+
212
+ def test_evidence_to_controls_mapping_constant(self):
213
+ """Test EVIDENCE_TO_CONTROLS_MAPPING constant exists and has correct structure"""
214
+ assert hasattr(defender_constants, "EVIDENCE_TO_CONTROLS_MAPPING")
215
+ mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
216
+ assert isinstance(mapping, dict)
217
+ assert len(mapping) > 0
218
+
219
+ # Test each evidence type maps to a list of control IDs
220
+ for evidence_type, controls in mapping.items():
221
+ assert isinstance(evidence_type, str), f"Evidence type should be string: {evidence_type}"
222
+ assert isinstance(controls, list), f"Controls should be list for {evidence_type}"
223
+ assert len(controls) > 0, f"Controls list should not be empty for {evidence_type}"
224
+
225
+ # Test each control ID is a string
226
+ for control in controls:
227
+ assert isinstance(control, str), f"Control ID should be string: {control} for {evidence_type}"
228
+
229
+ def test_evidence_to_controls_mapping_coverage(self):
230
+ """Test EVIDENCE_TO_CONTROLS_MAPPING covers expected evidence types"""
231
+ mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
232
+ expected_evidence_types = [
233
+ "users",
234
+ "users_delta",
235
+ "guest_users",
236
+ "groups_and_members",
237
+ "security_groups",
238
+ "role_assignments",
239
+ "role_definitions",
240
+ "pim_assignments",
241
+ "pim_eligibility",
242
+ "conditional_access",
243
+ "auth_methods_policy",
244
+ "user_mfa_registration",
245
+ "mfa_registered_users",
246
+ "sign_in_logs",
247
+ "directory_audits",
248
+ "provisioning_logs",
249
+ "access_review_definitions",
250
+ ]
251
+
252
+ for evidence_type in expected_evidence_types:
253
+ assert evidence_type in mapping, f"Missing evidence type mapping: {evidence_type}"
254
+
255
+ def test_endpoint_parameters_mapping_constant(self):
256
+ """Test ENDPOINT_PARAMETERS_MAPPING constant exists and has correct structure"""
257
+ if hasattr(defender_constants, "ENDPOINT_PARAMETERS_MAPPING"):
258
+ mapping = defender_constants.ENDPOINT_PARAMETERS_MAPPING
259
+ assert isinstance(mapping, dict)
260
+
261
+ # Test that certain endpoints requiring parameters are included
262
+ for endpoint, params in mapping.items():
263
+ assert isinstance(params, list), f"Parameters should be list for {endpoint}"
264
+ for param in params:
265
+ assert isinstance(param, str), f"Parameter should be string: {param} for {endpoint}"
266
+
267
+ def test_specific_entra_endpoint_formats(self):
268
+ """Test specific endpoint URLs have expected formats"""
269
+ entra_endpoints = defender_constants.ENTRA_ENDPOINTS
270
+
271
+ # Test users endpoint
272
+ if "users" in entra_endpoints:
273
+ users_url = entra_endpoints["users"]
274
+ assert "$select=" in users_url or "$" in users_url
275
+
276
+ # Test sign-in logs endpoint
277
+ if "sign_in_logs" in entra_endpoints:
278
+ signin_url = entra_endpoints["sign_in_logs"]
279
+ assert "auditLogs/signIns" in signin_url
280
+
281
+ # Test groups and members endpoint
282
+ if "groups_and_members" in entra_endpoints:
283
+ groups_url = entra_endpoints["groups_and_members"]
284
+ assert "groups" in groups_url
285
+
286
+ def test_control_mappings_have_appropriate_controls(self):
287
+ """Test that evidence types have appropriate control mappings"""
288
+ mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
289
+
290
+ # Test that user-related evidence maps to access control (AC) controls
291
+ user_evidence_types = ["users", "guest_users", "users_delta"]
292
+ for evidence_type in user_evidence_types:
293
+ if evidence_type in mapping:
294
+ controls = mapping[evidence_type]
295
+ # Should have at least some controls
296
+ assert len(controls) > 0, f"User evidence {evidence_type} should have controls"
297
+
298
+ # Test that authentication evidence maps to appropriate controls
299
+ auth_evidence_types = ["user_mfa_registration", "mfa_registered_users", "auth_methods_policy"]
300
+ for evidence_type in auth_evidence_types:
301
+ if evidence_type in mapping:
302
+ controls = mapping[evidence_type]
303
+ # Should have at least some controls
304
+ assert len(controls) > 0, f"Auth evidence {evidence_type} should have controls"
305
+
306
+ def test_no_duplicate_controls_in_mappings(self):
307
+ """Test that there are no duplicate controls in evidence mappings"""
308
+ mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
309
+ for evidence_type, controls in mapping.items():
310
+ unique_controls = set(controls)
311
+ assert len(unique_controls) == len(controls), f"Duplicate controls found in {evidence_type}: {controls}"
312
+
313
+ def test_entra_constants_not_empty(self):
314
+ """Test that all Entra constants are properly initialized and not empty"""
315
+ # ENTRA_ENDPOINTS should exist and not be empty
316
+ assert hasattr(defender_constants, "ENTRA_ENDPOINTS")
317
+ entra_endpoints = defender_constants.ENTRA_ENDPOINTS
318
+ assert entra_endpoints is not None
319
+ assert len(entra_endpoints) > 0
320
+
321
+ # EVIDENCE_TO_CONTROLS_MAPPING should exist and not be empty
322
+ assert hasattr(defender_constants, "EVIDENCE_TO_CONTROLS_MAPPING")
323
+ evidence_mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
324
+ assert evidence_mapping is not None
325
+ assert len(evidence_mapping) > 0
326
+
327
+ # Note: EVIDENCE_TYPE_MAPPINGS doesn't exist in current implementation