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
@@ -1,75 +1,59 @@
1
1
  """AWS networking resource collectors."""
2
2
 
3
- from typing import Dict, List, Any
3
+ from typing import Dict, List, Any, Optional
4
4
 
5
+ from regscale.integrations.commercial.aws.inventory.resources.vpc import VPCCollector
5
6
  from ..base import BaseCollector
6
7
 
7
8
 
8
9
  class NetworkingCollector(BaseCollector):
9
10
  """Collector for AWS networking resources."""
10
11
 
11
- def get_vpcs(self) -> List[Dict[str, Any]]:
12
+ def __init__(
13
+ self,
14
+ session: Any,
15
+ region: str,
16
+ account_id: Optional[str] = None,
17
+ tags: Optional[Dict[str, str]] = None,
18
+ enabled_services: Optional[Dict[str, bool]] = None,
19
+ ):
12
20
  """
13
- Get information about VPCs.
21
+ Initialize networking collector.
14
22
 
15
- :return: List of VPC information
16
- :rtype: List[Dict[str, Any]]
23
+ :param session: AWS session to use for API calls
24
+ :param str region: AWS region to collect from
25
+ :param str account_id: Optional AWS account ID to filter resources
26
+ :param dict tags: Optional tags to filter resources (key-value pairs)
27
+ :param dict enabled_services: Optional dict of service names to boolean flags for enabling/disabling collection
17
28
  """
18
- vpcs = []
19
- try:
20
- ec2 = self._get_client("ec2")
21
- paginator = ec2.get_paginator("describe_vpcs")
29
+ super().__init__(session, region)
30
+ self.account_id = account_id
31
+ self.tags = tags or {}
32
+ self.enabled_services = enabled_services or {}
22
33
 
23
- for page in paginator.paginate():
24
- for vpc in page.get("Vpcs", []):
25
- # Get subnets for this VPC
26
- subnets = []
27
- subnet_paginator = ec2.get_paginator("describe_subnets")
28
- for subnet_page in subnet_paginator.paginate(
29
- Filters=[{"Name": "vpc-id", "Values": [vpc["VpcId"]]}]
30
- ):
31
- subnets.extend(subnet_page.get("Subnets", []))
32
-
33
- # Get security groups for this VPC
34
- security_groups = []
35
- sg_paginator = ec2.get_paginator("describe_security_groups")
36
- for sg_page in sg_paginator.paginate(Filters=[{"Name": "vpc-id", "Values": [vpc["VpcId"]]}]):
37
- security_groups.extend(sg_page.get("SecurityGroups", []))
38
-
39
- vpcs.append(
40
- {
41
- "Region": self.region,
42
- "VpcId": vpc.get("VpcId"),
43
- "CidrBlock": vpc.get("CidrBlock"),
44
- "State": vpc.get("State"),
45
- "IsDefault": vpc.get("IsDefault"),
46
- "Tags": vpc.get("Tags", []),
47
- "Subnets": [
48
- {
49
- "SubnetId": subnet.get("SubnetId"),
50
- "CidrBlock": subnet.get("CidrBlock"),
51
- "AvailabilityZone": subnet.get("AvailabilityZone"),
52
- "State": subnet.get("State"),
53
- "Tags": subnet.get("Tags", []),
54
- }
55
- for subnet in subnets
56
- ],
57
- "SecurityGroups": [
58
- {
59
- "GroupId": sg.get("GroupId"),
60
- "GroupName": sg.get("GroupName"),
61
- "Description": sg.get("Description"),
62
- "IpPermissions": sg.get("IpPermissions", []),
63
- "IpPermissionsEgress": sg.get("IpPermissionsEgress", []),
64
- "Tags": sg.get("Tags", []),
65
- }
66
- for sg in security_groups
67
- ],
68
- }
69
- )
34
+ def get_vpcs(self) -> Dict[str, Any]:
35
+ """
36
+ Get information about VPC resources.
37
+
38
+ :return: Dictionary containing VPC resource information
39
+ :rtype: Dict[str, Any]
40
+ """
41
+ try:
42
+ vpc_collector = VPCCollector(self.session, self.region, self.account_id, self.tags)
43
+ return vpc_collector.collect()
70
44
  except Exception as e:
