regscale-cli 6.16.0.0__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.

Potentially problematic release.


This version of regscale-cli might be problematic. Click here for more details.

Files changed (481) hide show
  1. regscale/__init__.py +1 -0
  2. regscale/airflow/__init__.py +9 -0
  3. regscale/airflow/azure/__init__.py +9 -0
  4. regscale/airflow/azure/cli.py +89 -0
  5. regscale/airflow/azure/upload_dags.py +116 -0
  6. regscale/airflow/click_dags.py +127 -0
  7. regscale/airflow/click_mixins.py +82 -0
  8. regscale/airflow/config.py +25 -0
  9. regscale/airflow/factories/__init__.py +0 -0
  10. regscale/airflow/factories/connections.py +58 -0
  11. regscale/airflow/factories/workflows.py +78 -0
  12. regscale/airflow/hierarchy.py +88 -0
  13. regscale/airflow/operators/__init__.py +0 -0
  14. regscale/airflow/operators/click.py +36 -0
  15. regscale/airflow/sensors/__init__.py +0 -0
  16. regscale/airflow/sensors/sql.py +107 -0
  17. regscale/airflow/sessions/__init__.py +0 -0
  18. regscale/airflow/sessions/sql/__init__.py +3 -0
  19. regscale/airflow/sessions/sql/queries.py +64 -0
  20. regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
  21. regscale/airflow/tasks/__init__.py +0 -0
  22. regscale/airflow/tasks/branches.py +22 -0
  23. regscale/airflow/tasks/cli.py +116 -0
  24. regscale/airflow/tasks/click.py +73 -0
  25. regscale/airflow/tasks/debugging.py +9 -0
  26. regscale/airflow/tasks/groups.py +116 -0
  27. regscale/airflow/tasks/init.py +60 -0
  28. regscale/airflow/tasks/states.py +47 -0
  29. regscale/airflow/tasks/workflows.py +36 -0
  30. regscale/ansible/__init__.py +9 -0
  31. regscale/core/__init__.py +0 -0
  32. regscale/core/app/__init__.py +3 -0
  33. regscale/core/app/api.py +571 -0
  34. regscale/core/app/application.py +665 -0
  35. regscale/core/app/internal/__init__.py +136 -0
  36. regscale/core/app/internal/admin_actions.py +230 -0
  37. regscale/core/app/internal/assessments_editor.py +873 -0
  38. regscale/core/app/internal/catalog.py +316 -0
  39. regscale/core/app/internal/comparison.py +459 -0
  40. regscale/core/app/internal/control_editor.py +571 -0
  41. regscale/core/app/internal/encrypt.py +79 -0
  42. regscale/core/app/internal/evidence.py +1240 -0
  43. regscale/core/app/internal/file_uploads.py +151 -0
  44. regscale/core/app/internal/healthcheck.py +66 -0
  45. regscale/core/app/internal/login.py +305 -0
  46. regscale/core/app/internal/migrations.py +240 -0
  47. regscale/core/app/internal/model_editor.py +1701 -0
  48. regscale/core/app/internal/poam_editor.py +632 -0
  49. regscale/core/app/internal/workflow.py +105 -0
  50. regscale/core/app/logz.py +74 -0
  51. regscale/core/app/utils/XMLIR.py +258 -0
  52. regscale/core/app/utils/__init__.py +0 -0
  53. regscale/core/app/utils/api_handler.py +358 -0
  54. regscale/core/app/utils/app_utils.py +1110 -0
  55. regscale/core/app/utils/catalog_utils/__init__.py +0 -0
  56. regscale/core/app/utils/catalog_utils/common.py +91 -0
  57. regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
  58. regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
  59. regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
  60. regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
  61. regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
  62. regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
  63. regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
  64. regscale/core/app/utils/file_utils.py +238 -0
  65. regscale/core/app/utils/parser_utils.py +81 -0
  66. regscale/core/app/utils/pickle_file_handler.py +57 -0
  67. regscale/core/app/utils/regscale_utils.py +319 -0
  68. regscale/core/app/utils/report_utils.py +119 -0
  69. regscale/core/app/utils/variables.py +226 -0
  70. regscale/core/decorators.py +31 -0
  71. regscale/core/lazy_group.py +65 -0
  72. regscale/core/login.py +63 -0
  73. regscale/core/server/__init__.py +0 -0
  74. regscale/core/server/flask_api.py +473 -0
  75. regscale/core/server/helpers.py +373 -0
  76. regscale/core/server/rest.py +64 -0
  77. regscale/core/server/static/css/bootstrap.css +6030 -0
  78. regscale/core/server/static/css/bootstrap.min.css +6 -0
  79. regscale/core/server/static/css/main.css +176 -0
  80. regscale/core/server/static/images/regscale-cli.svg +49 -0
  81. regscale/core/server/static/images/regscale.svg +38 -0
  82. regscale/core/server/templates/base.html +74 -0
  83. regscale/core/server/templates/index.html +43 -0
  84. regscale/core/server/templates/login.html +28 -0
  85. regscale/core/server/templates/make_base64.html +22 -0
  86. regscale/core/server/templates/upload_STIG.html +109 -0
  87. regscale/core/server/templates/upload_STIG_result.html +26 -0
  88. regscale/core/server/templates/upload_ssp.html +144 -0
  89. regscale/core/server/templates/upload_ssp_result.html +128 -0
  90. regscale/core/static/__init__.py +0 -0
  91. regscale/core/static/regex.py +14 -0
  92. regscale/core/utils/__init__.py +117 -0
  93. regscale/core/utils/click_utils.py +13 -0
  94. regscale/core/utils/date.py +238 -0
  95. regscale/core/utils/graphql.py +254 -0
  96. regscale/core/utils/urls.py +23 -0
  97. regscale/dev/__init__.py +6 -0
  98. regscale/dev/analysis.py +454 -0
  99. regscale/dev/cli.py +235 -0
  100. regscale/dev/code_gen.py +492 -0
  101. regscale/dev/dirs.py +69 -0
  102. regscale/dev/docs.py +384 -0
  103. regscale/dev/monitoring.py +26 -0
  104. regscale/dev/profiling.py +216 -0
  105. regscale/exceptions/__init__.py +4 -0
  106. regscale/exceptions/license_exception.py +7 -0
  107. regscale/exceptions/validation_exception.py +9 -0
  108. regscale/integrations/__init__.py +1 -0
  109. regscale/integrations/commercial/__init__.py +486 -0
  110. regscale/integrations/commercial/ad.py +433 -0
  111. regscale/integrations/commercial/amazon/__init__.py +0 -0
  112. regscale/integrations/commercial/amazon/common.py +106 -0
  113. regscale/integrations/commercial/aqua/__init__.py +0 -0
  114. regscale/integrations/commercial/aqua/aqua.py +91 -0
  115. regscale/integrations/commercial/aws/__init__.py +6 -0
  116. regscale/integrations/commercial/aws/cli.py +322 -0
  117. regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
  118. regscale/integrations/commercial/aws/inventory/base.py +64 -0
  119. regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
  120. regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
  121. regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
  122. regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
  123. regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
  124. regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
  125. regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
  126. regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
  127. regscale/integrations/commercial/aws/scanner.py +823 -0
  128. regscale/integrations/commercial/azure/__init__.py +0 -0
  129. regscale/integrations/commercial/azure/common.py +32 -0
  130. regscale/integrations/commercial/azure/intune.py +488 -0
  131. regscale/integrations/commercial/azure/scanner.py +49 -0
  132. regscale/integrations/commercial/burp.py +78 -0
  133. regscale/integrations/commercial/cpe.py +144 -0
  134. regscale/integrations/commercial/crowdstrike.py +1117 -0
  135. regscale/integrations/commercial/defender.py +1511 -0
  136. regscale/integrations/commercial/dependabot.py +210 -0
  137. regscale/integrations/commercial/durosuite/__init__.py +0 -0
  138. regscale/integrations/commercial/durosuite/api.py +1546 -0
  139. regscale/integrations/commercial/durosuite/process_devices.py +101 -0
  140. regscale/integrations/commercial/durosuite/scanner.py +637 -0
  141. regscale/integrations/commercial/durosuite/variables.py +21 -0
  142. regscale/integrations/commercial/ecr.py +90 -0
  143. regscale/integrations/commercial/gcp/__init__.py +237 -0
  144. regscale/integrations/commercial/gcp/auth.py +96 -0
  145. regscale/integrations/commercial/gcp/control_tests.py +238 -0
  146. regscale/integrations/commercial/gcp/variables.py +18 -0
  147. regscale/integrations/commercial/gitlab.py +332 -0
  148. regscale/integrations/commercial/grype.py +165 -0
  149. regscale/integrations/commercial/ibm.py +90 -0
  150. regscale/integrations/commercial/import_all/__init__.py +0 -0
  151. regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
  152. regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
  153. regscale/integrations/commercial/jira.py +1046 -0
  154. regscale/integrations/commercial/mappings/__init__.py +0 -0
  155. regscale/integrations/commercial/mappings/csf_controls.json +713 -0
  156. regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
  157. regscale/integrations/commercial/nessus/__init__.py +0 -0
  158. regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
  159. regscale/integrations/commercial/nessus/scanner.py +416 -0
  160. regscale/integrations/commercial/nexpose.py +90 -0
  161. regscale/integrations/commercial/okta.py +798 -0
  162. regscale/integrations/commercial/opentext/__init__.py +0 -0
  163. regscale/integrations/commercial/opentext/click.py +99 -0
  164. regscale/integrations/commercial/opentext/scanner.py +143 -0
  165. regscale/integrations/commercial/prisma.py +91 -0
  166. regscale/integrations/commercial/qualys.py +1462 -0
  167. regscale/integrations/commercial/salesforce.py +980 -0
  168. regscale/integrations/commercial/sap/__init__.py +0 -0
  169. regscale/integrations/commercial/sap/click.py +31 -0
  170. regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
  171. regscale/integrations/commercial/sap/sysdig/click.py +57 -0
  172. regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
  173. regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
  174. regscale/integrations/commercial/sap/tenable/click.py +49 -0
  175. regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
  176. regscale/integrations/commercial/servicenow.py +1756 -0
  177. regscale/integrations/commercial/sicura/__init__.py +0 -0
  178. regscale/integrations/commercial/sicura/api.py +855 -0
  179. regscale/integrations/commercial/sicura/commands.py +73 -0
  180. regscale/integrations/commercial/sicura/scanner.py +481 -0
  181. regscale/integrations/commercial/sicura/variables.py +16 -0
  182. regscale/integrations/commercial/snyk.py +90 -0
  183. regscale/integrations/commercial/sonarcloud.py +260 -0
  184. regscale/integrations/commercial/sqlserver.py +369 -0
  185. regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
  186. regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
  187. regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
  188. regscale/integrations/commercial/stigv2/__init__.py +0 -0
  189. regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
  190. regscale/integrations/commercial/stigv2/click_commands.py +95 -0
  191. regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
  192. regscale/integrations/commercial/synqly/__init__.py +0 -0
  193. regscale/integrations/commercial/synqly/assets.py +46 -0
  194. regscale/integrations/commercial/synqly/ticketing.py +132 -0
  195. regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
  196. regscale/integrations/commercial/synqly_jira.py +840 -0
  197. regscale/integrations/commercial/tenablev2/__init__.py +0 -0
  198. regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
  199. regscale/integrations/commercial/tenablev2/click.py +1584 -0
  200. regscale/integrations/commercial/tenablev2/scanner.py +504 -0
  201. regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
  202. regscale/integrations/commercial/tenablev2/utils.py +78 -0
  203. regscale/integrations/commercial/tenablev2/variables.py +17 -0
  204. regscale/integrations/commercial/trivy.py +162 -0
  205. regscale/integrations/commercial/veracode.py +96 -0
  206. regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
  207. regscale/integrations/commercial/wizv2/__init__.py +0 -0
  208. regscale/integrations/commercial/wizv2/click.py +429 -0
  209. regscale/integrations/commercial/wizv2/constants.py +1001 -0
  210. regscale/integrations/commercial/wizv2/issue.py +361 -0
  211. regscale/integrations/commercial/wizv2/models.py +112 -0
  212. regscale/integrations/commercial/wizv2/parsers.py +339 -0
  213. regscale/integrations/commercial/wizv2/sbom.py +115 -0
  214. regscale/integrations/commercial/wizv2/scanner.py +416 -0
  215. regscale/integrations/commercial/wizv2/utils.py +796 -0
  216. regscale/integrations/commercial/wizv2/variables.py +39 -0
  217. regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
  218. regscale/integrations/commercial/xray.py +91 -0
  219. regscale/integrations/integration/__init__.py +2 -0
  220. regscale/integrations/integration/integration.py +26 -0
  221. regscale/integrations/integration/inventory.py +17 -0
  222. regscale/integrations/integration/issue.py +100 -0
  223. regscale/integrations/integration_override.py +149 -0
  224. regscale/integrations/public/__init__.py +103 -0
  225. regscale/integrations/public/cisa.py +641 -0
  226. regscale/integrations/public/criticality_updater.py +70 -0
  227. regscale/integrations/public/emass.py +411 -0
  228. regscale/integrations/public/emass_slcm_import.py +697 -0
  229. regscale/integrations/public/fedramp/__init__.py +0 -0
  230. regscale/integrations/public/fedramp/appendix_parser.py +548 -0
  231. regscale/integrations/public/fedramp/click.py +479 -0
  232. regscale/integrations/public/fedramp/components.py +714 -0
  233. regscale/integrations/public/fedramp/docx_parser.py +259 -0
  234. regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
  235. regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
  236. regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
  237. regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
  238. regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
  239. regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
  240. regscale/integrations/public/fedramp/import_workbook.py +495 -0
  241. regscale/integrations/public/fedramp/inventory_items.py +244 -0
  242. regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
  243. regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
  244. regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
  245. regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
  246. regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
  247. regscale/integrations/public/fedramp/mappings/user.py +175 -0
  248. regscale/integrations/public/fedramp/mappings/values.py +141 -0
  249. regscale/integrations/public/fedramp/markdown_parser.py +150 -0
  250. regscale/integrations/public/fedramp/metadata.py +689 -0
  251. regscale/integrations/public/fedramp/models/__init__.py +59 -0
  252. regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
  253. regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
  254. regscale/integrations/public/fedramp/parts_mapper.py +107 -0
  255. regscale/integrations/public/fedramp/poam/__init__.py +0 -0
  256. regscale/integrations/public/fedramp/poam/scanner.py +851 -0
  257. regscale/integrations/public/fedramp/properties.py +201 -0
  258. regscale/integrations/public/fedramp/reporting.py +84 -0
  259. regscale/integrations/public/fedramp/resources.py +496 -0
  260. regscale/integrations/public/fedramp/rosetta.py +110 -0
  261. regscale/integrations/public/fedramp/ssp_logger.py +87 -0
  262. regscale/integrations/public/fedramp/system_characteristics.py +922 -0
  263. regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
  264. regscale/integrations/public/fedramp/system_implementation.py +190 -0
  265. regscale/integrations/public/fedramp/xml_utils.py +87 -0
  266. regscale/integrations/public/nist_catalog.py +275 -0
  267. regscale/integrations/public/oscal.py +1946 -0
  268. regscale/integrations/public/otx.py +169 -0
  269. regscale/integrations/scanner_integration.py +2692 -0
  270. regscale/integrations/variables.py +25 -0
  271. regscale/models/__init__.py +7 -0
  272. regscale/models/app_models/__init__.py +5 -0
  273. regscale/models/app_models/catalog_compare.py +213 -0
  274. regscale/models/app_models/click.py +252 -0
  275. regscale/models/app_models/datetime_encoder.py +21 -0
  276. regscale/models/app_models/import_validater.py +321 -0
  277. regscale/models/app_models/mapping.py +260 -0
  278. regscale/models/app_models/pipeline.py +37 -0
  279. regscale/models/click_models.py +413 -0
  280. regscale/models/config.py +154 -0
  281. regscale/models/email_style.css +67 -0
  282. regscale/models/hierarchy.py +8 -0
  283. regscale/models/inspect_models.py +79 -0
  284. regscale/models/integration_models/__init__.py +0 -0
  285. regscale/models/integration_models/amazon_models/__init__.py +0 -0
  286. regscale/models/integration_models/amazon_models/inspector.py +262 -0
  287. regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
  288. regscale/models/integration_models/aqua.py +247 -0
  289. regscale/models/integration_models/azure_alerts.py +255 -0
  290. regscale/models/integration_models/base64.py +23 -0
  291. regscale/models/integration_models/burp.py +433 -0
  292. regscale/models/integration_models/burp_models.py +128 -0
  293. regscale/models/integration_models/cisa_kev_data.json +19333 -0
  294. regscale/models/integration_models/defender_data.py +93 -0
  295. regscale/models/integration_models/defenderimport.py +143 -0
  296. regscale/models/integration_models/drf.py +443 -0
  297. regscale/models/integration_models/ecr_models/__init__.py +0 -0
  298. regscale/models/integration_models/ecr_models/data.py +69 -0
  299. regscale/models/integration_models/ecr_models/ecr.py +239 -0
  300. regscale/models/integration_models/flat_file_importer.py +1079 -0
  301. regscale/models/integration_models/grype_import.py +247 -0
  302. regscale/models/integration_models/ibm.py +126 -0
  303. regscale/models/integration_models/implementation_results.py +85 -0
  304. regscale/models/integration_models/nexpose.py +140 -0
  305. regscale/models/integration_models/prisma.py +202 -0
  306. regscale/models/integration_models/qualys.py +720 -0
  307. regscale/models/integration_models/qualys_scanner.py +160 -0
  308. regscale/models/integration_models/sbom/__init__.py +0 -0
  309. regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
  310. regscale/models/integration_models/send_reminders.py +620 -0
  311. regscale/models/integration_models/snyk.py +155 -0
  312. regscale/models/integration_models/synqly_models/__init__.py +0 -0
  313. regscale/models/integration_models/synqly_models/capabilities.json +1 -0
  314. regscale/models/integration_models/synqly_models/connector_types.py +22 -0
  315. regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
  316. regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
  317. regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
  318. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
  319. regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
  320. regscale/models/integration_models/synqly_models/param.py +72 -0
  321. regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
  322. regscale/models/integration_models/synqly_models/tenants.py +39 -0
  323. regscale/models/integration_models/tenable_models/__init__.py +0 -0
  324. regscale/models/integration_models/tenable_models/integration.py +187 -0
  325. regscale/models/integration_models/tenable_models/models.py +513 -0
  326. regscale/models/integration_models/trivy_import.py +231 -0
  327. regscale/models/integration_models/veracode.py +217 -0
  328. regscale/models/integration_models/xray.py +135 -0
  329. regscale/models/locking.py +100 -0
  330. regscale/models/platform.py +110 -0
  331. regscale/models/regscale_models/__init__.py +67 -0
  332. regscale/models/regscale_models/assessment.py +570 -0
  333. regscale/models/regscale_models/assessment_plan.py +52 -0
  334. regscale/models/regscale_models/asset.py +567 -0
  335. regscale/models/regscale_models/asset_mapping.py +190 -0
  336. regscale/models/regscale_models/case.py +42 -0
  337. regscale/models/regscale_models/catalog.py +261 -0
  338. regscale/models/regscale_models/cci.py +46 -0
  339. regscale/models/regscale_models/change.py +167 -0
  340. regscale/models/regscale_models/checklist.py +372 -0
  341. regscale/models/regscale_models/comment.py +49 -0
  342. regscale/models/regscale_models/compliance_settings.py +112 -0
  343. regscale/models/regscale_models/component.py +412 -0
  344. regscale/models/regscale_models/component_mapping.py +65 -0
  345. regscale/models/regscale_models/control.py +38 -0
  346. regscale/models/regscale_models/control_implementation.py +1128 -0
  347. regscale/models/regscale_models/control_objective.py +261 -0
  348. regscale/models/regscale_models/control_parameter.py +100 -0
  349. regscale/models/regscale_models/control_test.py +34 -0
  350. regscale/models/regscale_models/control_test_plan.py +75 -0
  351. regscale/models/regscale_models/control_test_result.py +52 -0
  352. regscale/models/regscale_models/custom_field.py +245 -0
  353. regscale/models/regscale_models/data.py +109 -0
  354. regscale/models/regscale_models/data_center.py +40 -0
  355. regscale/models/regscale_models/deviation.py +203 -0
  356. regscale/models/regscale_models/email.py +97 -0
  357. regscale/models/regscale_models/evidence.py +47 -0
  358. regscale/models/regscale_models/evidence_mapping.py +40 -0
  359. regscale/models/regscale_models/facility.py +59 -0
  360. regscale/models/regscale_models/file.py +382 -0
  361. regscale/models/regscale_models/filetag.py +37 -0
  362. regscale/models/regscale_models/form_field_value.py +94 -0
  363. regscale/models/regscale_models/group.py +169 -0
  364. regscale/models/regscale_models/implementation_objective.py +335 -0
  365. regscale/models/regscale_models/implementation_option.py +275 -0
  366. regscale/models/regscale_models/implementation_role.py +33 -0
  367. regscale/models/regscale_models/incident.py +177 -0
  368. regscale/models/regscale_models/interconnection.py +43 -0
  369. regscale/models/regscale_models/issue.py +1176 -0
  370. regscale/models/regscale_models/leveraged_authorization.py +125 -0
  371. regscale/models/regscale_models/line_of_inquiry.py +52 -0
  372. regscale/models/regscale_models/link.py +205 -0
  373. regscale/models/regscale_models/meta_data.py +64 -0
  374. regscale/models/regscale_models/mixins/__init__.py +0 -0
  375. regscale/models/regscale_models/mixins/parent_cache.py +124 -0
  376. regscale/models/regscale_models/module.py +224 -0
  377. regscale/models/regscale_models/modules.py +191 -0
  378. regscale/models/regscale_models/objective.py +14 -0
  379. regscale/models/regscale_models/parameter.py +87 -0
  380. regscale/models/regscale_models/ports_protocol.py +81 -0
  381. regscale/models/regscale_models/privacy.py +89 -0
  382. regscale/models/regscale_models/profile.py +50 -0
  383. regscale/models/regscale_models/profile_link.py +68 -0
  384. regscale/models/regscale_models/profile_mapping.py +124 -0
  385. regscale/models/regscale_models/project.py +63 -0
  386. regscale/models/regscale_models/property.py +278 -0
  387. regscale/models/regscale_models/question.py +85 -0
  388. regscale/models/regscale_models/questionnaire.py +87 -0
  389. regscale/models/regscale_models/questionnaire_instance.py +177 -0
  390. regscale/models/regscale_models/rbac.py +132 -0
  391. regscale/models/regscale_models/reference.py +86 -0
  392. regscale/models/regscale_models/regscale_model.py +1643 -0
  393. regscale/models/regscale_models/requirement.py +29 -0
  394. regscale/models/regscale_models/risk.py +274 -0
  395. regscale/models/regscale_models/sbom.py +54 -0
  396. regscale/models/regscale_models/scan_history.py +436 -0
  397. regscale/models/regscale_models/search.py +53 -0
  398. regscale/models/regscale_models/security_control.py +132 -0
  399. regscale/models/regscale_models/security_plan.py +204 -0
  400. regscale/models/regscale_models/software_inventory.py +159 -0
  401. regscale/models/regscale_models/stake_holder.py +64 -0
  402. regscale/models/regscale_models/stig.py +647 -0
  403. regscale/models/regscale_models/supply_chain.py +152 -0
  404. regscale/models/regscale_models/system_role.py +188 -0
  405. regscale/models/regscale_models/system_role_external_assignment.py +40 -0
  406. regscale/models/regscale_models/tag.py +37 -0
  407. regscale/models/regscale_models/tag_mapping.py +19 -0
  408. regscale/models/regscale_models/task.py +133 -0
  409. regscale/models/regscale_models/threat.py +196 -0
  410. regscale/models/regscale_models/user.py +175 -0
  411. regscale/models/regscale_models/user_group.py +55 -0
  412. regscale/models/regscale_models/vulnerability.py +242 -0
  413. regscale/models/regscale_models/vulnerability_mapping.py +162 -0
  414. regscale/models/regscale_models/workflow.py +55 -0
  415. regscale/models/regscale_models/workflow_action.py +34 -0
  416. regscale/models/regscale_models/workflow_instance.py +269 -0
  417. regscale/models/regscale_models/workflow_instance_step.py +114 -0
  418. regscale/models/regscale_models/workflow_template.py +58 -0
  419. regscale/models/regscale_models/workflow_template_step.py +45 -0
  420. regscale/regscale.py +815 -0
  421. regscale/utils/__init__.py +7 -0
  422. regscale/utils/b64conversion.py +14 -0
  423. regscale/utils/click_utils.py +118 -0
  424. regscale/utils/decorators.py +48 -0
  425. regscale/utils/dict_utils.py +59 -0
  426. regscale/utils/files.py +79 -0
  427. regscale/utils/fxns.py +30 -0
  428. regscale/utils/graphql_client.py +113 -0
  429. regscale/utils/lists.py +16 -0
  430. regscale/utils/numbers.py +12 -0
  431. regscale/utils/shell.py +148 -0
  432. regscale/utils/string.py +121 -0
  433. regscale/utils/synqly_utils.py +165 -0
  434. regscale/utils/threading/__init__.py +8 -0
  435. regscale/utils/threading/threadhandler.py +131 -0
  436. regscale/utils/threading/threadsafe_counter.py +47 -0
  437. regscale/utils/threading/threadsafe_dict.py +242 -0
  438. regscale/utils/threading/threadsafe_list.py +83 -0
  439. regscale/utils/version.py +104 -0
  440. regscale/validation/__init__.py +0 -0
  441. regscale/validation/address.py +37 -0
  442. regscale/validation/record.py +48 -0
  443. regscale/visualization/__init__.py +5 -0
  444. regscale/visualization/click.py +34 -0
  445. regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
  446. regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
  447. regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
  448. regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
  449. regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
  450. regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
  451. tests/fixtures/__init__.py +2 -0
  452. tests/fixtures/api.py +87 -0
  453. tests/fixtures/models.py +91 -0
  454. tests/fixtures/test_fixture.py +144 -0
  455. tests/mocks/__init__.py +0 -0
  456. tests/mocks/objects.py +3 -0
  457. tests/mocks/response.py +32 -0
  458. tests/mocks/xml.py +13 -0
  459. tests/regscale/__init__.py +0 -0
  460. tests/regscale/core/__init__.py +0 -0
  461. tests/regscale/core/test_api.py +232 -0
  462. tests/regscale/core/test_app.py +406 -0
  463. tests/regscale/core/test_login.py +37 -0
  464. tests/regscale/core/test_logz.py +66 -0
  465. tests/regscale/core/test_sbom_generator.py +87 -0
  466. tests/regscale/core/test_validation_utils.py +163 -0
  467. tests/regscale/core/test_version.py +78 -0
  468. tests/regscale/models/__init__.py +0 -0
  469. tests/regscale/models/test_asset.py +71 -0
  470. tests/regscale/models/test_config.py +26 -0
  471. tests/regscale/models/test_control_implementation.py +27 -0
  472. tests/regscale/models/test_import.py +97 -0
  473. tests/regscale/models/test_issue.py +36 -0
  474. tests/regscale/models/test_mapping.py +52 -0
  475. tests/regscale/models/test_platform.py +31 -0
  476. tests/regscale/models/test_regscale_model.py +346 -0
  477. tests/regscale/models/test_report.py +32 -0
  478. tests/regscale/models/test_tenable_integrations.py +118 -0
  479. tests/regscale/models/test_user_model.py +121 -0
  480. tests/regscale/test_about.py +19 -0
  481. tests/regscale/test_authorization.py +65 -0
