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,224 @@
1
+ import logging
2
+ from datetime import datetime
3
+ from typing import List, Optional
4
+
5
+ from pydantic import BaseModel, ConfigDict
6
+
7
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class Choice(BaseModel):
13
+ id: Optional[int] = None
14
+ isActive: Optional[bool] = None
15
+ value: Optional[str] = None
16
+ label: Optional[str] = None
17
+ regScaleLabel: Optional[str] = None
18
+ sequence: Optional[int] = None
19
+
20
+
21
+ class FormField(BaseModel):
22
+ id: Optional[int] = None
23
+ createdBy: Optional[str] = None
24
+ createdById: Optional[str] = None
25
+ dateCreated: Optional[datetime] = None
26
+ dateLastUpdated: Optional[datetime] = None
27
+ isPublic: Optional[bool] = None
28
+ lastUpdatedBy: Optional[str] = None
29
+ lastUpdatedById: Optional[str] = None
30
+ displayName: Optional[str] = None
31
+ regScaleId: Optional[str] = None
32
+ regScaleName: Optional[str] = None
33
+ isActive: Optional[bool] = None
34
+ isRequired: Optional[bool] = None
35
+ isCustom: Optional[bool] = None
36
+ fieldType: Optional[str] = None
37
+ selectType: Optional[str] = None
38
+ pattern: Optional[str] = None
39
+ sequence: Optional[int] = None
40
+ helpText: Optional[str] = None
41
+ choices: Optional[List[Choice]] = None
42
+
43
+
44
+ class FormTab(BaseModel):
45
+ id: Optional[int] = None
46
+ createdBy: Optional[str] = None
47
+ createdById: Optional[str] = None
48
+ dateCreated: Optional[datetime] = None
49
+ dateLastUpdated: Optional[datetime] = None
50
+ isPublic: Optional[bool] = None
51
+ lastUpdatedBy: Optional[str] = None
52
+ lastUpdatedById: Optional[str] = None
53
+ displayName: Optional[str] = None
54
+ regScaleName: Optional[str] = None
55
+ regScaleId: Optional[str] = None
56
+ regScaleLink: Optional[str] = None
57
+ isActive: Optional[bool] = None
58
+ isDefault: Optional[bool] = None
59
+ isCustom: Optional[bool] = None
60
+ sequence: Optional[int] = None
61
+ helpText: Optional[str] = None
62
+ formFields: Optional[List[FormField]] = None
63
+
64
+
65
+ class Status(BaseModel):
66
+ regScaleTitle: Optional[str] = None
67
+ displayTitle: Optional[str] = None
68
+ iconName: Optional[str] = None
69
+ color: Optional[str] = None
70
+
71
+
72
+ class Report(BaseModel):
73
+ name: Optional[str] = None
74
+ path: Optional[str] = None
75
+
76
+
77
+ class HelpTextDetail(BaseModel):
78
+ summary: Optional[str] = None
79
+ bulletList: Optional[List[str]] = None
80
+
81
+
82
+ class HelpText(BaseModel):
83
+ whyUseIt: Optional[HelpTextDetail] = None
84
+ whatIsIt: Optional[HelpTextDetail] = None
85
+
86
+
87
+ class ChildModule(BaseModel):
88
+ moduleName: Optional[str] = None
89
+ moduleInformalName: Optional[str] = None
90
+ helpText: Optional[HelpText] = None
91
+
92
+
93
+ class Module(RegScaleModel):
94
+ _module_slug = "modules"
95
+ id: Optional[int] = None
96
+ displayName: Optional[str] = None
97
+ displayPluralizedName: Optional[str] = None
98
+ regScaleName: Optional[str] = None
99
+ regScalePluralizedName: Optional[str] = None
100
+ regScaleId: Optional[int] = None
101
+ regScaleInformalName: Optional[str] = None
102
+ route: Optional[str] = None
103
+ newFormRoute: Optional[str] = None
104
+ documentation: Optional[str] = None
105
+ workbench: Optional[bool] = None
106
+ atlasModule: Optional[str] = None
107
+ formTabs: Optional[List[FormTab]] = None
108
+ status: Optional[List[Status]] = None
109
+ reports: Optional[List[Report]] = None
110
+ children: Optional[List[ChildModule]] = None
111
+ helpText: Optional[HelpText] = None
112
+
113
+ @staticmethod
114
+ def _get_additional_endpoints() -> ConfigDict:
115
+ """
116
+ Get additional endpoints for the Module model.
117
+
118
+ :return: A dictionary of additional endpoints
119
+ :rtype: ConfigDict
120
+ """
121
+ return ConfigDict(
122
+ get_modules="/api/{model_slug}",
123
+ get_module_by_id="/api/{model_slug}/{id}",
124
+ )
125
+
126
+ @classmethod
127
+ def get_modules(cls) -> List["Module"]:
128
+ """
129
+ Get all modules.
130
+
131
+ :return: A list of modules
132
+ :rtype: List["Module"]
133
+ """
134
+ response = cls._get_api_handler().get(
135
+ endpoint=cls.get_endpoint("get_modules").format(model_slug=cls.get_module_slug())
136
+ )
137
+ if response and response.ok:
138
+ return [cls(**o) for o in response.json()]
139
+ else:
140
+ cls.log_response_error(response=response)
141
+ return []
142
+
143
+ @classmethod
144
+ def get_module_by_id(cls, id: int) -> Optional["Module"]:
145
+ """
146
+ Get a module by ID. provides more data that get_modules
147
+
148
+ :param int id: The ID of the module to get
149
+ :return: The module
150
+ :rtype: Optional["Module"]
151
+ """
152
+ response = cls._get_api_handler().get(
153
+ endpoint=cls.get_endpoint("get_module_by_id").format(model_slug=cls._module_slug, id=id)
154
+ )
155
+ if response and response.ok:
156
+ return cls(**response.json())
157
+ else:
158
+ cls.log_response_error(response=response)
159
+ return None
160
+
161
+ @classmethod
162
+ def get_module_by_name(cls, regscale_name: str) -> Optional["Module"]:
163
+ """
164
+ Get a module by name.
165
+
166
+ :param str regscale_name: The name of the module to get
167
+ :return: The module
168
+ :rtype: Optional["Module"]
169
+ """
170
+ for module in cls.get_modules():
171
+ if module.regScaleInformalName == regscale_name:
172
+ return module
173
+ return None
174
+
175
+ @classmethod
176
+ def get_tab_by_name(cls, regscale_module_name: str, regscale_tab_name: str) -> Optional[FormTab]:
177
+ """
178
+ Get a tab by name.
179
+
180
+ :param str regscale_module_name: The name of the module
181
+ :param str regscale_tab_name: The regscale_name of the tab to get
182
+ :return: The tab
183
+ :rtype: Optional[FormTab]
184
+ """
185
+ module = cls.get_module_by_name(regscale_name=regscale_module_name)
186
+ if module:
187
+ module_metadata = cls.get_module_by_id(id=module.id)
188
+ if not module_metadata:
189
+ return None
190
+ for form_tab in module_metadata.formTabs:
191
+ if form_tab.regScaleName == regscale_tab_name:
192
+ return form_tab
193
+ return None
194
+
195
+ @classmethod
196
+ def get_new_custom_form_tab_id(cls, module_name="cases", tab_name: str = "Migrated Custom Fields") -> Optional[int]:
197
+ """
198
+ Get the id of the new custom form tab. this is needed to update the custom field data
199
+
200
+ :param str module_name: The name of the module
201
+ :param str tab_name: The name of the tab
202
+ :return: The id of the new custom form tab
203
+ :rtype: Optional[int]
204
+ """
205
+ form_tab = cls.get_tab_by_name(regscale_module_name=module_name, regscale_tab_name=tab_name)
206
+ if form_tab:
207
+ return form_tab.id
208
+ return None
209
+
210
+ @classmethod
211
+ def get_form_fields_by_tab_id(
212
+ cls, module_name: str = "cases", tab_name: str = "Migrated Custom Fields"
213
+ ) -> Optional[List[FormField]]:
214
+ """
215
+ Get the form fields by tab id.
216
+ :param str module_name: The name of the module
217
+ :param str tab_name: The name of the tab
218
+ :return: A list of form fields
219
+ :rtype: Optional[List[FormField]]
220
+ """
221
+ form_tab = cls.get_tab_by_name(regscale_module_name=module_name, regscale_tab_name=tab_name)
222
+ if form_tab:
223
+ return form_tab.formFields
224
+ return None
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Class of all RegScale modules"""
4
+
5
+ # standard python imports
6
+ from dataclasses import asdict, dataclass
7
+ from typing import Any
8
+
9
+ from rich.console import Console
10
+ from rich.table import Table
11
+
12
+ from regscale.core.app.utils.app_utils import uncamel_case
13
+
14
+
15
+ # pylint: disable=C0103
16
+ @dataclass
17
+ class Modules:
18
+ """Class for all RegScale Modules"""
19
+
20
+ assessment: str = "assessments"
21
+ asset: str = "assets"
22
+ case: str = "cases"
23
+ catalogue: str = "catalogues"
24
+ causalAnalysis: str = "causalanalysis"
25
+ controlObjective: str = "controlobjectives"
26
+ component: str = "components"
27
+ dataCall: str = "datacalls"
28
+ exception: str = "exceptions"
29
+ incident: str = "incidents"
30
+ interconnect: str = "interconnects"
31
+ # using _ to replace with ( and will later put POAM in parentheses
32
+ issue_POAM: str = "issues"
33
+ policy: str = "policies"
34
+ project: str = "projects"
35
+ questionnaire: str = "questionnaires"
36
+ requirement: str = "requirements"
37
+ risk: str = "risks"
38
+ securityControl: str = "securitycontrols"
39
+ securityControlImplementation: str = "controls"
40
+ securityPlan: str = "securityplans"
41
+ securityProfile: str = "profiles"
42
+ # using _ to replace with ( and will later put Contract in parentheses
43
+ supplyChain_Contract: str = "supplychain"
44
+ task: str = "tasks"
45
+ threat: str = "threats"
46
+
47
+ def __getitem__(self, key: Any) -> Any:
48
+ """
49
+ Get attribute from Pipeline
50
+
51
+ :param Any key: Key to get value from
52
+ :return: value of provided key
53
+ :rtype: Any
54
+ """
55
+ return getattr(self, key)
56
+
57
+ def __setitem__(self, key: Any, value: Any) -> None:
58
+ """
59
+ Set attribute in Pipeline with provided key
60
+
61
+ :param Any key: Key to change to provided value
62
+ :param Any value: New value for provided Key
63
+ :rtype: None
64
+ """
65
+ return setattr(self, key, value)
66
+
67
+ def dict(self) -> dict:
68
+ """
69
+ Create a dictionary from the Asset dataclass
70
+
71
+ :return: Dictionary of Asset
72
+ :rtype: dict
73
+ """
74
+ return dict(asdict(self).items())
75
+
76
+ def module_names(self) -> list:
77
+ """
78
+ Function to clean the keys and display them as they are in the application
79
+
80
+ :return: list of module names
81
+ :rtype: list
82
+ """
83
+ # create list variable for the cleaned up keys
84
+ clean_keys = []
85
+
86
+ # convert the class to a dictionary
87
+ data = self.dict()
88
+
89
+ # iterate through the keys
90
+ for key in data.keys():
91
+ # see if there is an _ in the key name, so we can replace it with ()
92
+ if "_" in key:
93
+ # find location of _
94
+ index = key.find("_")
95
+
96
+ # use the location to concatenate the key and () value
97
+ clean_key = f"{uncamel_case(key[:index])}({key[index + 1:]})"
98
+ else:
99
+ # uncamel case the key and append
100
+ clean_key = uncamel_case(key)
101
+ # append the clean key to the list
102
+ clean_keys.append(clean_key)
103
+ # return the list of clean keys
104
+ return clean_keys
105
+
106
+ def api_names(self) -> list:
107
+ """
108
+ Function to get the values from the class, used for RegScale API calls
109
+
110
+ :return: List of modules used for RegScale API calls
111
+ :rtype: list
112
+ """
113
+ # convert the class to dictionary
114
+ modules = self.dict()
115
+
116
+ # return the values from the dictionary as a list
117
+ return list(modules.values())
118
+
119
+ @staticmethod
120
+ def graphql_names() -> dict:
121
+ """
122
+ Function to get graphQL friend names mapped to regscale modules
123
+
124
+ :return: A mapping of modules used for RegScale GraphQL calls
125
+ :rtype: dict
126
+ """
127
+ return {
128
+ "assessment": "assessments",
129
+ "case": "cases",
130
+ "components": "components",
131
+ "causalanalysis": "causalAnalyses",
132
+ "catalogue": "catalogues",
133
+ "causalAnalysis": "CausalAnalysis",
134
+ "component": "components",
135
+ "datacalls": "dataCalls",
136
+ "issues": "issues",
137
+ "interconnect": "interconnections",
138
+ "policy": "policies",
139
+ "project": "projects",
140
+ "questionnaire": "questionnaires",
141
+ "requirement": "requirements",
142
+ "profile": "profiles",
143
+ "securityplans": "securityPlans",
144
+ "scanHistory": "scanHistories",
145
+ "securitycontrols": "securityControls",
146
+ "controlimplementation": "controlImplementations",
147
+ "supplychain": "supplyChain",
148
+ "task": "tasks",
149
+ "threat": "threats",
150
+ }
151
+
152
+ def to_table(self) -> None:
153
+ """
154
+ Displays the customer facing RegScale modules and the API equivalent as a table
155
+ in the console
156
+ """
157
+ # create console and table objects
158
+ console = Console()
159
+ table = Table("RegScale Module", "Accepted Value", title="RegScale Modules", safe_box=True)
160
+
161
+ # get list for clean columns and the api names
162
+ columns = self.module_names()
163
+ data = self.api_names()
164
+
165
+ # iterate through items and add them to table object
166
+ for i in range(len(columns)):
167
+ table.add_row(columns[i], data[i])
168
+
169
+ # print the table object in console
170
+ console.print(table)
171
+
172
+ def to_str_table(self) -> str:
173
+ """
174
+ Creates a string table of the data to display in console for click help command
175
+
176
+ :return: string table of customer facing RegScale modules and the API equivalent
177
+ :rtype: str
178
+ """
179
+ # create string to store the table
180
+ output = "{:<25} {:<25}\n".format("RegScale Module", "Accepted Value")
181
+
182
+ # get list for clean columns and the api names
183
+ columns = self.module_names()
184
+ data = self.api_names()
185
+
186
+ # iterate through items and add it to the output string
187
+ for i in range(len(columns)):
188
+ output += "\b{:<25} | {:<25}\n".format(columns[i], data[i])
189
+
190
+ # return the string
191
+ return output
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Dataclass for Objective in the application"""
4
+
5
+ from dataclasses import dataclass
6
+
7
+
8
+ @dataclass
9
+ class Objective:
10
+ """RegScale Base Objective"""
11
+
12
+ securityControlId: int
13
+ id: int
14
+ uuid: str
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Regscale Model for Implementation Parameter in the application"""
4
+
5
+ from enum import Enum
6
+ from typing import Optional, List
7
+
8
+ from pydantic import ConfigDict
9
+ from pydantic import Field
10
+
11
+ from regscale.core.app.utils.app_utils import get_current_datetime
12
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
13
+
14
+
15
+ class ParameterDataTypes(Enum):
16
+ STRING = "string"
17
+ INTEGER = "integer"
18
+ DATE = "date"
19
+ BOOLEAN = "boolean"
20
+ ARRAY = "array"
21
+
22
+
23
+ class Parameter(RegScaleModel):
24
+ """
25
+ RegScale Implementation Parameter
26
+ Represents a row in the Parameter table in the database.
27
+
28
+ Relationships:
29
+ - ControlImplementationId -> ControlImplementation (1:1)
30
+ - CreatedById, LastUpdatedById -> AspNetUsers (1:1) [FKs]
31
+ - ParentParameterId -> ControlParameter (0..1:1) [optional]
32
+ - TenantsId -> Tenants (1:1) [inherited]
33
+ """
34
+
35
+ _module_slug = "parameters"
36
+
37
+ id: Optional[int] = None
38
+ uuid: Optional[str] = None
39
+ name: str
40
+ value: str
41
+ controlImplementationId: int # Required, FK to ControlImplementation
42
+ createdById: str = Field(default_factory=RegScaleModel.get_user_id) # FK to AspNetUsers
43
+ dateCreated: str = Field(default_factory=get_current_datetime) # Required
44
+ lastUpdatedById: str = Field(default_factory=RegScaleModel.get_user_id) # FK to AspNetUsers
45
+ dateLastUpdated: str = Field(default_factory=get_current_datetime) # Required
46
+ tenantsId: Optional[int] = None # Optional, FK to Tenants
47
+ dataType: Optional[str] = None # Optional
48
+ externalPropertyName: Optional[str] = None # Optional
49
+ parentParameterId: Optional[int] = None # Optional, FK to ControlParameter
50
+ isPublic: bool = False # Required, default to False
51
+
52
+ oscalNamespaceMapping: Optional[List[str]] = None
53
+
54
+ @staticmethod
55
+ def _get_additional_endpoints() -> ConfigDict:
56
+ """
57
+ Get additional endpoints for the Parameter model.
58
+
59
+ :return: A dictionary of additional endpoints
60
+ :rtype: ConfigDict
61
+ """
62
+ return ConfigDict( # type: ignore
63
+ get_all_by_parent="/api/{model_slug}/getAllByParent/{intParentID}",
64
+ get_count="/api/{model_slug}/getCount",
65
+ create="/api/{model_slug}",
66
+ update="/api/{model_slug}/{id}",
67
+ delete="/api/{model_slug}/{id}",
68
+ get="/api/{model_slug}/find/{id}",
69
+ find_by_guid="/api/{model_slug}/findByGUID/{strGUID}",
70
+ merge="/api/{model_slug}/merge/{implementationID}/{securityControlID}",
71
+ )
72
+
73
+ @classmethod
74
+ def get_by_parent_id(cls, parent_id: int) -> List["Parameter"]:
75
+ """
76
+ Get all Parameters by Parent ID.
77
+
78
+ :param int parent_id: The Parent ID
79
+ :return: A list of Parameters
80
+ :rtype: List[Parameter]
81
+ """
82
+ response = cls._get_api_handler().get(
83
+ endpoint=cls.get_endpoint("get_all_by_parent").format(intParentID=parent_id)
84
+ )
85
+ if response and response.ok:
86
+ return [Parameter(**param) for param in response.json()]
87
+ return []
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Class for a RegScale Ports and Protocols"""
4
+ from typing import Optional
5
+
6
+ from pydantic import ConfigDict
7
+
8
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
9
+
10
+
11
+ class PortsProtocol(RegScaleModel):
12
+ """Ports And Protocols"""
13
+
14
+ _module_slug = "portsprotocols"
15
+ _unique_fields = [
16
+ [
17
+ "parentId",
18
+ "parentModule",
19
+ "startPort",
20
+ "endPort",
21
+ "protocol",
22
+ "service",
23
+ ],
24
+ ]
25
+
26
+ startPort: Optional[int] = 0
27
+ endPort: Optional[int] = 0
28
+ parentId: Optional[int] = 0
29
+ parentModule: Optional[str] = ""
30
+ protocol: Optional[str] = None
31
+ service: Optional[str] = None
32
+ purpose: Optional[str] = None
33
+ usedBy: Optional[str] = None
34
+ createdById: Optional[str] = None
35
+ lastUpdatedById: Optional[str] = None
36
+ isPublic: Optional[bool] = True
37
+
38
+ @staticmethod
39
+ def _get_additional_endpoints() -> ConfigDict:
40
+ """
41
+ Get additional endpoints for the PortsProtocols model.
42
+
43
+ :return: A dictionary of additional endpoints
44
+ :rtype: ConfigDict
45
+ """
46
+ return ConfigDict(
47
+ get_all_by_parent="/api/{model_slug}/getAllByParent/{intParentID}/{strModule}",
48
+ find="/api/{model_slug}/find/{id}",
49
+ )
50
+
51
+ def __eq__(self, other: object) -> bool:
52
+ """
53
+ Compare two PortsProtocols objects
54
+
55
+ :param object other: PortsProtocols object
56
+ :return: True if PortsProtocols are equal
57
+ :rtype: bool
58
+ """
59
+ if isinstance(other, PortsProtocol):
60
+ return self.dict() == other.dict()
61
+ return False
62
+
63
+ def __hash__(self) -> hash:
64
+ """
65
+ Return hash of PortsProtocols
66
+
67
+ :return: hash of PortsProtocols
68
+ :rtype: hash
69
+ """
70
+ return hash(
71
+ (
72
+ self.parentId,
73
+ self.parentModule,
74
+ self.startPort,
75
+ self.endPort,
76
+ self.protocol,
77
+ self.service,
78
+ self.purpose,
79
+ self.usedBy,
80
+ )
81
+ )
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Regscale Model for Privacy in the application"""
4
+
5
+ from enum import Enum
6
+ from typing import Optional, List
7
+
8
+ from pydantic import ConfigDict
9
+ from pydantic import Field
10
+
11
+ from regscale.core.app.utils.app_utils import get_current_datetime
12
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
13
+
14
+
15
+ class PrivacyDataTypes(Enum):
16
+ STRING = "string"
17
+ INTEGER = "integer"
18
+ DATE = "date"
19
+ BOOLEAN = "boolean"
20
+ ARRAY = "array"
21
+
22
+
23
+ class Privacy(RegScaleModel):
24
+ """
25
+ RegScale Privacy record
26
+ Represents a row in the Policy table in the database.
27
+
28
+ Relationships:
29
+ - securityPlanId -> Security Plan (1:1)
30
+ - CreatedById, LastUpdatedById -> AspNetUsers (1:1) [FKs]
31
+ - TenantsId -> Tenants (1:1) [inherited]
32
+ """
33
+
34
+ _module_slug = "privacy"
35
+
36
+ id: Optional[int] = 0
37
+ isPublic: Optional[bool] = True
38
+ uuid: Optional[str] = None
39
+ uniqueIdentifier: Optional[str] = None
40
+ piiCollection: str = Field(default="No", alias="piiCollection")
41
+ piiPublicCollection: str = Field(default="No", alias="piiPublicCollection")
42
+ piaConducted: str = Field(default="No", alias="piaConducted")
43
+ sornExists: str = Field(default="No", alias="sornExists")
44
+ sornId: Optional[str] = None
45
+ ombControlId: Optional[str] = None
46
+ infoCollected: Optional[str] = None
47
+ justification: Optional[str] = None
48
+ businessUse: Optional[str] = None
49
+ pointOfContactId: Optional[str] = None
50
+ privacyOfficerId: Optional[str] = None
51
+ informationSharing: Optional[str] = None
52
+ consent: Optional[str] = None
53
+ security: Optional[str] = None
54
+ privacyActSystem: Optional[str] = None
55
+ recordsSchedule: Optional[str] = None
56
+ securityPlanId: Optional[int] = 0
57
+ status: Optional[str] = None
58
+ dateApproved: Optional[str] = None
59
+ notes: Optional[str] = None
60
+
61
+ @staticmethod
62
+ def _get_additional_endpoints() -> ConfigDict:
63
+ """
64
+ Get additional endpoints for the Policy model.
65
+
66
+ :return: A dictionary of additional endpoints
67
+ :rtype: ConfigDict
68
+ """
69
+ return ConfigDict( # type: ignore
70
+ get_all_by_parent="/api/{model_slug}/getAllByParent/{intSPID}",
71
+ create="/api/{model_slug}",
72
+ update="/api/{model_slug}/{ID}",
73
+ delete="/api/{model_slug}/{ID}",
74
+ get="/api/{model_slug}/{intID}",
75
+ )
76
+
77
+ @classmethod
78
+ def get_all_by_parent(cls, security_plan_id: int) -> List["Privacy"]:
79
+ """
80
+ Get all privacy records by security plan ID.
81
+
82
+ :param int security_plan_id: The ID of the security plan
83
+ :return: A list of Privacy records
84
+ :rtype: List["Privacy"]
85
+ """
86
+ res = cls._get_api_handler().get(
87
+ endpoint=cls.get_endpoint("get_all_by_parent").format(intSPID=security_plan_id)
88
+ )
89
+ return cls._handle_list_response(res)