71
- self._handle_error(e, "VPCs")
72
- return vpcs
45
+ self._handle_error(e, "VPC resources")
46
+ return {
47
+ "VPCs": [],
48
+ "Subnets": [],
49
+ "SecurityGroups": [],
50
+ "NetworkACLs": [],
51
+ "RouteTables": [],
52
+ "InternetGateways": [],
53
+ "NATGateways": [],
54
+ "VPCEndpoints": [],
55
+ "VPCPeeringConnections": [],
56
+ }
73
57
 
74
58
  def get_elastic_ips(self) -> List[Dict[str, Any]]:
75
59
  """
@@ -84,6 +68,11 @@ class NetworkingCollector(BaseCollector):
84
68
  addresses = ec2.describe_addresses().get("Addresses", [])
85
69
 
86
70
  for addr in addresses:
71
+ # Filter by tags if specified
72
+ eip_tags = self._convert_tags_to_dict(addr.get("Tags", []))
73
+ if self.tags and not self._matches_tags(eip_tags):
74
+ continue
75
+
87
76
  eips.append(
88
77
  {
89
78
  "Region": self.region,
@@ -124,6 +113,7 @@ class NetworkingCollector(BaseCollector):
124
113
  {
125
114
  "Region": self.region,
126
115
  "LoadBalancerName": lb.get("LoadBalancerName"),
116
+ "LoadBalancerArn": lb.get("LoadBalancerArn"),
127
117
  "DNSName": lb.get("DNSName"),
128
118
  "Type": lb.get("Type"),
129
119
  "Scheme": lb.get("Scheme"),
@@ -131,6 +121,7 @@ class NetworkingCollector(BaseCollector):
131
121
  "State": lb.get("State", {}).get("Code"),
132
122
  "AvailabilityZones": lb.get("AvailabilityZones", []),
133
123
  "SecurityGroups": lb.get("SecurityGroups", []),
124
+ "Listeners": lb.get("Listeners", []),
134
125
  "TargetGroups": [
135
126
  {
136
127
  "TargetGroupName": tg.get("TargetGroupName"),
@@ -237,17 +228,349 @@ class NetworkingCollector(BaseCollector):
237
228
  self._handle_error(e, "Route53 zones")
238
229
  return route53_info
239
230
 
231
+ def get_direct_connect_connections(self) -> List[Dict[str, Any]]:
232
+ """
233
+ Get information about AWS Direct Connect connections.
234
+
235
+ :return: List of Direct Connect connection information
236
+ :rtype: List[Dict[str, Any]]
237
+ """
238
+ connections = []
239
+ try:
240
+ dx_client = self._get_client("directconnect")
241
+ response = dx_client.describe_connections()
242
+
243
+ for conn in response.get("connections", []):
244
+ conn_arn = (
245
+ f"arn:aws:directconnect:{self.region}:{conn.get('ownerAccount', '')}:"
246
+ f"dxcon/{conn.get('connectionId')}"
247
+ )
248
+
249
+ if not self._matches_account(conn_arn):
250
+ continue
251
+
252
+ if not self._matches_tags(conn.get("tags", [])):
253
+ continue
254
+
255
+ connections.append(
256
+ {
257
+ "Region": self.region,
258
+ "ConnectionId": conn.get("connectionId"),
259
+ "ConnectionName": conn.get("connectionName"),
260
+ "ConnectionState": conn.get("connectionState"),
261
+ "Bandwidth": conn.get("bandwidth"),
262
+ "Location": conn.get("location"),
263
+ "OwnerAccount": conn.get("ownerAccount"),
264
+ "Tags": conn.get("tags", []),
265
+ }
266
+ )
267
+ except Exception as e:
268
+ self._handle_error(e, "Direct Connect connections")
269
+ return connections
270
+
271
+ def get_transit_gateways(self) -> List[Dict[str, Any]]:
272
+ """
273
+ Get information about Transit Gateways.
274
+
275
+ :return: List of Transit Gateway information
276
+ :rtype: List[Dict[str, Any]]
277
+ """
278
+ gateways = []
279
+ try:
280
+ ec2_client = self._get_client("ec2")
281
+ paginator = ec2_client.get_paginator("describe_transit_gateways")
282
+
283
+ for page in paginator.paginate():
284
+ for tgw in page.get("TransitGateways", []):
285
+ tgw_arn = tgw.get("TransitGatewayArn", "")
286
+
287
+ if not self._matches_account(tgw_arn):
288
+ continue
289
+
290
+ if not self._matches_tags(tgw.get("Tags", [])):
291
+ continue
292
+
293
+ gateways.append(
294
+ {
295
+ "Region": self.region,
296
+ "TransitGatewayId": tgw.get("TransitGatewayId"),
297
+ "TransitGatewayArn": tgw_arn,
298
+ "State": tgw.get("State"),
299
+ "OwnerId": tgw.get("OwnerId"),
300
+ "Description": tgw.get("Description"),
301
+ "CreationTime": tgw.get("CreationTime"),
302
+ "Tags": tgw.get("Tags", []),
303
+ }
304
+ )
305
+ except Exception as e:
306
+ self._handle_error(e, "Transit Gateways")
307
+ return gateways
308
+
309
+ def get_vpn_connections(self) -> List[Dict[str, Any]]:
310
+ """
311
+ Get information about VPN connections.
312
+
313
+ :return: List of VPN connection information
314
+ :rtype: List[Dict[str, Any]]
315
+ """
316
+ connections = []
317
+ try:
318
+ ec2_client = self._get_client("ec2")
319
+ response = ec2_client.describe_vpn_connections()
320
+
321
+ for vpn in response.get("VpnConnections", []):
322
+ vpn_arn = (
323
+ f"arn:aws:ec2:{self.region}:{vpn.get('CustomerGatewayConfiguration', {}).get('OwnerId', '')}:"
324
+ f"vpn-connection/{vpn.get('VpnConnectionId')}"
325
+ )
326
+
327
+ if not self._matches_account(vpn_arn):
328
+ continue
329
+
330
+ if not self._matches_tags(vpn.get("Tags", [])):
331
+ continue
332
+
333
+ connections.append(
334
+ {
335
+ "Region": self.region,
336
+ "VpnConnectionId": vpn.get("VpnConnectionId"),
337
+ "State": vpn.get("State"),
338
+ "Type": vpn.get("Type"),
339
+ "VpnGatewayId": vpn.get("VpnGatewayId"),
340
+ "CustomerGatewayId": vpn.get("CustomerGatewayId"),
341
+ "TransitGatewayId": vpn.get("TransitGatewayId"),
342
+ "Tags": vpn.get("Tags", []),
343
+ }
344
+ )
345
+ except Exception as e:
346
+ self._handle_error(e, "VPN connections")
347
+ return connections
348
+
349
+ def get_global_accelerators(self) -> List[Dict[str, Any]]:
350
+ """
351
+ Get information about Global Accelerator accelerators.
352
+ Note: Global Accelerator is a global service that only operates in us-west-2.
353
+
354
+ :return: List of Global Accelerator information
355
+ :rtype: List[Dict[str, Any]]
356
+ """
357
+ accelerators = []
358
+ try:
359
+ # Global Accelerator only operates in us-west-2 region
360
+ ga_client = self.session.client("globalaccelerator", region_name="us-west-2")
361
+ paginator = ga_client.get_paginator("list_accelerators")
362
+
363
+ for page in paginator.paginate():
364
+ for accel in page.get("Accelerators", []):
365
+ accel_arn = accel.get("AcceleratorArn", "")
366
+
367
+ if not self._matches_account(accel_arn):
368
+ continue
369
+
370
+ try:
371
+ tags_response = ga_client.list_tags_for_resource(ResourceArn=accel_arn)
372
+ accel_tags = tags_response.get("Tags", [])
373
+
374
+ if not self._matches_tags(accel_tags):
375
+ continue
376
+
377
+ accelerators.append(
378
+ {
379
+ "Region": "us-west-2",
380
+ "AcceleratorArn": accel_arn,
381
+ "Name": accel.get("Name"),
382
+ "Status": accel.get("Status"),
383
+ "Enabled": accel.get("Enabled"),
384
+ "IpAddressType": accel.get("IpAddressType"),
385
+ "DnsName": accel.get("DnsName"),
386
+ "CreatedTime": accel.get("CreatedTime"),
387
+ "Tags": accel_tags,
388
+ }
389
+ )
390
+ except Exception as tag_error:
391
+ self._handle_error(tag_error, f"Global Accelerator tags for {accel_arn}")
392
+ continue
393
+
394
+ except Exception as e:
395
+ self._handle_error(e, "Global Accelerators")
396
+ return accelerators
397
+
398
+ def get_network_firewalls(self) -> List[Dict[str, Any]]:
399
+ """
400
+ Get information about AWS Network Firewalls.
401
+
402
+ :return: List of Network Firewall information
403
+ :rtype: List[Dict[str, Any]]
404
+ """
405
+ firewalls = []
406
+ try:
407
+ nfw_client = self._get_client("network-firewall")
408
+ paginator = nfw_client.get_paginator("list_firewalls")
409
+
410
+ for page in paginator.paginate():
411
+ for fw_metadata in page.get("Firewalls", []):
412
+ fw_arn = fw_metadata.get("FirewallArn", "")
413
+
414
+ if not self._matches_account(fw_arn):
415
+ continue
416
+
417
+ try:
418
+ fw_response = nfw_client.describe_firewall(FirewallArn=fw_arn)
419
+ firewall = fw_response.get("Firewall", {})
420
+ fw_tags = firewall.get("Tags", [])
421
+
422
+ if not self._matches_tags(fw_tags):
423
+ continue
424
+
425
+ firewalls.append(
426
+ {
427
+ "Region": self.region,
428
+ "FirewallName": firewall.get("FirewallName"),
429
+ "FirewallArn": fw_arn,
430
+ "FirewallPolicyArn": firewall.get("FirewallPolicyArn"),
431
+ "VpcId": firewall.get("VpcId"),
432
+ "SubnetMappings": firewall.get("SubnetMappings", []),
433
+ "FirewallPolicyChangeProtection": firewall.get("FirewallPolicyChangeProtection"),
434
+ "DeleteProtection": firewall.get("DeleteProtection"),
435
+ "Tags": fw_tags,
436
+ }
437
+ )
438
+ except Exception as fw_error:
439
+ self._handle_error(fw_error, f"Network Firewall details for {fw_arn}")
440
+ continue
441
+
442
+ except Exception as e:
443
+ self._handle_error(e, "Network Firewalls")
444
+ return firewalls
445
+
446
+ def get_route53_resolver_endpoints(self) -> List[Dict[str, Any]]:
447
+ """
448
+ Get information about Route53 Resolver endpoints.
449
+
450
+ :return: List of Route53 Resolver endpoint information
451
+ :rtype: List[Dict[str, Any]]
452
+ """
453
+ endpoints = []
454
+ try:
455
+ r53_resolver = self._get_client("route53resolver")
456
+ paginator = r53_resolver.get_paginator("list_resolver_endpoints")
457
+
458
+ for page in paginator.paginate():
459
+ for endpoint in page.get("ResolverEndpoints", []):
460
+ endpoint_arn = endpoint.get("Arn", "")
461
+
462
+ if not self._matches_account(endpoint_arn):
463
+ continue
464
+
465
+ try:
466
+ tags_response = r53_resolver.list_tags_for_resource(ResourceArn=endpoint_arn)
467
+ endpoint_tags = tags_response.get("Tags", [])
468
+
469
+ if not self._matches_tags(endpoint_tags):
470
+ continue
471
+
472
+ endpoints.append(
473
+ {
474
+ "Region": self.region,
475
+ "Id": endpoint.get("Id"),
476
+ "Arn": endpoint_arn,
477
+ "Name": endpoint.get("Name"),
478
+ "Direction": endpoint.get("Direction"),
479
+ "Status": endpoint.get("Status"),
480
+ "IpAddressCount": endpoint.get("IpAddressCount"),
481
+ "HostVPCId": endpoint.get("HostVPCId"),
482
+ "CreationTime": endpoint.get("CreationTime"),
483
+ "Tags": endpoint_tags,
484
+ }
485
+ )
486
+ except Exception as tag_error:
487
+ self._handle_error(tag_error, f"Route53 Resolver endpoint tags for {endpoint_arn}")
488
+ continue
489
+
490
+ except Exception as e:
491
+ self._handle_error(e, "Route53 Resolver endpoints")
492
+ return endpoints
493
+
240
494
  def collect(self) -> Dict[str, Any]:
241
495
  """
