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,87 @@
1
+ """
2
+ This module contains the Questionnaires model in RegScale.
3
+ """
4
+
5
+ import logging
6
+ from typing import Optional, List, Dict
7
+
8
+ from pydantic import ConfigDict
9
+
10
+ from regscale.models.regscale_models.questionnaire_instance import QuestionnaireInstance
11
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class Questionnaires(RegScaleModel):
17
+ """
18
+ A class to represent the Questionnaires model in RegScale.
19
+ """
20
+
21
+ _module_slug = "questionnaires"
22
+
23
+ id: Optional[int] = 0
24
+ uuid: Optional[str] = None
25
+ title: str
26
+ ownerId: str
27
+ description: Optional[str] = None
28
+ instructions: Optional[str] = None
29
+ createdById: Optional[str] = None
30
+ dateCreated: Optional[str] = None
31
+ lastUpdatedById: Optional[str] = None
32
+ dateLastUpdated: Optional[str] = None
33
+ tenantsId: Optional[int] = 1
34
+ active: bool = True
35
+ isPublic: bool = True
36
+ sections: Optional[List[int]] = [0] # Adjust the type if it's not a string
37
+ rules: Optional[str] = None # Adjust the type if it's not a string
38
+ loginRequired: Optional[bool] = True
39
+ allowPublicUrl: Optional[bool] = True
40
+ enableScoring: Optional[bool] = False
41
+ questionnaireIds: Optional[List[int]] = None
42
+ parentQuestionnaireId: Optional[int] = None
43
+
44
+ @staticmethod
45
+ def _get_additional_endpoints() -> ConfigDict:
46
+ """
47
+ Get endpoints for the Questionnaire model.
48
+
49
+ :return: A dictionary of endpoints
50
+ :rtype: ConfigDict
51
+ """
52
+ return ConfigDict(
53
+ get_count="/api/{model_slug}/getCount",
54
+ graph_post="/api/{model_slug}/graph",
55
+ filter_post="/api/{model_slug}/filterQuestionnaires",
56
+ create_with_data_post="/api/{model_slug}/createWithData",
57
+ insert="/api/{model_slug}/create",
58
+ create_instances_from_questionnaires_post="/api/{model_slug}/createInstancesFromQuestionnaires",
59
+ create_instances_from_questionnaires_return_instance="/api/{model_slug}/createInstancesFromQuestionnairesReturnInstances",
60
+ upload_post="/api/{model_slug}/upload",
61
+ upload_bulk_email_assignment_post="/api/{model_slug}/uploadBulkEmailAssignment/{questionnaireId}",
62
+ get_updatable_instances_get="/api/{model_slug}/getUpdatableInstances/{questionnaireId}",
63
+ update_assigned_instances_put="/api/{model_slug}/updateAssignedInstances",
64
+ export_get="/api/{model_slug}/exportQuestionnaire/{questionnaireId}",
65
+ export_example_get="/api/{model_slug}/exportQuestionnaireExample",
66
+ export_responses_post="/api/{model_slug}/exportQuestionnaireResponses",
67
+ )
68
+
69
+ @classmethod
70
+ def create_instances_from_questionnaires(cls, payload: dict) -> Optional[List[QuestionnaireInstance]]:
71
+ """
72
+ Creates instances from questionnaires.
73
+ :param payload: The payload to send to the API.
74
+ :return: The response from the API or None
75
+ :rtype: Optional[List[QuestionnaireInstance]]
76
+ """
77
+ endpoint = cls.get_endpoint("create_instances_from_questionnaires_return_instance")
78
+ response = cls._get_api_handler().post(endpoint.format(model_slug=cls._module_slug), data=payload)
79
+
80
+ if not response or response.status_code in [204, 404]:
81
+ return None
82
+ if response.ok:
83
+ response_json = response.json()
84
+ return [QuestionnaireInstance(**instance) for instance in response_json.get("createdInstances", [])]
85
+ else:
86
+ logger.info(f"Failed to create instances from questionnaires {response.status_code} - {response.text}")
87
+ return None
@@ -0,0 +1,177 @@
1
+ """
2
+ This module contains the QuestionnaireInstances model.
3
+ """
4
+
5
+ from enum import Enum
6
+ from typing import Optional, List, Dict, Any
7
+
8
+ from pydantic import Field, ConfigDict
9
+
10
+ from regscale.core.app.utils.app_utils import get_current_datetime
11
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
12
+ import logging
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class QuestionnaireInstanceState(str, Enum):
18
+ """
19
+ Enum for the QuestionnaireInstanceState field in the QuestionnaireInstances model.
20
+ """
21
+
22
+ Open = 0
23
+ Submitted = 10
24
+ Accepted = 20
25
+ RequestChanges = 30
26
+ Closed = 40
27
+
28
+
29
+ class QuestionnaireInstance(RegScaleModel):
30
+ """
31
+ A class to represent the QuestionnaireInstances model in RegScale.
32
+ """
33
+
34
+ _module_slug = "questionnaireInstances"
35
+
36
+ id: int = 0
37
+ parentId: int = 0
38
+ parentModule: Optional[str] = None
39
+ token: Optional[int] = 0
40
+ title: Optional[str] = None
41
+ parentQuestionnaireId: int
42
+ activeStatus: bool = True
43
+ passingStatus: int = 0
44
+ instanceState: int = 0
45
+ uuid: Optional[str] = None
46
+ createdById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
47
+ dateCreated: Optional[str] = Field(default_factory=get_current_datetime)
48
+ lastUpdatedById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
49
+ dateLastUpdated: Optional[str] = Field(default_factory=get_current_datetime)
50
+ tenantsId: Optional[int] = 1
51
+ isPublic: bool = True
52
+ jsonData: Optional[str] = None # Adjust the type if it's not a string
53
+ assigneeId: Optional[str] = None
54
+ recurrence: Optional[str] = None # Adjust the type if it's not a string
55
+ dueDate: Optional[str] = None
56
+ sections: Optional[List[int]] = Field(default_factory=list) # Adjust the type if it's not a string
57
+ rules: Optional[str] = None # Adjust the type if it's not a string
58
+ emailList: Optional[str] = None # Adjust the type if it's not a string
59
+ loginRequired: bool = True
60
+ accessCode: Optional[str] = None
61
+ questionnaireIds: Optional[List[int]] = None
62
+ percentComplete: Optional[int] = None
63
+ questions: Optional[List[Dict]] = None # Adjust the type if it's not a string
64
+
65
+ @staticmethod
66
+ def _get_additional_endpoints() -> ConfigDict:
67
+ """
68
+ Get additional endpoints for the QuestionnaireInstances model.
69
+
70
+ :return: A dictionary of additional endpoints
71
+ :rtype: ConfigDict
72
+ """
73
+ return ConfigDict(
74
+ get_count="/api/{model_slug}/getCount",
75
+ graph="/api/{model_slug}/graph",
76
+ filter_questionnaire_instances="/api/{model_slug}/filterQuestionnaireInstances",
77
+ get_all_by_parent="/api/{model_slug}/getAllByParent/{parentQuestionnaireId}",
78
+ link_questionnaire_instance_post="/api/{model_slug}/link",
79
+ link_feedback="/api/{model_slug}/linkFeedback/{id}",
80
+ is_login_required="/api/{model_slug}/isLoginRequired/{uuid}",
81
+ update_responses="/api/{model_slug}/updateResponses/{uuid}",
82
+ update_feedback="/api/{model_slug}/updateFeedback/{uuid}",
83
+ change_state_accepted="/api/{model_slug}/changeStateAccepted/{uuid}",
84
+ change_state_rejected="/api/{model_slug}/changeStateRejected/{uuid}",
85
+ submit_for_feedback="/api/{model_slug}/submitForFeedback/{uuid}",
86
+ reopen_instance="/api/{model_slug}/reopenInstance/{uuid}",
87
+ export_questionnaire_instance="/api/{model_slug}/exportQuestionnaireInstance/{questionnaireInstanceId}",
88
+ create_instances_from_questionnaires_post="/api/questionnaires/createInstancesFromQuestionnaires",
89
+ )
90
+
91
+ def create_instances_from_questionnaires(self) -> Optional[Dict]:
92
+ """
93
+ Creates instances from questionnaires.
94
+
95
+ :return: The response from the API or None
96
+ :rtype: Optional[Dict]
97
+ """
98
+ endpoint = self.get_endpoint("create_instances_from_questionnaires_post")
99
+ headers = {
100
+ "Content-Type": "application/json-patch+json",
101
+ "Authorization": self._get_api_handler().config.get("token"),
102
+ "accept": "*/*",
103
+ "origin": self._get_api_handler().config.get("domain"),
104
+ }
105
+ response = self._get_api_handler().post(endpoint, headers=headers, data=self.dict())
106
+
107
+ if not response or response.status_code in [204, 404]:
108
+ return None
109
+ if response.ok:
110
+ return response.json()
111
+ else:
112
+ logger.info(f"Failed to create instances from questionnaires {response.status_code} - {response.text}")
113
+ return None
114
+
115
+ @classmethod
116
+ def link_feedback(cls, id: int) -> Optional[Dict[str, Any]]:
117
+ """
118
+ Retrieves a questionnaire based on its ID for feedback purposes.
119
+
120
+ :param int id: The ID of the questionnaire
121
+ :return: The response from the API or None
122
+ :rtype: Optional[Dict[str, Any]]
123
+ """
124
+ endpoint = cls.get_endpoint("link_feedback").format(model_slug=cls._module_slug, id=id)
125
+ response = cls._get_api_handler().get(endpoint)
126
+
127
+ if not response or response.status_code in [204, 404]:
128
+ return None
129
+ if response.ok:
130
+ try:
131
+ return response.json()
132
+ except Exception:
133
+ return None
134
+ return None
135
+
136
+ @classmethod
137
+ def get_all_by_parent(cls, parent_questionnaire_id: int) -> List["QuestionnaireInstance"]:
138
+ """
139
+ Retrieves all questionnaire instances of a parent questionnaire.
140
+
141
+ :param int parent_questionnaire_id: The ID of the parent questionnaire
142
+ :return: A list of questionnaire instances or None
143
+ :rtype: List[QuestionnaireInstance]
144
+ """
145
+ response = cls._get_api_handler().get(
146
+ endpoint=cls.get_endpoint("get_all_by_parent").format(
147
+ model_slug=cls._module_slug,
148
+ parentQuestionnaireId=parent_questionnaire_id,
149
+ )
150
+ )
151
+ if not response or response.status_code in [204, 404]:
152
+ return []
153
+ if response and response.ok:
154
+ return [cls(**item) for item in response.json()]
155
+ return []
156
+
157
+ @classmethod
158
+ def filter(cls, payload: Dict) -> Optional[List["QuestionnaireInstance"]]:
159
+ """
160
+ Filters questionnaire instances based on the payload.
161
+
162
+ :param Dict payload: The data to be sent in the request body
163
+ :return: A list of questionnaire instances or None
164
+ :rtype: Optional[List[QuestionnaireInstance]]
165
+ """
166
+ endpoint = cls.get_endpoint("filter_questionnaire_instances").format(model_slug=cls._module_slug)
167
+ response = cls._get_api_handler().post(endpoint, data=payload)
168
+
169
+ if not response or response.status_code in [204, 404]:
170
+ return None
171
+ if response.ok:
172
+ data = response.json()
173
+ items = data.get("items")
174
+ total = data.get("totalItems")
175
+ logger.info(f"Found Total Change Questionnaires accepted: {total}")
176
+ return [cls(**item) for item in items]
177
+ return None
@@ -0,0 +1,132 @@
1
+ from typing import Optional
2
+
3
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
4
+ from pydantic import Field, ConfigDict
5
+ import logging
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+
10
+ class RBAC(RegScaleModel):
11
+
12
+ _module_slug = "rbac"
13
+ id: Optional[int] = Field(alias="rbacId")
14
+ moduleId: Optional[int] = None
15
+ parentId: Optional[int] = None
16
+ groupId: Optional[int] = None
17
+ permissionType: Optional[int] = None
18
+
19
+ @staticmethod
20
+ def _get_additional_endpoints() -> ConfigDict:
21
+ """
22
+ Get additional endpoints for the RBAC model.
23
+
24
+ :return: A dictionary of additional endpoints
25
+ :rtype: ConfigDict
26
+ """
27
+ return ConfigDict(
28
+ get_all_by_parent="/api/{model_slug}/{moduleId}/{parentId}",
29
+ add="/api/{model_slug}/add/{moduleId}/{parentId}/{groupId}/{permissionType}",
30
+ public="/api/{model_slug}/public/{moduleId}/{parentId}/{public}",
31
+ none_standard_delete="/api/{model_slug}/{moduleId}/{parentId}/{rbacId}",
32
+ )
33
+
34
+ @classmethod
35
+ def delete(cls, module_id: int, parent_id: int, rbac_id: int) -> bool:
36
+ """
37
+ Delete a RBAC entry.
38
+
39
+ :param int module_id: The ID of the module
40
+ :param int parent_id: The ID of the parent
41
+ :param int rbac_id: The ID of the RBAC entry
42
+ :return: True if the RBAC entry was deleted, False otherwise
43
+ :rtype: bool
44
+ """
45
+ response = cls._get_api_handler().delete(
46
+ endpoint=cls.get_endpoint("none_standard_delete").format(
47
+ model_slug=cls._module_slug,
48
+ moduleId=module_id,
49
+ parentId=parent_id,
50
+ rbacId=rbac_id,
51
+ )
52
+ )
53
+ if response and response.ok:
54
+ return True
55
+ else:
56
+ cls.log_response_error(response=response)
57
+
58
+ @classmethod
59
+ def get_all_by_parent(cls, module_id: int, parent_id: int) -> list:
60
+ """
61
+ Get all RBAC entries by parent. Override from regscaleModel due to different endpoint params on api call.
62
+
63
+ :param int module_id: The ID of the module
64
+ :param int parent_id: The ID of the parent
65
+ :return: A list of RBAC entries
66
+ :rtype: list
67
+ """
68
+ response = cls._get_api_handler().get(
69
+ endpoint=cls.get_endpoint("get_all_by_parent").format(
70
+ model_slug=cls._module_slug,
71
+ moduleId=module_id,
72
+ parentId=parent_id,
73
+ )
74
+ )
75
+ if response and response.ok:
76
+ logger.info(f"Response: {response.json()}")
77
+ return [cls(**o) for o in response.json()]
78
+ else:
79
+ cls.log_response_error(response=response)
80
+ return []
81
+
82
+ @classmethod
83
+ def add(cls, module_id: int, parent_id: int, group_id: int, permission_type: int) -> bool:
84
+ """
85
+ Add a new RBAC entry.
86
+
87
+ :param int module_id: The ID of the module
88
+ :param int parent_id: The ID of the parent
89
+ :param int group_id: The ID of the group
90
+ :param int permission_type: The permission type
91
+ :return: True if the RBAC entry was added, False otherwise
92
+ :rtype: bool
93
+ """
94
+ response = cls._get_api_handler().get(
95
+ endpoint=cls.get_endpoint("add").format(
96
+ model_slug=cls._module_slug,
97
+ moduleId=module_id,
98
+ parentId=parent_id,
99
+ groupId=group_id,
100
+ permissionType=permission_type,
101
+ )
102
+ )
103
+ if response and response.ok:
104
+ return True
105
+ else:
106
+ cls.log_response_error(response=response)
107
+ return False
108
+
109
+ @classmethod
110
+ def public(cls, module_id: int, parent_id: int, is_public: int = 0) -> bool:
111
+ """
112
+ Add a new RBAC entry.
113
+
114
+ :param int module_id: The ID of the module
115
+ :param int parent_id: The ID of the parent
116
+ :param int is_public: The public flag 0 is public and 1 is private
117
+ :return: True if the RBAC entry was added, False otherwise
118
+ :rtype: bool
119
+ """
120
+ response = cls._get_api_handler().get(
121
+ endpoint=cls.get_endpoint("public").format(
122
+ model_slug=cls._module_slug,
123
+ moduleId=module_id,
124
+ parentId=parent_id,
125
+ public=is_public,
126
+ )
127
+ )
128
+ if response and response.ok:
129
+ return True
130
+ else:
131
+ cls.log_response_error(response=response)
132
+ return False
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Provide References models."""
4
+ import warnings
5
+ from typing import List, Union, Optional
6
+
7
+ from pydantic import Field
8
+
9
+ from regscale.core.app.api import Api
10
+ from regscale.core.app.logz import create_logger
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 Reference(RegScaleModel):
16
+ """References model"""
17
+
18
+ _module_slug = "references"
19
+
20
+ id: int = 0
21
+ createdById: str = "" # this should be userID
22
+ dateCreated: str = Field(default_factory=get_current_datetime)
23
+ lastUpdatedById: str = "" # this should be userID
24
+ isPublic: bool = True
25
+ identificationNumber: str = ""
26
+ title: str = ""
27
+ version: str = ""
28
+ datePublished: str = Field(default_factory=get_current_datetime)
29
+ referenceType: str = ""
30
+ link: str = ""
31
+ parentId: int = 0
32
+ parentModule: str = ""
33
+ dateLastUpdated: str = Field(default_factory=get_current_datetime)
34
+
35
+ @staticmethod
36
+ def create_references_from_list(
37
+ parent_id: Union[str, int],
38
+ references_list: List[dict],
39
+ parent_module: Optional[str] = "securityplans",
40
+ ) -> List[Union["Reference", bool]]:
41
+ """
42
+ Create a list of References objects from a list of dicts
43
+
44
+ :param Union[str, int] parent_id: ID of the SSP to create the References objects for
45
+ :param List[dict] references_list: List of dicts to create objects from
46
+ :param Optional[str] parent_module: Parent module of the References objects, defaults to "securityplans"
47
+ :return: List of References objects or False if unsuccessful
48
+ :rtype: List[Union[Reference, bool]]
49
+ """
50
+ references = [
51
+ Reference(parentId=int(parent_id), parentModule=parent_module, **references)
52
+ for references in references_list
53
+ ]
54
+ response = []
55
+ for reference in references:
56
+ response.append(reference.create_new_references(return_object=True))
57
+ return response
58
+
59
+ def create_new_references(self, return_object: Optional[bool] = False) -> Union[bool, "Reference"]:
60
+ """
61
+ Create a new References object in RegScale
62
+
63
+ :param Optional[bool] return_object: Return the References object if successful, defaults to False
64
+ :return: True if successful, False otherwise
65
+ :rtype: Union[bool, "Reference"]
66
+ """
67
+ warnings.warn(
68
+ "The 'create_new_references' method is deprecated, use 'create' method instead",
69
+ DeprecationWarning,
70
+ )
71
+ api = Api()
72
+ data = self.dict()
73
+ data["createdById"] = api.config["userId"]
74
+ data["lastUpdatedById"] = api.config["userId"]
75
+ references_response = api.post(
76
+ f'{api.config["domain"]}/api/references/',
77
+ json=data,
78
+ )
79
+ logger = create_logger()
80
+ if references_response.ok:
81
+ logger.info(f'Created References: {references_response.json()["id"]}')
82
+ if return_object:
83
+ return Reference(**references_response.json())
84
+ return True
85
+ logger.error(f"Error creating References: {references_response.text}")
86
+ return False