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,261 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Control Objective Model"""
4
+ from collections import defaultdict
5
+ from typing import Any, Optional
6
+
7
+ from pydantic import Field, ConfigDict
8
+
9
+ from regscale.core.app.utils.app_utils import get_current_datetime
10
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
11
+
12
+
13
+ class ControlObjective(RegScaleModel):
14
+ """RegScale Control Objective"""
15
+
16
+ _module_slug = "controlObjectives"
17
+ _unique_fields = [
18
+ ["securityControlId", "name"],
19
+ ]
20
+
21
+ id: int = 0
22
+ uuid: Optional[str] = None
23
+ name: str
24
+ description: str
25
+ otherId: str = "" # API does not return if None
26
+ archived: bool = False
27
+ securityControlId: int
28
+ dateCreated: str = Field(default_factory=get_current_datetime)
29
+ dateLastUpdated: str = Field(default_factory=get_current_datetime)
30
+ objectiveType: str = "objective"
31
+
32
+ @staticmethod
33
+ def _get_additional_endpoints() -> ConfigDict:
34
+ """
35
+ Get additional endpoints for the ControlObjective
36
+
37
+ :return: Additional endpoints for the ControlObjective
38
+ :rtype: ConfigDict
39
+ """
40
+ return ConfigDict(
41
+ get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}",
42
+ insert="/api/{model_slug}",
43
+ get_by_catalog="/api/{model_slug}/getByCatalog/{catalogId}",
44
+ get_by_catalogue="/api/{model_slug}/getByCatalogue/{catalogId}",
45
+ # Note: This is identical to get_by_catalog, might be redundant
46
+ get_by_control="/api/{model_slug}/getByControl/{controlId}",
47
+ batch_create="/api/{model_slug}/batchCreate",
48
+ ) # type: ignore
49
+
50
+ @classmethod
51
+ def get_by_catalog(cls, catalog_id: int) -> list["ControlObjective"]:
52
+ """
53
+ Get a list of objects by catalog.
54
+
55
+ :param int catalog_id: The ID of the catalog
56
+ :return: A list of objects
57
+ :rtype: list["ControlObjective"]
58
+ """
59
+ endpoint = cls.get_endpoint("get_by_catalog").format(catalogId=catalog_id)
60
+ return cls._handle_list_response(cls._get_api_handler().get(endpoint))
61
+
62
+ @classmethod
63
+ def get_by_catalogue(cls, catalog_id: int) -> list["ControlObjective"]:
64
+ """
65
+ Get a list of objects by catalogue.
66
+
67
+ :param int catalog_id: The ID of the catalogue
68
+ :return: A list of objects
69
+ :rtype: list["ControlObjective"]
70
+ """
71
+
72
+ return cls.get_by_catalog(cls, catalog_id)
73
+
74
+ @classmethod
75
+ def get_by_control(cls, control_id: int) -> list["ControlObjective"]:
76
+ """
77
+ Get a list of objects by control.
78
+
79
+ :param int control_id: The ID of the control
80
+ :return: A list of objects
81
+ :rtype: list["ControlObjective"]
82
+ """
83
+ endpoint = cls.get_endpoint("get_by_control").format(controlId=control_id)
84
+ return cls._handle_list_response(cls._get_api_handler().get(endpoint))
85
+
86
+ @staticmethod
87
+ def from_dict(obj: Any) -> "ControlObjective":
88
+ """
89
+ Create ControlObjective object from dict
90
+
91
+ :param Any obj: Dictionary
92
+ :return: ControlObjective class from provided dict
93
+ :rtype: ControlObjective
94
+ """
95
+ _securityControlId = int(obj.get("securityControlId", 0))
96
+ _id = int(obj.get("id", 0))
97
+ _uuid = str(obj.get("uuid"))
98
+ _name = str(obj.get("name"))
99
+ _description = str(obj.get("description"))
100
+ _otherId = str(obj.get("otherId"))
101
+ _objectiveType = str(obj.get("objectiveType"))
102
+ _archived = False
103
+ return ControlObjective(
104
+ _securityControlId,
105
+ _id,
106
+ _uuid,
107
+ _name,
108
+ _description,
109
+ _otherId,
110
+ _objectiveType,
111
+ _archived,
112
+ )
113
+
114
+ @classmethod
115
+ def fetch_control_objectives_by_other_id(
116
+ cls, parent_id: int, other_id_contains: str, skip: int = 0, take: int = 50
117
+ ) -> list["ControlObjective"]:
118
+ """
119
+ Fetch control objectives by other ID.
120
+
121
+ :param int parent_id: The ID of the parent
122
+ :param str other_id_contains: The other ID to search for
123
+ :param int skip: Number of items to skip
124
+ :param int take: Number of items to take
125
+ :return: A list of control objectives
126
+ :rtype: list["ControlObjective"]
127
+ """
128
+
129
+ query = f"""
130
+ query GetControlImplementations() {{
131
+ controlImplementations(
132
+ skip: {skip}, take: {take}, where: {{
133
+ parentId: {{eq: {parent_id}}},
134
+ control: {{
135
+ controlObjectives: {{
136
+ some: {{
137
+ otherId: {{
138
+ contains: "{other_id_contains}"
139
+ }}
140
+ }}
141
+ }}
142
+ }}
143
+ }}
144
+ ) {{
145
+ items {{
146
+ id
147
+ control {{
148
+ id,
149
+ controlObjectives {{
150
+ id
151
+ uuid
152
+ name
153
+ description
154
+ otherId
155
+ archived
156
+ securityControlId
157
+ dateCreated
158
+ dateLastUpdated
159
+ objectiveType
160
+ }}
161
+ }}
162
+ }}
163
+ pageInfo {{
164
+ hasNextPage
165
+ }}
166
+ totalCount
167
+ }}
168
+ }}
169
+ """
170
+
171
+ response = cls._get_api_handler().graph(query)
172
+ control_objectives: list["ControlObjective"] = []
173
+ if "controlImplementations" in response:
174
+ # Extract controlObjectives from each control in the controlImplementations
175
+ for item in response["controlImplementations"]["items"]:
176
+ for objective in item["control"]["controlObjectives"]:
177
+ if (
178
+ other_id_contains in objective["otherId"]
179
+ ): # API_PROBLEM: Hack to fix broken API returning too many results
180
+ if control_objective := cls(**objective):
181
+ control_objectives.append(control_objective)
182
+ return control_objectives
183
+
184
+ @classmethod
185
+ def fetch_control_objectives_by_name(
186
+ cls, parent_id: int, name_contains: str, skip: int = 0, take: int = 50
187
+ ) -> list["ControlObjective"]:
188
+ """
189
+ Fetch control objectives by other ID.
190
+
191
+ :param int parent_id: The ID of the parent
192
+ :param str name_contains: The name to search for
193
+ :param int skip: Number of items to skip
194
+ :param int take: Number of items to take
195
+ :return: A list of control objectives
196
+ :rtype: list["ControlObjective"]
197
+ """
198
+
199
+ query = f"""
200
+ query GetControlImplementations() {{
201
+ controlImplementations(
202
+ skip: {skip}, take: {take}, where: {{
203
+ parentId: {{eq: {parent_id}}},
204
+ control: {{
205
+ controlObjectives: {{
206
+ some: {{
207
+ name: {{
208
+ contains: "{name_contains}"
209
+ }}
210
+ }}
211
+ }}
212
+ }}
213
+ }}
214
+ ) {{
215
+ items {{
216
+ id
217
+ control {{
218
+ id,
219
+ controlObjectives {{
220
+ id
221
+ uuid
222
+ name
223
+ description
224
+ otherId
225
+ archived
226
+ securityControlId
227
+ dateCreated
228
+ dateLastUpdated
229
+ objectiveType
230
+ }}
231
+ }}
232
+ }}
233
+ pageInfo {{
234
+ hasNextPage
235
+ }}
236
+ totalCount
237
+ }}
238
+ }}
239
+ """
240
+
241
+ response = cls._get_api_handler().graph(query)
242
+ control_objectives: list["ControlObjective"] = []
243
+ if "controlImplementations" in response:
244
+ # Extract controlObjectives from each control in the controlImplementations
245
+ for item in response["controlImplementations"]["items"]:
246
+ for objective in item["control"]["controlObjectives"]:
247
+ if name_contains in objective["name"]: # TODO: Hack to fix broken API returning too many results
248
+ control_objectives.append(cls(**objective))
249
+ return control_objectives
250
+
251
+
252
+ def map_ccis_to_control_ids(parent_id: int) -> dict:
253
+ ccis_to_control_ids: dict[str, set[int]] = defaultdict(set)
254
+ objectives = ControlObjective.fetch_control_objectives_by_other_id(parent_id=parent_id, other_id_contains="CCI-")
255
+
256
+ for objective in objectives:
257
+ cci_ids = objective.otherId.split(",")
258
+ for cci_id in cci_ids:
259
+ ccis_to_control_ids[cci_id.strip()].add(objective.securityControlId)
260
+
261
+ return ccis_to_control_ids
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Model for Control Parameter in the application"""
4
+ import warnings
5
+ from typing import Optional, List
6
+ from urllib.parse import urljoin
7
+
8
+ from pydantic import Field, ConfigDict
9
+
10
+ from regscale.core.app.api import Api
11
+ from regscale.core.app.application import Application
12
+ from regscale.core.app.utils.api_handler import APIInsertionError
13
+ from regscale.core.app.utils.app_utils import get_current_datetime
14
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
15
+
16
+
17
+ class ControlParameter(RegScaleModel):
18
+ """
19
+ ControlParameter class
20
+ """
21
+
22
+ _module_slug = "controlParameters"
23
+ _module_string = "controlparameter"
24
+ _unique_fields = [
25
+ ["parameterId", "securityControlId"],
26
+ ]
27
+
28
+ id: Optional[int] = 0
29
+ uuid: Optional[str] = None
30
+ text: str = ""
31
+ parameterId: Optional[str] = None
32
+ otherId: Optional[str] = None
33
+ securityControlId: Optional[int] = None
34
+ archived: bool = False
35
+ createdById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
36
+ dateCreated: Optional[str] = Field(default_factory=get_current_datetime)
37
+ lastUpdatedById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
38
+ dateLastUpdated: Optional[str] = Field(default_factory=get_current_datetime)
39
+ tenantsId: Optional[int] = 1
40
+ dataType: Optional[str] = None
41
+ isPublic: bool = True
42
+ default: Optional[str] = None
43
+ displayName: str = ""
44
+
45
+ @staticmethod
46
+ def _get_additional_endpoints() -> ConfigDict:
47
+ """
48
+ Get additional endpoints for the ControlParameter
49
+
50
+ :return: Additional endpoints for the ControlParameter
51
+ :rtype: ConfigDict
52
+ """
53
+ return ConfigDict( # type: ignore
54
+ get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}",
55
+ get_by_control="/api/{model_slug}/getByControl/{id}",
56
+ create="/api/{model_slug}",
57
+ batch_create="/api/{model_slug}/batchCreate",
58
+ )
59
+
60
+ @classmethod
61
+ def get_by_control(cls, control_id: int) -> Optional[List["ControlParameter"]]:
62
+ """
63
+ Get a list of control parameters by control ID
64
+ :param int control_id:
65
+ :return: Optional[List["ControlParameter"]]
66
+ :rtype: Optional[List["ControlParameter"]]
67
+ """
68
+ endpoint = cls.get_endpoint("get_by_control").format(id=control_id)
69
+ response = cls._get_api_handler().get(endpoint=endpoint)
70
+ if response and response.ok:
71
+ return [cls(**item) for item in response.json()]
72
+ return None
73
+
74
+ def insert_parameter(self, app: Application) -> dict:
75
+ """
76
+ DEPRECATED: Insert a new control parameter
77
+
78
+ :param Application app: Application object
79
+ :raises APIInsertionError: If the API request fails
80
+ :return: JSON response as a dictionary
81
+ :rtype: dict
82
+ """
83
+ warnings.warn(
84
+ "The 'insert_parameter' method is deprecated, use 'create' method instead",
85
+ DeprecationWarning,
86
+ )
87
+
88
+ # Convert the model to a dictionary
89
+ api = Api()
90
+ data = self.dict()
91
+ api_url = urljoin(app.config["domain"], "/api/controlparameters")
92
+ # Make the API call
93
+ response = api.post(api_url, json=data)
94
+
95
+ # Check the response
96
+ if not response.ok:
97
+ print(response.text)
98
+ raise APIInsertionError(f"API request failed with status {response.status_code}")
99
+
100
+ return response.json()
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Model for Control Test in the application"""
4
+ import uuid
5
+
6
+ from pydantic import ConfigDict, Field
7
+
8
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
9
+
10
+
11
+ class ControlTest(RegScaleModel):
12
+ """Properties plan model"""
13
+
14
+ _module_slug = "controltests"
15
+ _unique_fields = [
16
+ ["uuid"],
17
+ ]
18
+ _parent_id_field = "parentControlId"
19
+
20
+ uuid: str = Field(default_factory=lambda: str(uuid.uuid4()))
21
+ isPublic: bool = True
22
+ testCriteria: str
23
+ parentControlId: int
24
+ parentRequirementId: int = 0
25
+
26
+ @staticmethod
27
+ def _get_additional_endpoints() -> ConfigDict:
28
+ """
29
+ Function to get additional endpoints for the ControlTest model
30
+
31
+ :return: Additional endpoints for the ControlTest model
32
+ :rtype: ConfigDict
33
+ """
34
+ return ConfigDict(get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}") # type: ignore
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Model for Control Test Plan in the application"""
4
+ import warnings
5
+ from typing import Optional
6
+ from urllib.parse import urljoin
7
+
8
+ from pydantic import ConfigDict
9
+
10
+ from regscale.core.app.api import Api
11
+ from regscale.core.app.application import Application
12
+ from regscale.core.app.utils.api_handler import APIInsertionError
13
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
14
+
15
+
16
+ class ControlTestPlan(RegScaleModel):
17
+ """
18
+ ControlTestPlan class
19
+ """
20
+
21
+ _module_slug = "controlTestPlans"
22
+ _module_string = "controltestplan"
23
+
24
+ id: int = 0
25
+ uuid: Optional[str] = None
26
+ test: Optional[str] = None
27
+ testId: Optional[str] = None
28
+ securityControlId: Optional[int] = None
29
+ archived: bool = False
30
+ createdById: Optional[str] = None
31
+ dateCreated: Optional[str] = None
32
+ lastUpdatedById: Optional[str] = None
33
+ dateLastUpdated: Optional[str] = None
34
+ tenantsId: Optional[int] = None
35
+ isPublic: bool = True
36
+
37
+ @staticmethod
38
+ def _get_additional_endpoints() -> ConfigDict:
39
+ """
40
+ Get additional endpoints for the ControlTestPlan
41
+
42
+ :return: Additional endpoints for the ControlTestPlan
43
+ :rtype: ConfigDict
44
+ """
45
+ return ConfigDict( # type: ignore
46
+ get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}",
47
+ )
48
+
49
+ def insert_controltestplan(self, app: Application) -> dict:
50
+ """
51
+ Insert a ControlTestPlan into the database
52
+
53
+ :param Application app: Application object
54
+ :raises APIInsertionError: API request failed
55
+ :return: JSON response
56
+ :rtype: dict
57
+ """
58
+ warnings.warn(
59
+ "The 'insert_controltestplan' method is deprecated, use 'create' method instead",
60
+ DeprecationWarning,
61
+ )
62
+
63
+ # Convert the model to a dictionary
64
+ api = Api()
65
+ data = self.dict()
66
+ api_url = urljoin(app.config["domain"], "/api/controltestplans")
67
+ # Make the API call
68
+ response = api.post(api_url, json=data)
69
+
70
+ # Check the response
71
+ if not response.ok:
72
+ print(response.text)
73
+ raise APIInsertionError(f"API request failed with status {response.status_code}")
74
+
75
+ return response.json()
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Model for Control Test Results in the application"""
4
+ from enum import Enum
5
+ from typing import Optional
6
+
7
+ from pydantic import ConfigDict
8
+
9
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
10
+
11
+
12
+ class ControlTestResultStatus(str, Enum):
13
+ """Control Test Statuses"""
14
+
15
+ FAIL = "Fail"
16
+ PASS = "Pass"
17
+ NOT_APPLICABLE = "Not Applicable"
18
+ NOT_REVIEWED = "Not Reviewed"
19
+
20
+
21
+ class ControlTestResult(RegScaleModel):
22
+ """Control Test Results model"""
23
+
24
+ _module_slug = "controltestresults"
25
+
26
+ id: Optional[int] = None
27
+ is_public: bool = True
28
+ result: ControlTestResultStatus
29
+ uuid: Optional[str] = None
30
+ observations: Optional[str] = None
31
+ gaps: Optional[str] = None
32
+ evidence: Optional[str] = None
33
+ bIssue: Optional[bool] = None
34
+ originalRisk: Optional[str] = None
35
+ identifiedRisk: Optional[str] = None
36
+ likelihood: Optional[str] = None
37
+ impact: Optional[str] = None
38
+ recommendationForMitigation: Optional[str] = None
39
+ dateAssessed: Optional[str] = None
40
+ assessedById: Optional[str] = None
41
+ parentTestId: Optional[int] = None
42
+ parentAssessmentId: Optional[int] = None
43
+
44
+ @staticmethod
45
+ def _get_additional_endpoints() -> ConfigDict:
46
+ """
47
+ Get additional endpoints for the ControlTestResults model
48
+
49
+ :return: Additional endpoints for the ControlTestResults model
50
+ :rtype: ConfigDict
51
+ """
52
+ return ConfigDict(get_by_parent="/api/{model_slug}/getByAssessment/{intParentID}") # type: ignore