File without changes
@@ -0,0 +1,31 @@
1
+ """
2
+ This module contains the Click command group for SAP.
3
+ """
4
+
5
+ import logging
6
+
7
+ import click
8
+
9
+ logger = logging.getLogger("regscale")
10
+
11
+
12
+ @click.group()
13
+ def sap():
14
+ """
15
+ SAP Integration
16
+ """
17
+
18
+
19
+ @sap.group(help="SAP Concur")
20
+ def concur():
21
+ """Performs actions on the SAP Concur API."""
22
+
23
+
24
+ @concur.group(help="SAP Sysdig")
25
+ def sysdig():
26
+ """Performs actions on the SysDig Concur export."""
27
+
28
+
29
+ @concur.group(help="Synchronize data from Tenable.")
30
+ def tenable():
31
+ """Performs actions on a Tenable Concur export."""
@@ -0,0 +1,57 @@
1
+ """
2
+ This module contains the Click command group for SAP.
3
+ """
4
+
5
+ import logging
6
+
7
+ import click
8
+
9
+ from regscale.integrations.commercial.sap.click import sysdig
10
+ from regscale.models.app_models.click import regscale_ssp_id
11
+
12
+ logger = logging.getLogger("regscale")
13
+
14
+
15
+ @sysdig.command(name="sync_vulns")
16
+ @regscale_ssp_id()
17
+ @click.option(
18
+ "--path",
19
+ type=click.STRING,
20
+ help="Path to the CSV file containing the SAP Concur data.",
21
+ required=True,
22
+ )
23
+ @click.option(
24
+ "--scan_date",
25
+ type=click.DateTime(formats=["%Y-%m-%d"]),
26
+ help="The scan date of the file.",
27
+ required=False,
28
+ )
29
+ def sync_vulns(regscale_ssp_id: int, path: str, scan_date: click.DateTime = None):
30
+ """
31
+ Synchronize vulnerabilities from SAP Concur data.
32
+ """
33
+ from regscale.integrations.commercial.sap.sysdig.sysdig_scanner import SAPConcurSysDigScanner
34
+
35
+ SAPConcurSysDigScanner(plan_id=regscale_ssp_id).sync_findings(
36
+ plan_id=regscale_ssp_id, path=path, scan_date=scan_date
37
+ )
38
+
39
+
40
+ @sysdig.command(name="sync_assets")
41
+ @regscale_ssp_id()
42
+ @click.option(
43
+ "--path",
44
+ type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True),
45
+ help="Path to the CSV file containing the SAP Concur data.",
46
+ required=True,
47
+ )
48
+ def sync_assets(regscale_ssp_id: int, path: str):
49
+ """
50
+ Synchronize assets from SAP Concur data.
51
+
52
+ :param int regscale_ssp_id: RegScale System Security Plan ID
53
+ :param str path: Path to the CSV file containing the SAP Concur data
54
+ """
55
+ from regscale.integrations.commercial.sap.sysdig.sysdig_scanner import SAPConcurSysDigScanner
56
+
57
+ SAPConcurSysDigScanner(plan_id=regscale_ssp_id).sync_assets(plan_id=regscale_ssp_id, path=path)
@@ -0,0 +1,190 @@
1
+ import csv
2
+ import logging
3
+ from typing import Any, Dict, Iterator, Tuple
4
+
5
+ from regscale.core.app.utils.app_utils import get_current_datetime
6
+ from regscale.core.app.utils.parser_utils import safe_datetime_str, safe_float
7
+ from regscale.integrations.scanner_integration import (
8
+ IntegrationAsset,
9
+ IntegrationFinding,
10
+ ScannerIntegration,
11
+ issue_due_date,
12
+ )
13
+ from regscale.integrations.variables import ScannerVariables
14
+ from regscale.models import regscale_models
15
+
16
+ logger = logging.getLogger("regscale")
17
+
18
+
19
+ class SAPConcurSysDigScanner(ScannerIntegration):
20
+ title = "SAP Concur - SysDig"
21
+ asset_identifier_field = "name"
22
+ finding_severity_map = {
23
+ "critical": regscale_models.IssueSeverity.Critical,
24
+ "high": regscale_models.IssueSeverity.High,
25
+ "medium": regscale_models.IssueSeverity.Moderate,
26
+ "low": regscale_models.IssueSeverity.Low,
27
+ }
28
+
29
+ def parse_assets(self, asset: Dict[str, Any]) -> IntegrationAsset:
30
+ """
31
+ Parse a single asset from the vulnerability data.
32
+
33
+ :param Dict[str, Any] asset: A dictionary containing the asset data
34
+ :return: An IntegrationAsset object with parsed data
35
+ :rtype: IntegrationAsset
36
+ """
37
+ name = (
38
+ asset.get("Image name", None) + ":" + asset.get("Image tag", None)
39
+ if (asset.get("Image name") and asset.get("Image tag"))
40
+ else None
41
+ )
42
+ return IntegrationAsset(
43
+ name=name,
44
+ identifier=name
45
+ or asset.get("Container name")
46
+ or asset.get("Cluster name")
47
+ or asset.get("Pod")
48
+ or asset.get("Namespace"),
49
+ asset_type="Other", # Sysdig primarily concerns itself with containers
50
+ asset_category=regscale_models.AssetCategory.Hardware,
51
+ asset_owner_id=ScannerVariables.userId,
52
+ status="Active (On Network)",
53
+ mac_address="",
54
+ fqdn="",
55
+ ip_address="",
56
+ operating_system="",
57
+ aws_identifier="",
58
+ vlan_id="",
59
+ location="",
60
+ software_inventory=[],
61
+ )
62
+
63
+ def fetch_assets(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationAsset]:
64
+ """
65
+ Fetch assets from a CSV file and yield IntegrationAsset objects.
66
+
67
+ :param Tuple args: Variable length argument list
68
+ :param dict kwargs: Arbitrary keyword arguments
69
+ :return: An iterator of IntegrationAsset objects
70
+ :rtype: Iterator[IntegrationAsset]
71
+ """
72
+ path: str = kwargs.get("path", "")
73
+ if not path:
74
+ raise ValueError("Path is required")
75
+
76
+ logger.info(f"Fetching assets from {path}")
77
+ with open(path, "r", newline="") as csvfile:
78
+ reader = csv.DictReader(csvfile)
79
+ for row in reader:
80
+ yield self.parse_assets(row)
81
+
82
+ def fetch_findings(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationFinding]:
83
+ """
84
+ Fetch findings from a CSV file and yield IntegrationFinding objects.
85
+
86
+ :param Tuple args: Variable length argument list
87
+ :param dict kwargs: Arbitrary keyword arguments
88
+ :return: An iterator of IntegrationFinding objects
89
+ :rtype: Iterator[IntegrationFinding]
90
+ """
91
+ path: str = kwargs.get("path", "")
92
+ if not path:
93
+ raise ValueError("Path is required")
94
+
95
+ logger.info(f"Fetching findings from {path}")
96
+
97
+ with open(path, "r", newline="") as csvfile:
98
+ reader = csv.DictReader(csvfile)
99
+ for row in reader:
100
+ yield from self.parse_findings(finding=row, kwargs=kwargs)
101
+
102
+ def parse_findings(self, finding: Dict[str, Any], **kwargs: dict) -> Iterator[IntegrationFinding]:
103
+ """
104
+ Parse a single finding from the vulnerability data.
105
+
106
+ :param Dict[str, Any] finding: A dictionary containing the finding data
107
+ :param dict kwargs: Arbitrary keyword arguments
108
+ :return: An iterator of IntegrationFinding objects
109
+ :rtype: Iterator[IntegrationFinding]
110
+ """
111
+ severity = self.finding_severity_map.get(finding["Severity"].lower(), regscale_models.IssueSeverity.Low)
112
+ cves = finding.get("Vulnerability ID", "").split(",") if finding.get("Vulnerability ID") else []
113
+
114
+ if not cves:
115
+ # If there are no CVEs, yield a single finding without CVE information
116
+ yield self._create_finding(finding=finding, severity=severity, kwargs=kwargs)
117
+ else:
118
+ # If there are CVEs, yield a finding for each CVE
119
+ for cve in cves:
120
+ yield self._create_finding(finding=finding, severity=severity, cve=cve.strip(), kwargs=kwargs)
121
+
122
+ def _create_finding(
123
+ self, finding: Dict[str, Any], severity: regscale_models.IssueSeverity, cve: str = "", **kwargs: dict
124
+ ) -> IntegrationFinding:
125
+ """
126
+ Create an IntegrationFinding object from the given data.
127
+
128
+ :param Dict[str, Any] finding: A dictionary containing the finding data
129
+ :param regscale_models.IssueSeverity severity: The severity of the finding
130
+ :param str cve: The CVE number (optional)
131
+ :return: An IntegrationFinding object
132
+ :rtype: IntegrationFinding
133
+ """
134
+ asset_name = (
135
+ finding.get("Image name", None) + ":" + finding.get("Image tag", None)
136
+ if (finding.get("Image name") and finding.get("Image tag"))
137
+ else None
138
+ )
139
+ asset_id = (
140
+ asset_name
141
+ or finding.get("Container name")
142
+ or finding.get("Cluster name")
143
+ or finding.get("Pod")
144
+ or finding.get("Namespace")
145
+ )
146
+ cve_description = finding.get("Cve description")
147
+ category = "Sysdig Vulnerability: General"
148
+ issue_type = "Vulnerability"
149
+ scan_date = kwargs.get("scan_date", get_current_datetime())
150
+ return IntegrationFinding(
151
+ cvss_v3_base_score=safe_float(finding.get("CVSS v3 base score")),
152
+ cvss_score=safe_float(finding.get("CVSS v2 base score")),
153
+ control_labels=[],
154
+ category=category,
155
+ title=cve or cve_description,
156
+ issue_title=cve or cve_description,
157
+ description=cve_description or cve,
158
+ severity=severity,
159
+ status=regscale_models.IssueStatus.Open,
160
+ asset_identifier=asset_id,
161
+ external_id=finding.get("pluginID", "Unknown"),
162
+ scan_date=scan_date,
163
+ first_seen=scan_date,
164
+ last_seen=scan_date,
165
+ remediation=finding.get("Vuln link", ""),
166
+ cve=cve,
167
+ vulnerability_type=self.title,
168
+ plugin_id="0",
169
+ plugin_name=cve or "",
170
+ ip_address="",
171
+ dns=cve,
172
+ issue_type=issue_type,
173
+ date_created=get_current_datetime(),
174
+ date_last_updated=get_current_datetime(),
175
+ gaps="",
176
+ observations=finding.get("plugin_output", ""),
177
+ evidence=finding.get("plugin_output", ""),
178
+ identified_risk=finding.get("risk_factor", ""),
179
+ impact="",
180
+ recommendation_for_mitigation=finding.get("Vuln link", ""),
181
+ rule_id=finding.get("pluginID"),
182
+ rule_version=finding.get("script_version"),
183
+ results=finding.get("plugin_output", ""),
184
+ comments=None,
185
+ baseline="",
186
+ poam_comments=None,
187
+ vulnerable_asset=asset_id,
188
+ source_rule_id=finding.get("fname"),
189
+ basis_for_adjustment=None,
190
+ )
@@ -0,0 +1,49 @@
1
+ """
2
+ This module contains the Click command group for SAP.
3
+ """
4
+
5
+ import logging
6
+
7
+ import click
8
+
9
+ from regscale.integrations.commercial.sap.click import tenable
10
+ from regscale.models.app_models.click import regscale_ssp_id
11
+
12
+ logger = logging.getLogger("regscale")
13
+
14
+
15
+ @tenable.command(name="sync_vulns")
16
+ @regscale_ssp_id()
17
+ @click.option(
18
+ "--path",
19
+ type=click.STRING,
20
+ help="Path to the CSV file containing the SAP Concur data.",
21
+ required=True,
22
+ )
23
+ def sync_vulns(regscale_ssp_id: int, path: str):
24
+ """
25
+ Synchronize vulnerabilities from SAP Concur Tenable data.
26
+ """
27
+ from .scanner import SAPConcurScanner
28
+
29
+ SAPConcurScanner(plan_id=regscale_ssp_id).sync_findings(plan_id=regscale_ssp_id, path=path)
30
+
31
+
32
+ @tenable.command(name="sync_assets")
33
+ @regscale_ssp_id()
34
+ @click.option(
35
+ "--path",
36
+ type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True),
37
+ help="Path to the CSV file containing the SAP Concur data.",
38
+ required=True,
39
+ )
40
+ def sync_assets(regscale_ssp_id: int, path: str):
41
+ """
42
+ Synchronize assets from SAP Concur Tenable data.
43
+
44
+ :param int regscale_ssp_id: RegScale System Security Plan ID
45
+ :param str path: Path to the CSV file containing the SAP Concur data
46
+ """
47
+ from .scanner import SAPConcurScanner
48
+
49
+ SAPConcurScanner(plan_id=regscale_ssp_id).sync_assets(plan_id=regscale_ssp_id, path=path)
@@ -0,0 +1,196 @@
1
+ import csv
2
+ import logging
3
+ from typing import Any, Dict, Iterator, Tuple
4
+
5
+ from regscale.core.app.utils.parser_utils import safe_datetime_str, safe_float, safe_int
6
+ from regscale.integrations.scanner_integration import (
7
+ IntegrationAsset,
8
+ IntegrationFinding,
9
+ ScannerIntegration,
10
+ issue_due_date,
11
+ )
12
+ from regscale.models import regscale_models
13
+
14
+ logger = logging.getLogger("regscale")
15
+
16
+ # Constants for repeated literals
17
+ IP_ADDRESS_ANONYMIZED = "IP Address (Anonymized)"
18
+ DNS_NAME = "DNS Name"
19
+ LAST_OBSERVED = "Last Observed"
20
+ CVSS_V3_BASE_SCORE = "CVSS V3 Base Score"
21
+
22
+
23
+ class SAPConcurScanner(ScannerIntegration):
24
+ title = "SAP Concur"
25
+ asset_identifier_field = "tenableId"
26
+ finding_severity_map = {
27
+ "critical": regscale_models.IssueSeverity.Critical,
28
+ "high": regscale_models.IssueSeverity.High,
29
+ "medium": regscale_models.IssueSeverity.Moderate,
30
+ "low": regscale_models.IssueSeverity.Low,
31
+ }
32
+
33
+ def parse_assets(self, asset: Dict[str, Any]) -> IntegrationAsset:
34
+ """
35
+ Parse a single asset from the vulnerability data.
36
+
37
+ :param Dict[str, Any] asset: A dictionary containing the asset data
38
+ :return: An IntegrationAsset object with parsed data
39
+ :rtype: IntegrationAsset
40
+ """
41
+ ip_address = asset.get(IP_ADDRESS_ANONYMIZED, "")
42
+ external_id = asset.get("Host ID") or ip_address # Use Host ID if available, otherwise use IP address
43
+
44
+ return IntegrationAsset(
45
+ name=asset.get(DNS_NAME) or ip_address,
46
+ identifier=external_id,
47
+ asset_type="Server",
48
+ asset_category="Infrastructure",
49
+ status="Active (On Network)",
50
+ date_last_updated=safe_datetime_str(asset.get(LAST_OBSERVED)),
51
+ ip_address=ip_address,
52
+ mac_address=asset.get("MAC Address"),
53
+ fqdn=asset.get(DNS_NAME),
54
+ component_names=[],
55
+ external_id=external_id,
56
+ software_name=asset.get("Plugin Name"),
57
+ software_version=asset.get("Version"),
58
+ operating_system=None,
59
+ os_version=None,
60
+ source_data=asset,
61
+ url=None,
62
+ ports_and_protocols=(
63
+ [
64
+ {
65
+ "start_port": safe_int(asset.get("Port")),
66
+ "end_port": safe_int(asset.get("Port")),
67
+ "protocol": asset.get("Protocol"),
68
+ }
69
+ ]
70
+ if safe_int(asset.get("Port"))
71
+ else []
72
+ ),
73
+ software_inventory=[],
74
+ notes=f"NetBIOS Name: {asset.get('NetBIOS Name', '')}, Repository: {asset.get('Repository', '')}",
75
+ )
76
+
77
+ def fetch_assets(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationAsset]:
78
+ """
79
+ Fetch assets from a CSV file and yield IntegrationAsset objects.
80
+
81
+ :param Tuple args: Variable length argument list
82
+ :param dict kwargs: Arbitrary keyword arguments
83
+ :return: An iterator of IntegrationAsset objects
84
+ :rtype: Iterator[IntegrationAsset]
85
+ """
86
+ path: str = kwargs.get("path", "")
87
+ if not path:
88
+ raise ValueError("Path is required")
89
+
90
+ logger.info(f"Fetching assets from {path}")
91
+ with open(path, "r", newline="") as csvfile:
92
+ reader = csv.DictReader(csvfile)
93
+ for row in reader:
94
+ yield self.parse_assets(row)
95
+
96
+ def fetch_findings(self, *args: Tuple, **kwargs: dict) -> Iterator[IntegrationFinding]:
97
+ """
98
+ Fetch findings from a CSV file and yield IntegrationFinding objects.
99
+
100
+ :param Tuple args: Variable length argument list
101
+ :param dict kwargs: Arbitrary keyword arguments
102
+ :return: An iterator of IntegrationFinding objects
103
+ :rtype: Iterator[IntegrationFinding]
104
+ """
105
+ path: str = kwargs.get("path", "")
106
+ if not path:
107
+ raise ValueError("Path is required")
108
+
109
+ logger.info(f"Fetching findings from {path}")
110
+
111
+ with open(path, "r", newline="") as csvfile:
112
+ reader = csv.DictReader(csvfile)
113
+ for row in reader:
114
+ yield from self.parse_findings(row)
115
+
116
+ def parse_findings(self, finding: Dict[str, Any]) -> Iterator[IntegrationFinding]:
117
+ """
118
+ Parse a single finding from the vulnerability data.
119
+
120
+ :param Dict[str, Any] finding: A dictionary containing the finding data
121
+ :return: An iterator of IntegrationFinding objects
122
+ :rtype: Iterator[IntegrationFinding]
123
+ """
124
+ severity = self.finding_severity_map.get(finding["Severity"].lower(), regscale_models.IssueSeverity.Low)
125
+ cves = finding.get("CVE", "").split(",") if finding.get("CVE") else []
126
+
127
+ if not cves:
128
+ # If there are no CVEs, yield a single finding without CVE information
129
+ yield self._create_finding(finding, severity)
130
+ else:
131
+ # If there are CVEs, yield a finding for each CVE
132
+ for cve in cves:
133
+ yield self._create_finding(finding, severity, cve.strip())
134
+
135
+ def _create_finding(
136
+ self, finding: Dict[str, Any], severity: regscale_models.IssueSeverity, cve: str = ""
137
+ ) -> IntegrationFinding:
138
+ """
139
+ Create an IntegrationFinding object from the given data.
140
+
141
+ :param Dict[str, Any] finding: A dictionary containing the finding data
142
+ :param regscale_models.IssueSeverity severity: The severity of the finding
143
+ :param str cve: The CVE number (optional)
144
+ :return: An IntegrationFinding object
145
+ :rtype: IntegrationFinding
146
+ """
147
+ return IntegrationFinding(
148
+ control_labels=[],
149
+ title=finding.get("Plugin Name"),
150
+ category=finding.get("Family", "Unknown"),
151
+ plugin_name=finding.get("Plugin", ""),
152
+ severity=severity,
153
+ description=finding.get("Description", ""),
154
+ status=regscale_models.IssueStatus.Open,
155
+ priority=finding.get("Vulnerability Priority Rating", "Medium"),
156
+ first_seen=safe_datetime_str(finding.get("First Discovered")),
157
+ last_seen=safe_datetime_str(finding.get(LAST_OBSERVED)),
158
+ cve=cve,
159
+ cvss_v3_score=safe_float(finding.get(CVSS_V3_BASE_SCORE)),
160
+ cvss_v2_score=safe_float(finding.get("CVSS V2 Base Score")),
161
+ ip_address=finding.get(IP_ADDRESS_ANONYMIZED),
162
+ plugin_id=finding.get("Plugin"),
163
+ dns=finding.get(DNS_NAME),
164
+ issue_title=f"Vulnerability {finding.get('Plugin Name')} found",
165
+ issue_type="Risk",
166
+ date_created=safe_datetime_str(finding.get("First Discovered")),
167
+ date_last_updated=safe_datetime_str(finding.get(LAST_OBSERVED)),
168
+ due_date=issue_due_date(severity=severity, created_date=safe_datetime_str(finding.get("First Discovered"))),
169
+ external_id=finding.get("Plugin"),
170
+ gaps="",
171
+ observations="",
172
+ evidence=finding.get("Plugin Output", ""),
173
+ identified_risk=finding.get("Risk Factor", ""),
174
+ impact="",
175
+ recommendation_for_mitigation=finding.get("Steps to Remediate", ""),
176
+ asset_identifier=finding.get(IP_ADDRESS_ANONYMIZED, ""),
177
+ comments=None,
178
+ poam_comments=None,
179
+ cci_ref=None,
180
+ rule_id=finding.get("Plugin", ""),
181
+ rule_version=finding.get("Version", ""),
182
+ results="",
183
+ baseline="",
184
+ vulnerability_number=cve,
185
+ oval_def="",
186
+ scan_date=safe_datetime_str(finding.get(LAST_OBSERVED)),
187
+ rule_id_full="",
188
+ group_id="",
189
+ vulnerable_asset=finding.get(IP_ADDRESS_ANONYMIZED, ""),
190
+ remediation=finding.get("Steps to Remediate", ""),
191
+ cvss_score=safe_float(finding.get(CVSS_V3_BASE_SCORE) or finding.get("CVSS V2 Base Score")),
192
+ cvss_v3_base_score=safe_float(finding.get(CVSS_V3_BASE_SCORE)),
193
+ source_rule_id=finding.get("Plugin", ""),
194
+ vulnerability_type=finding.get("Family", ""),
195
+ basis_for_adjustment=None,
196
+ )