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
@@ -0,0 +1,138 @@
1
+ from typing import List, Optional
2
+ from typing_extensions import TypedDict
3
+
4
+ from lxml import etree
5
+ from pydantic import BaseModel, ConfigDict, Field
6
+
7
+ from regscale.core.app.api import Api
8
+ from regscale.core.app.logz import create_logger
9
+ from regscale.integrations.public.fedramp.reporting import log_error, log_event
10
+ from regscale.models import regscale_models, StakeHolder, SystemRole
11
+
12
+ logger = create_logger()
13
+
14
+
15
+ class LogEventArgs(TypedDict):
16
+ """
17
+ Args for the log_event function.
18
+ """
19
+
20
+ record_type: str
21
+ event_msg: str
22
+ model_layer: str
23
+
24
+
25
+ class LogErrorArgs(TypedDict):
26
+ """
27
+ Args for the log_error function.
28
+ """
29
+
30
+ record_type: str
31
+ missing_element: Optional[str]
32
+ model_layer: str
33
+ event_msg: str
34
+
35
+
36
+ class FedrampTraversalError(TypedDict):
37
+ timestamp: str
38
+ level: str
39
+ model_layer: str
40
+ record_type: str
41
+ event: str
42
+
43
+
44
+ class FedrampTraversalInfo(TypedDict):
45
+ timestamp: str
46
+ level: str
47
+ model_layer: str
48
+ record_type: str
49
+ event: str
50
+
51
+
52
+ class FedrampTraversal(BaseModel):
53
+ model_config = ConfigDict(arbitrary_types_allowed=True)
54
+
55
+ # The Regscale API object we'll use to post from this traversal.
56
+ api: Api
57
+
58
+ # The root XML element.
59
+ root: etree._Element
60
+
61
+ # Namespaces for this traversal
62
+ namespaces: Optional[dict] = None
63
+
64
+ # This is the id of the ssp in RegScale, if it has been created.
65
+ ssp_id: Optional[int] = None
66
+
67
+ # This is the id of the catalogue in RegScale that the user has selected during upload.
68
+ catalogue_id: Optional[int] = None
69
+
70
+ # List of errors that have occurred during the traversal.
71
+ errors: List[FedrampTraversalError] = Field(default_factory=list)
72
+
73
+ # List of info messages that have occurred during the traversal.
74
+ infos: List[FedrampTraversalInfo] = Field(default_factory=list)
75
+
76
+ def fedramp_role_id_to_regscale_system_role_id(self, fedramp_role_id: str) -> Optional[int]:
77
+ """
78
+ Get the RegScale SystemRole.id for a FedRAMP role id, contained in this SSP.
79
+
80
+ If no such mapping exists, returns None.
81
+ """
82
+ # FUTURE-TODO: SPEED-OPTIMIZATION -- This could be cached on the traversal object,
83
+ # so it doesn't have to be refetched.
84
+ ssp_system_roles = SystemRole.get_all_by_ssp_id(self.api.app, self.ssp_id)
85
+
86
+ try:
87
+ matching_system_roles = [
88
+ system_role for system_role in ssp_system_roles if system_role["fedrampRoleId"] == fedramp_role_id
89
+ ]
90
+ except (KeyError, AttributeError):
91
+ matching_system_roles = [
92
+ system_role for system_role in ssp_system_roles if system_role.fedrampRoleId == fedramp_role_id
93
+ ]
94
+
95
+ first_matching_system_role = matching_system_roles[0] if matching_system_roles else None
96
+ return first_matching_system_role["id"] if first_matching_system_role else None
97
+
98
+ def fedramp_party_to_regscale_stakeholder_id(self, party_fedramp_uuid: str) -> Optional[int]:
99
+ """
100
+ Get the RegScale Stakeholder.id for a FedRAMP party UUID, contained in this SSP.
101
+
102
+ If no such mapping exists, returns None.
103
+ """
104
+ # Parties MIGHT be able to be multiple things
105
+ # FOR SURE
106
+ # - Stakeholder
107
+ # All stakeholders
108
+ # FUTURE-TODO: SPEED-OPTIMIZATION -- This could be cached on the traversal object,
109
+ # so it doesn't have to be refetched.
110
+ stakeholders = StakeHolder.get_all_by_parent(
111
+ parent_id=self.ssp_id,
112
+ parent_module=regscale_models.SecurityPlan.get_module_slug(),
113
+ )
114
+
115
+ # Debug only.
116
+ logger.debug("stakeholders", stakeholders)
117
+
118
+ # get stakeholders with otherID = party_fedramp_uuid
119
+ matching_stakeholders = [
120
+ stakeholder for stakeholder in stakeholders if stakeholder.otherID == party_fedramp_uuid
121
+ ]
122
+
123
+ first_matching_stakeholder = matching_stakeholders[0] if matching_stakeholders else None
124
+
125
+ return first_matching_stakeholder.id if first_matching_stakeholder else None
126
+
127
+ # TODO-FUTURE: MAYBE these need to be handled too?
128
+ # - SystemRole
129
+ # - User (probably not)
130
+
131
+ # Add an error to the traversal.
132
+ def log_error(self, error: LogErrorArgs):
133
+ # logger.error(f"{error.error_level}: {error.error_msg}")
134
+ self.errors.append(log_error(**error, level="Error"))
135
+
136
+ def log_info(self, event: LogEventArgs):
137
+ # logger.info(f"{info.info_level}: {info.info_msg}")
138
+ self.infos.append(log_event(**event, level="Info"))
@@ -0,0 +1,279 @@
1
+ """Import FedRAMP Revision 4 SSP XML into RegScale"""
2
+
3
+ # flake8: noqa
4
+ from datetime import datetime
5
+ from typing import Any, Dict, Tuple, Generator, Optional
6
+
7
+ from lxml import etree
8
+ from pydantic import ValidationError
9
+
10
+ from regscale.core.app.api import Api
11
+ from regscale.core.app.application import Application
12
+ from regscale.core.app.logz import create_logger
13
+ from regscale.integrations.public.fedramp.fedramp_traversal import FedrampTraversal
14
+ from regscale.integrations.public.fedramp.metadata import parse_metadata
15
+ from regscale.integrations.public.fedramp.reporting import write_events
16
+ from regscale.integrations.public.fedramp.system_characteristics import (
17
+ parse_minimum_ssp,
18
+ parse_system_characteristics,
19
+ )
20
+ from regscale.integrations.public.fedramp.system_control_implementations import (
21
+ fetch_implementations,
22
+ )
23
+ from regscale.integrations.public.fedramp.system_implementation import (
24
+ parse_system_implementation,
25
+ )
26
+ from regscale.core.app.utils.app_utils import (
27
+ get_file_name,
28
+ )
29
+ from regscale.core.app.utils.regscale_utils import create_new_data_submodule
30
+ from regscale.models.regscale_models import File, SecurityPlan
31
+
32
+ logger = create_logger()
33
+
34
+
35
+ def parse_and_load_xml_rev4(
36
+ context: Any, file_path: str, catalogue_id: int, filename: str = "Sample.xml"
37
+ ) -> Generator[Tuple[str, Dict, Dict], None, None]:
38
+ """
39
+ Parse and load XML Rev4
40
+
41
+ :param Any context: Flask app context
42
+ :param str file_path: Path to XML file
43
+ :param int catalogue_id: Catalogue ID user selected
44
+ :param str filename: Name of file that will be uploaded to RegScale
45
+ :yields Generator[Tuple[str, Dict, Dict]]: Tuple of filename and upload results
46
+ :return: Tuple of filename and upload results
47
+ :rtype: Generator[Tuple[str, Dict, Dict]]
48
+ """
49
+ # Process with app request context to yield partial content to the browser
50
+ # with context:
51
+ logger.info(f"Parsing and loading file {file_path}.")
52
+ events_list = [] # will store events as they take place throughout the import process
53
+ app = Application()
54
+ api = Api()
55
+ events_list = [] # will store events as they take place throughout the import process
56
+
57
+ ns = {
58
+ "ns1": "http://csrc.nist.gov/ns/oscal/1.0",
59
+ "oscal": "http://csrc.nist.gov/ns/oscal/1.0",
60
+ "fedramp": "https://fedramp.gov/ns/oscal",
61
+ }
62
+ if context is not None:
63
+ yield "<div>Creating Security Plan...</div>"
64
+ tree = etree.parse(file_path)
65
+ root = tree.getroot()
66
+ ssp_uuid = root.attrib["uuid"]
67
+ new_ssp = {"uuid": ssp_uuid}
68
+
69
+ # Create fedramp traversal object.
70
+ trv = FedrampTraversal(
71
+ api=api,
72
+ root=root,
73
+ namespaces=ns,
74
+ )
75
+ # --- Set the catalogue_id on the traversal object.
76
+ trv.catalogue_id = catalogue_id
77
+
78
+ # 0. Create the EMPTY SSP that we need for later posts.
79
+ ssp_id = parse_minimum_ssp(api=api, root=root, new_ssp=new_ssp, ns=ns, events_list=events_list)
80
+ logger.info(f"Created new SSP in RegScale with ID {ssp_id}.")
81
+ # --- Set the ssp_id on the traversal object.
82
+ trv.ssp_id = ssp_id
83
+
84
+ # -- validate oscal ssp via API call
85
+ validatefile = "artifacts/validation-results.csv"
86
+ now = datetime.now()
87
+ validatefile = validatefile.replace(".", "-SSP-{0}_".format(ssp_id) + now.strftime("%Y%m%d."))
88
+
89
+ logger.info("Validating OSCAL file... please stand by.")
90
+ valid_msg = validate_oscal(trv, file_path)
91
+ validate_list = valid_msg
92
+ logger.info(valid_msg)
93
+ logger.info("Validation complete.")
94
+
95
+ write_events(validate_list, validatefile)
96
+ attach_artifact_to_ssp(trv=trv, file_path=validatefile, tags="imported-oscal-validation-report,")
97
+
98
+ trv.log_info(
99
+ {
100
+ "record_type": "oscal",
101
+ "event_msg": f"OSCAL validation of file '{get_file_name(file_path)}' ran successfully."
102
+ "Validation result file in RegScale.",
103
+ }
104
+ )
105
+
106
+ # 1. Parse the <metadata> tag
107
+ parse_metadata(trv, app)
108
+ if context is not None:
109
+ yield "<div>Parsing metadata...</div>"
110
+
111
+ # upload xml file & data submodules in the SSP
112
+ attach_artifact_to_ssp(trv=trv, file_path=file_path, tags="system-security-plan,")
113
+
114
+ # 2. Parse the <system-characteristics> tag
115
+ parse_system_characteristics(ssp_id=ssp_id, root=root, ns=ns, events_list=events_list)
116
+ logger.info("System characteristics parsed successfully.")
117
+
118
+ # 3. Parse the <system-implementation> tag!
119
+ if context is not None:
120
+ yield "<div>Creating control implementations (this may take several minutes)...</div>"
121
+ parse_system_implementation(trv)
122
+ if context is not None:
123
+ yield "<div>Control implementations created.</div>"
124
+
125
+ # 4. TODO <control-implementation>
126
+ # parse_control_implementation()
127
+
128
+ # 5. Parse <back-matter>
129
+ # parse_back_matter()
130
+
131
+ # Write the events.
132
+ resultfile = "artifacts/import-results.csv"
133
+ now = datetime.now()
134
+ resultfile = resultfile.replace(".", "-SSP-{0}_".format(ssp_id) + now.strftime("%Y%m%d."))
135
+
136
+ logger.info("Uploading SSP to RegScale...")
137
+ if context is not None:
138
+ yield "<div>Uploading source SSP to RegScale...</div>"
139
+
140
+ try:
141
+ ssp = SecurityPlan(**new_ssp)
142
+ except ValidationError as exc:
143
+ logger.error(f"Failed to validate: {exc}")
144
+ return resultfile, {
145
+ "status": "failed",
146
+ }
147
+ # you can create a new ssp without the userId populated, but we normally use the userId from init.yaml
148
+ ssp.systemOwnerId = app.config["userId"]
149
+ ssp.id = ssp_id
150
+ ssp.uuid = ssp_uuid
151
+ new_ssp = ssp.update_ssp(api=api, return_id=False)
152
+ new_ssp_id = new_ssp.id
153
+ oscal_implementations = fetch_implementations(trv=trv, root=root, ssp=new_ssp)
154
+
155
+ upload_results = {
156
+ "ssp_id": new_ssp_id,
157
+ "implementations_loaded": len(oscal_implementations),
158
+ "ssp_title": new_ssp.systemName,
159
+ }
160
+ logger.info(f"Finished uploading SSP {ssp_id}")
161
+
162
+ final_list = [*events_list, *trv.errors, *trv.infos]
163
+ write_events(final_list, resultfile)
164
+
165
+ # upload privacyImpactAssessment. If is None then dont.
166
+ logger.info(f"Uploading validation results for import SSP {new_ssp_id}")
167
+ attach_artifact_to_ssp(trv=trv, file_path=resultfile, tags="imported-security-plan-report,")
168
+ if context is None:
169
+ return resultfile, upload_results, oscal_implementations
170
+ else:
171
+ yield resultfile, upload_results, oscal_implementations
172
+
173
+
174
+ def validate_oscal(trv: FedrampTraversal, file_path: str) -> Optional[list[str]]:
175
+ """
176
+ Function to validate the SSP XML file against NIST OSCAL constraints
177
+
178
+ :param FedrampTraversal trv: FedrampTraversal object
179
+ :param str file_path: Path to the file to validate
180
+ :raises ValueError: If the file size is over 100 MB
181
+ :return: List of validation results
182
+ :rtype: Optional[list[str]]
183
+ """
184
+ api = trv.api
185
+ file_data = [bytes]
186
+
187
+ file_path, file_size = File._check_compression(file_path=file_path, size_limit_mb=100, file_data=file_data)
188
+ if file_size > 104857600:
189
+ mb_size = file_size / 1024 / 1024
190
+ limit_size = 104857600 / 1024 / 1024
191
+ raise ValueError(f"File size is {mb_size} MB. This is over the max file size of {limit_size} MB")
192
+
193
+ file_headers = {
194
+ "Authorization": api.config["token"],
195
+ "accept": "multipart/form-data, text/xml, text/html, application/json, text/plain, */*",
196
+ }
197
+ file_type_header = "multipart/form-data"
198
+ data = open(file_path, "rb").read()
199
+ if not data:
200
+ logger.info("unable to read file!")
201
+
202
+ files = [
203
+ (
204
+ "file",
205
+ (
206
+ file_path,
207
+ data or open(file_path, "rb").read(),
208
+ file_type_header,
209
+ ),
210
+ )
211
+ ]
212
+
213
+ url = f"{api.config['domain']}/api/oscal/ValidateNIST"
214
+ file_res = api.post(
215
+ url=url,
216
+ headers=file_headers,
217
+ files=files,
218
+ )
219
+
220
+ if not file_res.ok:
221
+ api.logger.warning(f"{file_res.status_code} - {file_res.reason}")
222
+ return None
223
+ else:
224
+ retstr = file_res.text
225
+ retstr = retstr.replace("\x1b[97m[\x1b[0;91mERROR\x1b[0;97m] \x1b", "")
226
+ retstr = retstr.rsplit("[m[")
227
+ return retstr
228
+
229
+
230
+ def attach_artifact_to_ssp(trv: FedrampTraversal, file_path: str, tags: str) -> None:
231
+ """
232
+ Function to attach the XML file to the SSP's data and file submodules in RegScale
233
+
234
+ :param FedrampTraversal trv: FedrampTraversal object
235
+ :param str file_path: Path to the file to upload
236
+ :param str tags: Tags to attach to the file during upload
237
+ :rtype: None
238
+ """
239
+
240
+ # upload xml file to SSP
241
+ if File.upload_file_to_regscale(
242
+ file_name=file_path,
243
+ parent_id=trv.ssp_id,
244
+ parent_module="securityplans",
245
+ api=trv.api,
246
+ tags=tags,
247
+ return_object=True,
248
+ ):
249
+ trv.log_info(
250
+ {
251
+ "record_type": "file",
252
+ "event_msg": f"Uploaded file '{get_file_name(file_path)}' to SSP# {get_file_name(file_path)}"
253
+ "File module in RegScale.",
254
+ }
255
+ )
256
+ else:
257
+ trv.log_error(
258
+ {
259
+ "record_type": "file",
260
+ "event_msg": f"Failed to upload file '{get_file_name(file_path)}' to SSP# {trv.ssp_id} "
261
+ "File module in RegScale.",
262
+ }
263
+ )
264
+ if create_new_data_submodule(parent_id=trv.ssp_id, parent_module="securityplans", file_path=file_path):
265
+ trv.log_info(
266
+ {
267
+ "record_type": "Data",
268
+ "event_msg": f"Uploaded file '{get_file_name(file_path)}' to SSP# {get_file_name(file_path)}"
269
+ "Data module in RegScale.",
270
+ }
271
+ )
272
+ else:
273
+ trv.log_error(
274
+ {
275
+ "record_type": "Data",
276
+ "event_msg": f"Failed to upload file '{get_file_name(file_path)}' to SSP# {trv.ssp_id} "
277
+ " Data module in RegScale.",
278
+ }
279
+ )