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,429 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # pylint: disable=I1101, W0212
4
+ """Functions used to interact with RegScale API"""
5
+
6
+ # standard imports
7
+ import io
8
+ import json
9
+ import pickle
10
+ import re
11
+ import tempfile
12
+ import time
13
+ import zipfile
14
+ from datetime import datetime
15
+ from pathlib import Path
16
+ from typing import Any, List, Optional, Set, Tuple, Union
17
+ from xml.etree.ElementTree import Element
18
+
19
+ import psutil
20
+ import requests
21
+ from lxml import etree
22
+
23
+ from regscale.core.app.application import Application
24
+ from regscale.core.app.logz import create_logger
25
+ from regscale.core.app.utils.app_utils import convert_datetime_to_regscale_string, error_and_exit
26
+ from regscale.models.regscale_models.asset import Asset
27
+ from regscale.models.regscale_models.vulnerability import Vulnerability
28
+
29
+ logger = create_logger()
30
+ ARTIFACTS_PATH = Path.cwd() / "artifacts"
31
+
32
+
33
+ class IteratorConsumptionError(Exception):
34
+ """
35
+ Exception raised when an error occurs while consuming an iterator
36
+
37
+ :param str message: Error message, defaults to "Error while consuming iterator"
38
+ """
39
+
40
+ def __init__(self, message: str = "Error while consuming iterator"):
41
+ self.message = message
42
+ super().__init__(self.message)
43
+
44
+
45
+ def extract_version(cpe: str) -> Optional[Any]:
46
+ """
47
+ Function returns version from CPE string
48
+
49
+ :param str cpe: CPE string
50
+ :return: version
51
+ :rtype: Optional[Any]
52
+ """
53
+ match = re.search(r"\d+(\.\d+)*", cpe)
54
+ if match and len(match.group()) > 1:
55
+ return match.group()
56
+ return None
57
+
58
+
59
+ def determine_identifier(asset: Asset) -> str:
60
+ """
61
+ Function returns asset identifier
62
+
63
+ :param Asset asset: RegScale Asset
64
+ :return: asset identifier
65
+ :rtype: str
66
+ """
67
+ # Determine the identifier based on the following priority order.
68
+ # If the first attribute is not set, then the next attribute is checked, etc.
69
+ attributes_to_check = [
70
+ asset.name,
71
+ asset.fqdn,
72
+ asset.ipAddress,
73
+ asset.macAddress,
74
+ asset.awsIdentifier,
75
+ ]
76
+ return next((attr for attr in attributes_to_check if attr), "")
77
+
78
+
79
+ def get_cpe_file(download: bool = False) -> Path:
80
+ """
81
+ Function updates CPE file
82
+
83
+ :param bool download: Whether to download the file, defaults to False
84
+ :return: Path to CPE file
85
+ :rtype: Path
86
+ """
87
+ url = "https://nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-dictionary_v2.2.xml.zip"
88
+ save_path = ARTIFACTS_PATH / "official-cpe-dictionary_v2.2.xml"
89
+ if not ARTIFACTS_PATH.exists():
90
+ ARTIFACTS_PATH.mkdir()
91
+ download = True
92
+ if not save_path.exists():
93
+ download = True
94
+ # Download file
95
+ if download:
96
+ # rm file if already exists
97
+ if save_path.exists():
98
+ save_path.unlink()
99
+ logger.info("Downloading CPE file from %s", url)
100
+ response = requests.get(url=url, timeout=60)
101
+ if response.status_code == 200:
102
+ with zipfile.ZipFile(io.BytesIO(response.content), "r") as zip_ref:
103
+ zip_ref.extractall(ARTIFACTS_PATH)
104
+ logger.info("File downloaded and extracted successfully to %s", ARTIFACTS_PATH)
105
+ else:
106
+ logger.error("Failed to download the file. Status code: %i", response.status_code)
107
+ return save_path
108
+
109
+
110
+ def filter_severity(list_of_vulns: List[Vulnerability], minimum_severity: str) -> List[Vulnerability]:
111
+ """
112
+ Filter out vulnerabilities based on a minimum severity level
113
+
114
+ :param List[Vulnerability] list_of_vulns: list of vulnerabilities
115
+ :param str minimum_severity: minimum severity level
116
+ :return: list of vulnerabilities
117
+ :rtype: List[Vulnerability]
118
+ """
119
+ result_vulns = []
120
+ severities = {0: "low", 1: "moderate", 2: "high", 3: "critical"}
121
+ # select severity from severities by value
122
+ try:
123
+ val = next(severity for severity, value in severities.items() if value == minimum_severity)
124
+ except StopIteration:
125
+ logger.warning(
126
+ "Unable to get minimum_severity value from config value: %s, defaulting to low",
127
+ minimum_severity,
128
+ )
129
+ val = 0
130
+ for vuln in list_of_vulns:
131
+ vuln.severity = "moderate" if vuln.severity == "medium" else vuln.severity
132
+ try:
133
+ vuln_val = next(severity for severity, value in severities.items() if value == vuln.severity.lower())
134
+ except StopIteration:
135
+ logger.warning(
136
+ "Unable to get severity value from vulnerability: %s, defaulting to low",
137
+ vuln.severity,
138
+ )
139
+ if vuln_val >= val:
140
+ result_vulns.append(vuln)
141
+ return result_vulns
142
+
143
+
144
+ def get_cpe_data() -> Tuple[etree._ElementTree, List[dict[Any, Any]]]:
145
+ """
146
+ Get the CPE data
147
+
148
+ :return: CPE Root and CPE data
149
+ :rtype: Tuple[etree._ElementTree, List[dict[Any, Any]]]
150
+ """
151
+ cpe_list = []
152
+ cpe_root = etree._ElementTree()
153
+ try:
154
+ cpe_root = etree.parse(get_cpe_file())
155
+ cpe_list = cpe_xml_to_dict(cpe_root)
156
+ except OSError:
157
+ error_and_exit("Error parsing CPE file, unable to access file.")
158
+ return cpe_root, cpe_list
159
+
160
+
161
+ def get_min_cvss_score(severity: str) -> float:
162
+ """
163
+ Get the minimum CVSS score for a given severity level
164
+
165
+ :param str severity: The severity level
166
+ :return: The minimum CVSS score
167
+ :rtype: float
168
+ """
169
+ severity_levels = {
170
+ "critical": 9.9,
171
+ "high": 7.0,
172
+ "medium": 4.0,
173
+ "moderate": 4.0,
174
+ "low": 0.1,
175
+ "info": 0.0, # Assuming Info has a minimum value of 0
176
+ # You can add more severity levels if needed
177
+ }
178
+
179
+ return severity_levels.get(severity, None)
180
+
181
+
182
+ def get_due_delta(app: Application, severity: str) -> int:
183
+ """
184
+ Find the due delta from the config file
185
+
186
+ :param Application app: The app object
187
+ :param str severity: The severity level
188
+ :return: Due date delta
189
+ :rtype: int
190
+ """
191
+ due_delta = app.config["issues"]["tenable"]["low"]
192
+ if severity.lower() in ["medium", "moderate"]:
193
+ due_delta = app.config["issues"]["tenable"]["moderate"]
194
+ elif severity.lower() == "high":
195
+ due_delta = app.config["issues"]["tenable"]["high"]
196
+ elif severity.lower() == "critical":
197
+ due_delta = app.config["issues"]["tenable"]["critical"]
198
+ return due_delta
199
+
200
+
201
+ def determine_available_space() -> float:
202
+ """
203
+ Determine if there is enough space to store the reports
204
+
205
+ :return: Available space in bytes for the temp directory
206
+ :rtype: float
207
+ """
208
+ tmp_dir = tempfile.gettempdir()
209
+ available_space = psutil.disk_usage(tmp_dir).free
210
+ return available_space
211
+
212
+
213
+ def determine_needed_space(vuln_list: List[dict], total_chunks: int) -> int:
214
+ """
215
+ Determine the approximate size required to store Tenable IO data temporarily on temp disk.
216
+
217
+ :param List[dict] vuln_list: List of vulnerabilities
218
+ :param int total_chunks: Total number of chunks
219
+ :return: Rough size of all chunks in bytes
220
+ :rtype: int
221
+ """
222
+ if not vuln_list:
223
+ # No list, you have an empty query
224
+ return 0
225
+ with tempfile.TemporaryFile() as temp_file:
226
+ # determine the size of the first chunk as a pickle
227
+ pickle.dump(vuln_list, temp_file)
228
+ # Get the size of the file in bytes
229
+ temp_file.seek(0, 2) # Seek to the end of the file
230
+ file_size = temp_file.tell()
231
+ logger.debug("1st Chunk File size: %s", file_size)
232
+ # file deletes on close
233
+ return total_chunks * file_size
234
+
235
+
236
+ def get_minimum_severity(app: Application) -> str:
237
+ """
238
+ Find the minimum severity level from the config file
239
+
240
+ :param Application app: The app object
241
+ :return: Minimum severity level
242
+ :rtype: str
243
+ """
244
+ config = app.config
245
+ minimum_severity = "low"
246
+ if "tenableMinimumSeverityFilter" in config:
247
+ minimum_severity = app.config["tenableMinimumSeverityFilter"]
248
+ else:
249
+ # update config
250
+ config["tenableMinimumSeverityFilter"] = minimum_severity
251
+ app.save_config(config)
252
+ return minimum_severity
253
+
254
+
255
+ def lookup_kev(cve: Optional[str], data: Optional[list[dict]] = None) -> Tuple[Any, Any]:
256
+ """
257
+ Determine if the cve is part of the published CISA KEV list
258
+
259
+ :param Optional[str] cve: The CVE to lookup.
260
+ :param Optional[list[dict]] data: The KEV data, defaults to None
261
+ :return: A tuple containing the KEV data and the date.
262
+ :rtype: Tuple[Any, Any]
263
+ """
264
+ kev_data = None
265
+ kev_date = None
266
+ if not cve:
267
+ return kev_data, kev_date
268
+ if data:
269
+ try:
270
+ # Update kev and date
271
+ kev_data = next(
272
+ dat
273
+ for dat in data["vulnerabilities"]
274
+ if "vulnerabilities" in data and cve and dat["cveID"].lower() == cve.lower()
275
+ )
276
+ except (StopIteration, ConnectionRefusedError):
277
+ kev_data = None
278
+ if kev_data:
279
+ # Convert YYYY-MM-DD to datetime
280
+ kev_date = convert_datetime_to_regscale_string(datetime.strptime(kev_data["dueDate"], "%Y-%m-%d"))
281
+ return kev_data, kev_date
282
+
283
+
284
+ def cpe_xml_to_dict(cpe_root: etree._ElementTree) -> List[dict]:
285
+ """
286
+ Function returns a dict of CPEs by name
287
+
288
+ :param etree._ElementTree cpe_root: cpe root element
289
+ :return: cpe_items
290
+ :rtype: List[dict]
291
+ """
292
+ mitre_reference_ns = (
293
+ "{http://cpe.mitre.org/dictionary/2.0}references/{http://cpe.mitre.org/dictionary/2.0}reference"
294
+ )
295
+ cpe_items = []
296
+ # Create folder with Path
297
+ artifacts_path = Path.cwd() / "artifacts"
298
+ artifacts_path.mkdir(parents=True, exist_ok=True)
299
+ cpe_json = artifacts_path / "cpe_items.json"
300
+ if not cpe_json.exists():
301
+ logger.info("Creating cpe_items.json on initial run.")
302
+ for cpe_item in cpe_root.iterfind("{http://cpe.mitre.org/dictionary/2.0}cpe-item"):
303
+ name = cpe_item.get("name")
304
+ title = cpe_item.find("{http://cpe.mitre.org/dictionary/2.0}title").text
305
+ references = [ref.get("href") for ref in cpe_item.iterfind(mitre_reference_ns)]
306
+ cpe_items.append({"name": name, "title": title, "references": references})
307
+ with open(cpe_json, "w", encoding="utf-8") as file:
308
+ json.dump(cpe_items, file)
309
+ else:
310
+ logger.debug("Loading cpe_items.json")
311
+ with open(cpe_json, "r", encoding="utf-8") as file:
312
+ cpe_items = json.load(file)
313
+ return cpe_items
314
+
315
+
316
+ def lookup_cpes_by_name(cpes: Set[dict], cpe_items: List[dict]) -> List[dict]:
317
+ """
318
+ Function returns CPE items by name
319
+
320
+ :param Set[dict] cpes: set of CPE names
321
+ :param List[dict] cpe_items: list of cpe-item dicts
322
+ :return: CPE items
323
+ :rtype: List[dict]
324
+ """
325
+
326
+ def gen_items():
327
+ """
328
+ Generator function returns CPE items by name
329
+
330
+ """
331
+ result = []
332
+ for cpe_item in cpe_items:
333
+ if cpe_item["name"] in cpes:
334
+ cpe_item["version"] = extract_version(cpe_item["name"])
335
+ result.append(cpe_item)
336
+ yield result
337
+
338
+ start = time.time()
339
+ gen = gen_items()
340
+ try:
341
+ results = next(gen)
342
+ except StopIteration:
343
+ results = None
344
+ if results:
345
+ end = time.time()
346
+ logger.debug("lookup_cpes_by_name() took %s seconds", end - start)
347
+ return results
348
+
349
+
350
+ def lookup_cpe_item_by_name(name: str, cpe_items: List[dict]) -> Optional[dict]:
351
+ """
352
+ Function returns CPE item by name
353
+
354
+ :param str name: CPE name
355
+ :param List[dict] cpe_items: list of cpe-item dicts
356
+ :return: CPE item
357
+ :rtype: Optional[dict]
358
+ """
359
+
360
+ def gen_item():
361
+ """
362
+ Generator function returns CPE item by name
363
+
364
+ """
365
+ for cpe_item in cpe_items:
366
+ if name == cpe_item["name"]:
367
+ yield cpe_item
368
+
369
+ start = time.time()
370
+ # Generator
371
+ gen = gen_item()
372
+ try:
373
+ item = next(gen)
374
+ except StopIteration:
375
+ item = None
376
+ if item:
377
+ name = item["name"]
378
+ title = item["title"]
379
+ references = item["references"]
380
+ end = time.time()
381
+ logger.debug("lookup_cpe_item_by_name() took %s seconds", end - start)
382
+ return {
383
+ "Name": name,
384
+ "Title": title,
385
+ "References": references,
386
+ }
387
+ return item
388
+
389
+
390
+ def software(cpe_items: List[dict], report_host: Element) -> List[dict]:
391
+ """
392
+ Function returns software inventory from Nessus host
393
+
394
+ :param List[dict] cpe_items: the list of cpes
395
+ :param Element report_host: report host element
396
+ :return: inventory
397
+ :rtype: List[dict]
398
+ """
399
+ start = time.time()
400
+ cpes = set()
401
+ for tag in report_host[0].iterfind("tag"):
402
+ tag_name = tag.get("name")
403
+ if re.findall("cpe", tag_name) and tag_name is not None:
404
+ cpe = (tag.text).split("->")[0].strip()
405
+ cpes.add(cpe)
406
+ inventory = lookup_cpes_by_name(cpes, cpe_items)
407
+ end = time.time()
408
+ logger.debug("software() took %s seconds", end - start)
409
+
410
+ return inventory
411
+
412
+
413
+ def validate_nessus_severity(severity: str) -> str:
414
+ """
415
+ Validate a Nessus severity
416
+
417
+ :param str severity: The nessus severity
418
+ :raises ValueError: If the tenableMinimumSeverityFilter severity is not valid
419
+ :return: The validated severity
420
+ :rtype: str
421
+ """
422
+ if severity.lower() in ["info", "low", "medium", "high", "critical"]:
423
+ return severity
424
+ if severity.lower == "moderate":
425
+ return "medium"
426
+ raise ValueError(
427
+ "Invalid tenableMinimumSeverityFilter setting in the configuration. "
428
+ + "Must be one of: low, medium, high, or critical"
429
+ )