242
- Collect all networking resources.
496
+ Collect networking resources based on enabled_services configuration.
243
497
 
244
- :return: Dictionary containing all networking resource information
498
+ :return: Dictionary containing enabled networking resource information
245
499
  :rtype: Dict[str, Any]
246
500
  """
247
- return {
248
- "VPCs": self.get_vpcs(),
249
- "ElasticIPs": self.get_elastic_ips(),
250
- "LoadBalancers": self.get_load_balancers(),
251
- "CloudFrontDistributions": self.get_cloudfront_distributions(),
252
- "Route53": self.get_route53_info(),
253
- }
501
+ result = {}
502
+
503
+ # VPC Resources
504
+ if self.enabled_services.get("vpc", True):
505
+ vpc_info = self.get_vpcs()
506
+ result.update(vpc_info)
507
+
508
+ # Elastic IPs
509
+ if self.enabled_services.get("elastic_ips", True):
510
+ result["ElasticIPs"] = self.get_elastic_ips()
511
+
512
+ # Load Balancers
513
+ if self.enabled_services.get("load_balancers", True):
514
+ result["LoadBalancers"] = self.get_load_balancers()
515
+
516
+ # CloudFront Distributions
517
+ if self.enabled_services.get("cloudfront", True):
518
+ result["CloudFrontDistributions"] = self.get_cloudfront_distributions()
519
+
520
+ # Route53
521
+ if self.enabled_services.get("route53", True):
522
+ result["Route53"] = self.get_route53_info()
523
+
524
+ # Direct Connect
525
+ if self.enabled_services.get("direct_connect", True):
526
+ result["DirectConnectConnections"] = self.get_direct_connect_connections()
527
+
528
+ # Transit Gateways
529
+ if self.enabled_services.get("transit_gateway", True):
530
+ result["TransitGateways"] = self.get_transit_gateways()
531
+
532
+ # VPN Connections
533
+ if self.enabled_services.get("vpn", True):
534
+ result["VPNConnections"] = self.get_vpn_connections()
535
+
536
+ # Global Accelerators
537
+ if self.enabled_services.get("global_accelerator", True):
538
+ result["GlobalAccelerators"] = self.get_global_accelerators()
539
+
540
+ # Network Firewalls
541
+ if self.enabled_services.get("network_firewall", True):
542
+ result["NetworkFirewalls"] = self.get_network_firewalls()
543
+
544
+ # Route53 Resolver
545
+ if self.enabled_services.get("route53_resolver", True):
546
+ result["Route53ResolverEndpoints"] = self.get_route53_resolver_endpoints()
547
+
548
+ return result
549
+
550
+ def _convert_tags_to_dict(self, tags_list: List[Dict[str, str]]) -> Dict[str, str]:
551
+ """
552
+ Convert AWS tags list format to dictionary.
553
+
554
+ :param list tags_list: List of tags in format [{"Key": "k", "Value": "v"}]
555
+ :return: Dictionary of tags {key: value}
556
+ :rtype: Dict[str, str]
557
+ """
558
+ return {tag.get("Key", ""): tag.get("Value", "") for tag in tags_list}
559
+
560
+ def _matches_tags(self, resource_tags: Dict[str, str]) -> bool:
561
+ """
562
+ Check if resource tags match the specified filter tags.
563
+
564
+ :param dict resource_tags: Tags on the resource
565
+ :return: True if all filter tags match
566
+ :rtype: bool
567
+ """
568
+ if not self.tags:
569
+ return True
570
+
571
+ # All filter tags must match
572
+ for key, value in self.tags.items():
573
+ if resource_tags.get(key) != value:
574
+ return False
575
+
576
+ return True