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
@@ -34,9 +34,8 @@ from regscale.integrations.commercial.qualys.scanner import QualysTotalCloudJSON
34
34
  from regscale.integrations.commercial.qualys.variables import QualysVariables
35
35
  from regscale.integrations.scanner_integration import IntegrationAsset, IntegrationFinding
36
36
  from regscale.integrations.variables import ScannerVariables
37
- from regscale.models import Asset, Issue, Search, regscale_models
38
- from regscale.models.app_models.click import NotRequiredIf, regscale_ssp_id, save_output_to, ssp_or_component_id
39
- from regscale.models.integration_models.ecr_models.data import Finding
37
+ from regscale.models import Asset, Issue, Search, regscale_models, IssueStatus, IssueSeverity
38
+ from regscale.models.app_models.click import NotRequiredIf, save_output_to, ssp_or_component_id
40
39
  from regscale.models.integration_models.flat_file_importer import FlatFileImporter
41
40
  from regscale.models.integration_models.qualys import (
42
41
  Qualys,
@@ -280,7 +279,7 @@ class FindingProgressTracker:
280
279
  try:
281
280
  finding = next(self.findings_iter)
282
281
  self.count += 1
283
- if finding and hasattr(finding, "external_id"):
282
+ if finding and hasattr(finding, "external_id") and finding.external_id is not None:
284
283
  self.finding_ids.append(finding.external_id)
285
284
  self.progress.update(self.finding_task, advance=1)
286
285
  return finding
@@ -378,6 +377,11 @@ def import_total_cloud(
378
377
  if exclude_tags and not include_tags:
379
378
  error_and_exit("You must provide --include_tags when using --exclude_tags to import Qualys Total Cloud data.")
380
379
 
380
+ # Ensure vulnerability creation is properly set
381
+ if not vulnerability_creation:
382
+ vulnerability_creation = "IssueCreation" # Default to IssueCreation for Qualys
383
+ logger.info("No vulnerability creation setting provided, defaulting to IssueCreation for Qualys Total Cloud")
384
+
381
385
  containers_lst = []
382
386
  try:
383
387
  # Configure scanner variables and fetch data
@@ -1631,26 +1635,12 @@ def sync_assets(
1631
1635
  """
1632
1636
  parent_module = "components" if is_component else "securityplans"
1633
1637
  update_assets = []
1634
- for qualys_asset in qualys_assets: # you can list as many input dicts as you want here
1635
- logger.debug("qualys_asset: %s", qualys_asset)
1636
- if not isinstance(qualys_asset, dict):
1637
- logger.error("Expected dict, got %s: %s", type(qualys_asset), qualys_asset)
1638
- continue
1639
- # Update parent id to SSP or Component on insert
1640
- if lookup_assets := lookup_asset(reg_assets, qualys_asset["ASSET_ID"]):
1641
- for asset in set(lookup_assets):
1642
- asset.parentId = ssp_id
1643
- asset.parentModule = parent_module
1644
- asset.otherTrackingNumber = qualys_asset["ID"]
1645
- asset.ipAddress = qualys_asset["IP"]
1646
- asset.qualysId = qualys_asset["ASSET_ID"]
1647
- try:
1648
- assert asset.id
1649
- # avoid duplication
1650
- if asset.qualysId not in [v["qualysId"] for v in update_assets]:
1651
- update_assets.append(asset)
1652
- except AssertionError as aex:
1653
- logger.error("Asset does not have an id, unable to update!\n%s", aex)
1638
+
1639
+ for qualys_asset in qualys_assets:
1640
+ processed_asset = _process_single_qualys_asset(qualys_asset, reg_assets, ssp_id, parent_module)
1641
+ if processed_asset:
1642
+ update_assets.append(processed_asset)
1643
+
1654
1644
  update_and_insert_assets(
1655
1645
  qualys_assets=qualys_assets,
1656
1646
  reg_assets=reg_assets,
@@ -1661,6 +1651,57 @@ def sync_assets(
1661
1651
  )
1662
1652
 
1663
1653
 
1654
+ def _process_single_qualys_asset(
1655
+ qualys_asset: dict, reg_assets: list[Asset], ssp_id: int, parent_module: str
1656
+ ) -> Optional[Asset]:
1657
+ """
1658
+ Process a single Qualys asset and return the updated RegScale asset if found.
1659
+
1660
+ :param dict qualys_asset: Single Qualys asset dictionary
1661
+ :param list[Asset] reg_assets: List of RegScale assets
1662
+ :param int ssp_id: RegScale System Security Plan or Component ID
1663
+ :param str parent_module: Parent module name
1664
+ :return: Updated RegScale asset or None if not found
1665
+ :rtype: Optional[Asset]
1666
+ """
1667
+ logger.debug("qualys_asset: %s", qualys_asset)
1668
+
1669
+ if not isinstance(qualys_asset, dict):
1670
+ logger.error("Expected dict, got %s: %s", type(qualys_asset), qualys_asset)
1671
+ return None
1672
+
1673
+ lookup_assets = lookup_asset(reg_assets, qualys_asset["ASSET_ID"])
1674
+ if not lookup_assets:
1675
+ return None
1676
+
1677
+ return _update_regscale_asset(lookup_assets[0], qualys_asset, ssp_id, parent_module)
1678
+
1679
+
1680
+ def _update_regscale_asset(asset: Asset, qualys_asset: dict, ssp_id: int, parent_module: str) -> Optional[Asset]:
1681
+ """
1682
+ Update a RegScale asset with Qualys asset data.
1683
+
1684
+ :param Asset asset: RegScale asset to update
1685
+ :param dict qualys_asset: Qualys asset data
1686
+ :param int ssp_id: RegScale System Security Plan or Component ID
1687
+ :param str parent_module: Parent module name
1688
+ :return: Updated asset or None if update failed
1689
+ :rtype: Optional[Asset]
1690
+ """
1691
+ try:
1692
+ asset.parentId = ssp_id
1693
+ asset.parentModule = parent_module
1694
+ asset.otherTrackingNumber = qualys_asset["ID"]
1695
+ asset.ipAddress = qualys_asset["IP"]
1696
+ asset.qualysId = qualys_asset["ASSET_ID"]
1697
+
1698
+ assert asset.id
1699
+ return asset
1700
+ except AssertionError as aex:
1701
+ logger.error("Asset does not have an id, unable to update!\n%s", aex)
1702
+ return None
1703
+
1704
+
1664
1705
  def update_and_insert_assets(
1665
1706
  qualys_assets: list[dict],
1666
1707
  reg_assets: list[Asset],
@@ -1681,48 +1722,106 @@ def update_and_insert_assets(
1681
1722
  :rtype: None
1682
1723
  """
1683
1724
  parent_module = "components" if is_component else "securityplans"
1684
- insert_assets = []
1685
- if assets_to_be_inserted := [
1725
+
1726
+ # Handle asset insertion
1727
+ insert_assets = _prepare_assets_for_insertion(qualys_assets, reg_assets, ssp_id, parent_module, config)
1728
+ if insert_assets:
1729
+ _create_assets_in_batch(insert_assets)
1730
+
1731
+ # Handle asset updates
1732
+ if update_assets:
1733
+ _update_assets_in_batch(update_assets)
1734
+
1735
+
1736
+ def _prepare_assets_for_insertion(
1737
+ qualys_assets: list[dict], reg_assets: list[Asset], ssp_id: int, parent_module: str, config: dict
1738
+ ) -> list[Asset]:
1739
+ """
1740
+ Prepare new assets for insertion into RegScale.
1741
+
1742
+ :param list[dict] qualys_assets: List of Qualys assets
1743
+ :param list[Asset] reg_assets: List of RegScale assets
1744
+ :param int ssp_id: RegScale System Security Plan or Component ID
1745
+ :param str parent_module: Parent module name
1746
+ :param dict config: Configuration dictionary
1747
+ :return: List of assets to insert
1748
+ :rtype: list[Asset]
1749
+ """
1750
+ assets_to_be_inserted = [
1686
1751
  qualys_asset
1687
1752
  for qualys_asset in qualys_assets
1688
1753
  if qualys_asset["ASSET_ID"] not in [asset["ASSET_ID"] for asset in inner_join(reg_assets, qualys_assets)]
1689
- ]:
1690
- for qualys_asset in assets_to_be_inserted:
1691
- # Do Insert
1692
- r_asset = Asset(
1693
- name=f'Qualys Asset #{qualys_asset["ASSET_ID"]} IP: {qualys_asset["IP"]}',
1694
- otherTrackingNumber=qualys_asset["ID"],
1695
- parentId=ssp_id,
1696
- parentModule=parent_module,
1697
- ipAddress=qualys_asset["IP"],
1698
- assetOwnerId=config["userId"],
1699
- assetType="Other",
1700
- assetCategory=regscale_models.AssetCategory.Hardware,
1701
- status="Off-Network",
1702
- qualysId=qualys_asset["ASSET_ID"],
1703
- )
1704
- # avoid duplication
1705
- if r_asset.qualysId not in {v["qualysId"] for v in insert_assets}:
1706
- insert_assets.append(r_asset)
1707
- try:
1708
- created_assets = Asset.batch_create(insert_assets, job_progress)
1709
- logger.info(
1710
- "RegScale Asset(s) successfully created: %i/%i",
1711
- len(created_assets),
1712
- len(insert_assets),
1713
- )
1714
- except requests.exceptions.RequestException as rex:
1715
- logger.error("Unable to create Qualys Assets in RegScale\n%s", rex)
1716
- if update_assets:
1717
- try:
1718
- updated_assets = Asset.batch_update(update_assets, job_progress)
1719
- logger.info(
1720
- "RegScale Asset(s) successfully updated: %i/%i",
1721
- len(updated_assets),
1722
- len(update_assets),
1723
- )
1724
- except requests.RequestException as rex:
1725
- logger.error("Unable to Update Qualys Assets to RegScale\n%s", rex)
1754
+ ]
1755
+
1756
+ insert_assets = []
1757
+ for qualys_asset in assets_to_be_inserted:
1758
+ r_asset = _create_regscale_asset_from_qualys(qualys_asset, ssp_id, parent_module, config)
1759
+ # avoid duplication
1760
+ if r_asset.qualysId not in {v["qualysId"] for v in insert_assets}:
1761
+ insert_assets.append(r_asset)
1762
+
1763
+ return insert_assets
1764
+
1765
+
1766
+ def _create_regscale_asset_from_qualys(qualys_asset: dict, ssp_id: int, parent_module: str, config: dict) -> Asset:
1767
+ """
1768
+ Create a RegScale asset from Qualys asset data.
1769
+
1770
+ :param dict qualys_asset: Qualys asset data
1771
+ :param int ssp_id: RegScale System Security Plan or Component ID
1772
+ :param str parent_module: Parent module name
1773
+ :param dict config: Configuration dictionary
1774
+ :return: New RegScale asset
1775
+ :rtype: Asset
1776
+ """
1777
+ return Asset(
1778
+ name=f'Qualys Asset #{qualys_asset["ASSET_ID"]} IP: {qualys_asset["IP"]}',
1779
+ otherTrackingNumber=qualys_asset["ID"],
1780
+ parentId=ssp_id,
1781
+ parentModule=parent_module,
1782
+ ipAddress=qualys_asset["IP"],
1783
+ assetOwnerId=config["userId"],
1784
+ assetType="Other",
1785
+ assetCategory=regscale_models.AssetCategory.Hardware,
1786
+ status="Off-Network",
1787
+ qualysId=qualys_asset["ASSET_ID"],
1788
+ )
1789
+
1790
+
1791
+ def _create_assets_in_batch(insert_assets: list[Asset]) -> None:
1792
+ """
1793
+ Create assets in batch and handle any errors.
1794
+
1795
+ :param list[Asset] insert_assets: List of assets to create
1796
+ :rtype: None
1797
+ """
1798
+ try:
1799
+ created_assets = Asset.batch_create(insert_assets, job_progress)
1800
+ logger.info(
1801
+ "RegScale Asset(s) successfully created: %i/%i",
1802
+ len(created_assets),
1803
+ len(insert_assets),
1804
+ )
1805
+ except requests.exceptions.RequestException as rex:
1806
+ logger.error("Unable to create Qualys Assets in RegScale\n%s", rex)
1807
+
1808
+
1809
+ def _update_assets_in_batch(update_assets: list[Asset]) -> None:
1810
+ """
1811
+ Update assets in batch and handle any errors.
1812
+
1813
+ :param list[Asset] update_assets: List of assets to update
1814
+ :rtype: None
1815
+ """
1816
+ try:
1817
+ updated_assets = Asset.batch_update(update_assets, job_progress)
1818
+ logger.info(
1819
+ "RegScale Asset(s) successfully updated: %i/%i",
1820
+ len(updated_assets),
1821
+ len(update_assets),
1822
+ )
1823
+ except requests.RequestException as rex:
1824
+ logger.error("Unable to Update Qualys Assets to RegScale\n%s", rex)
1726
1825
 
1727
1826
 
1728
1827
  def sync_issues(ssp_id: int, qualys_assets_and_issues: list[dict], is_component: bool = False) -> None:
@@ -2016,7 +2115,7 @@ def lookup_asset(asset_list: list, asset_id: str = None) -> list[Asset]:
2016
2115
  return list(set(asset_list)) or []
2017
2116
 
2018
2117
 
2019
- def map_qualys_severity_to_regscale(severity: int) -> tuple[str, str]:
2118
+ def map_qualys_severity_to_regscale(severity: int) -> tuple[IssueSeverity, str]:
2020
2119
  """
2021
2120
  Map Qualys vulnerability severity to RegScale Issue severity
2022
2121
 
@@ -2025,12 +2124,12 @@ def map_qualys_severity_to_regscale(severity: int) -> tuple[str, str]:
2025
2124
  :rtype: tuple[str, str]
2026
2125
  """
2027
2126
  if severity <= 2:
2028
- return "III - Low - Other Weakness", "low"
2127
+ return IssueSeverity.Low, "low"
2029
2128
  if severity == 3:
2030
- return "II - Moderate - Reportable Condition", "moderate"
2129
+ return IssueSeverity.Moderate, "moderate"
2031
2130
  if severity > 3:
2032
- return "I - High - Significant Deficiency", "high"
2033
- return "IV - Not Assigned", "low"
2131
+ return IssueSeverity.High, "high"
2132
+ return IssueSeverity.NotAssigned, "low"
2034
2133
 
2035
2134
 
2036
2135
  def create_regscale_issue_from_vuln(