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.
- regscale/__init__.py +1 -0
- regscale/airflow/__init__.py +9 -0
- regscale/airflow/azure/__init__.py +9 -0
- regscale/airflow/azure/cli.py +89 -0
- regscale/airflow/azure/upload_dags.py +116 -0
- regscale/airflow/click_dags.py +127 -0
- regscale/airflow/click_mixins.py +82 -0
- regscale/airflow/config.py +25 -0
- regscale/airflow/factories/__init__.py +0 -0
- regscale/airflow/factories/connections.py +58 -0
- regscale/airflow/factories/workflows.py +78 -0
- regscale/airflow/hierarchy.py +88 -0
- regscale/airflow/operators/__init__.py +0 -0
- regscale/airflow/operators/click.py +36 -0
- regscale/airflow/sensors/__init__.py +0 -0
- regscale/airflow/sensors/sql.py +107 -0
- regscale/airflow/sessions/__init__.py +0 -0
- regscale/airflow/sessions/sql/__init__.py +3 -0
- regscale/airflow/sessions/sql/queries.py +64 -0
- regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
- regscale/airflow/tasks/__init__.py +0 -0
- regscale/airflow/tasks/branches.py +22 -0
- regscale/airflow/tasks/cli.py +116 -0
- regscale/airflow/tasks/click.py +73 -0
- regscale/airflow/tasks/debugging.py +9 -0
- regscale/airflow/tasks/groups.py +116 -0
- regscale/airflow/tasks/init.py +60 -0
- regscale/airflow/tasks/states.py +47 -0
- regscale/airflow/tasks/workflows.py +36 -0
- regscale/ansible/__init__.py +9 -0
- regscale/core/__init__.py +0 -0
- regscale/core/app/__init__.py +3 -0
- regscale/core/app/api.py +571 -0
- regscale/core/app/application.py +665 -0
- regscale/core/app/internal/__init__.py +136 -0
- regscale/core/app/internal/admin_actions.py +230 -0
- regscale/core/app/internal/assessments_editor.py +873 -0
- regscale/core/app/internal/catalog.py +316 -0
- regscale/core/app/internal/comparison.py +459 -0
- regscale/core/app/internal/control_editor.py +571 -0
- regscale/core/app/internal/encrypt.py +79 -0
- regscale/core/app/internal/evidence.py +1240 -0
- regscale/core/app/internal/file_uploads.py +151 -0
- regscale/core/app/internal/healthcheck.py +66 -0
- regscale/core/app/internal/login.py +305 -0
- regscale/core/app/internal/migrations.py +240 -0
- regscale/core/app/internal/model_editor.py +1701 -0
- regscale/core/app/internal/poam_editor.py +632 -0
- regscale/core/app/internal/workflow.py +105 -0
- regscale/core/app/logz.py +74 -0
- regscale/core/app/utils/XMLIR.py +258 -0
- regscale/core/app/utils/__init__.py +0 -0
- regscale/core/app/utils/api_handler.py +358 -0
- regscale/core/app/utils/app_utils.py +1110 -0
- regscale/core/app/utils/catalog_utils/__init__.py +0 -0
- regscale/core/app/utils/catalog_utils/common.py +91 -0
- regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
- regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
- regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
- regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
- regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
- regscale/core/app/utils/file_utils.py +238 -0
- regscale/core/app/utils/parser_utils.py +81 -0
- regscale/core/app/utils/pickle_file_handler.py +57 -0
- regscale/core/app/utils/regscale_utils.py +319 -0
- regscale/core/app/utils/report_utils.py +119 -0
- regscale/core/app/utils/variables.py +226 -0
- regscale/core/decorators.py +31 -0
- regscale/core/lazy_group.py +65 -0
- regscale/core/login.py +63 -0
- regscale/core/server/__init__.py +0 -0
- regscale/core/server/flask_api.py +473 -0
- regscale/core/server/helpers.py +373 -0
- regscale/core/server/rest.py +64 -0
- regscale/core/server/static/css/bootstrap.css +6030 -0
- regscale/core/server/static/css/bootstrap.min.css +6 -0
- regscale/core/server/static/css/main.css +176 -0
- regscale/core/server/static/images/regscale-cli.svg +49 -0
- regscale/core/server/static/images/regscale.svg +38 -0
- regscale/core/server/templates/base.html +74 -0
- regscale/core/server/templates/index.html +43 -0
- regscale/core/server/templates/login.html +28 -0
- regscale/core/server/templates/make_base64.html +22 -0
- regscale/core/server/templates/upload_STIG.html +109 -0
- regscale/core/server/templates/upload_STIG_result.html +26 -0
- regscale/core/server/templates/upload_ssp.html +144 -0
- regscale/core/server/templates/upload_ssp_result.html +128 -0
- regscale/core/static/__init__.py +0 -0
- regscale/core/static/regex.py +14 -0
- regscale/core/utils/__init__.py +117 -0
- regscale/core/utils/click_utils.py +13 -0
- regscale/core/utils/date.py +238 -0
- regscale/core/utils/graphql.py +254 -0
- regscale/core/utils/urls.py +23 -0
- regscale/dev/__init__.py +6 -0
- regscale/dev/analysis.py +454 -0
- regscale/dev/cli.py +235 -0
- regscale/dev/code_gen.py +492 -0
- regscale/dev/dirs.py +69 -0
- regscale/dev/docs.py +384 -0
- regscale/dev/monitoring.py +26 -0
- regscale/dev/profiling.py +216 -0
- regscale/exceptions/__init__.py +4 -0
- regscale/exceptions/license_exception.py +7 -0
- regscale/exceptions/validation_exception.py +9 -0
- regscale/integrations/__init__.py +1 -0
- regscale/integrations/commercial/__init__.py +486 -0
- regscale/integrations/commercial/ad.py +433 -0
- regscale/integrations/commercial/amazon/__init__.py +0 -0
- regscale/integrations/commercial/amazon/common.py +106 -0
- regscale/integrations/commercial/aqua/__init__.py +0 -0
- regscale/integrations/commercial/aqua/aqua.py +91 -0
- regscale/integrations/commercial/aws/__init__.py +6 -0
- regscale/integrations/commercial/aws/cli.py +322 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
- regscale/integrations/commercial/aws/inventory/base.py +64 -0
- regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
- regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
- regscale/integrations/commercial/aws/scanner.py +823 -0
- regscale/integrations/commercial/azure/__init__.py +0 -0
- regscale/integrations/commercial/azure/common.py +32 -0
- regscale/integrations/commercial/azure/intune.py +488 -0
- regscale/integrations/commercial/azure/scanner.py +49 -0
- regscale/integrations/commercial/burp.py +78 -0
- regscale/integrations/commercial/cpe.py +144 -0
- regscale/integrations/commercial/crowdstrike.py +1117 -0
- regscale/integrations/commercial/defender.py +1511 -0
- regscale/integrations/commercial/dependabot.py +210 -0
- regscale/integrations/commercial/durosuite/__init__.py +0 -0
- regscale/integrations/commercial/durosuite/api.py +1546 -0
- regscale/integrations/commercial/durosuite/process_devices.py +101 -0
- regscale/integrations/commercial/durosuite/scanner.py +637 -0
- regscale/integrations/commercial/durosuite/variables.py +21 -0
- regscale/integrations/commercial/ecr.py +90 -0
- regscale/integrations/commercial/gcp/__init__.py +237 -0
- regscale/integrations/commercial/gcp/auth.py +96 -0
- regscale/integrations/commercial/gcp/control_tests.py +238 -0
- regscale/integrations/commercial/gcp/variables.py +18 -0
- regscale/integrations/commercial/gitlab.py +332 -0
- regscale/integrations/commercial/grype.py +165 -0
- regscale/integrations/commercial/ibm.py +90 -0
- regscale/integrations/commercial/import_all/__init__.py +0 -0
- regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
- regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
- regscale/integrations/commercial/jira.py +1046 -0
- regscale/integrations/commercial/mappings/__init__.py +0 -0
- regscale/integrations/commercial/mappings/csf_controls.json +713 -0
- regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
- regscale/integrations/commercial/nessus/__init__.py +0 -0
- regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
- regscale/integrations/commercial/nessus/scanner.py +416 -0
- regscale/integrations/commercial/nexpose.py +90 -0
- regscale/integrations/commercial/okta.py +798 -0
- regscale/integrations/commercial/opentext/__init__.py +0 -0
- regscale/integrations/commercial/opentext/click.py +99 -0
- regscale/integrations/commercial/opentext/scanner.py +143 -0
- regscale/integrations/commercial/prisma.py +91 -0
- regscale/integrations/commercial/qualys.py +1462 -0
- regscale/integrations/commercial/salesforce.py +980 -0
- regscale/integrations/commercial/sap/__init__.py +0 -0
- regscale/integrations/commercial/sap/click.py +31 -0
- regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
- regscale/integrations/commercial/sap/sysdig/click.py +57 -0
- regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
- regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
- regscale/integrations/commercial/sap/tenable/click.py +49 -0
- regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
- regscale/integrations/commercial/servicenow.py +1756 -0
- regscale/integrations/commercial/sicura/__init__.py +0 -0
- regscale/integrations/commercial/sicura/api.py +855 -0
- regscale/integrations/commercial/sicura/commands.py +73 -0
- regscale/integrations/commercial/sicura/scanner.py +481 -0
- regscale/integrations/commercial/sicura/variables.py +16 -0
- regscale/integrations/commercial/snyk.py +90 -0
- regscale/integrations/commercial/sonarcloud.py +260 -0
- regscale/integrations/commercial/sqlserver.py +369 -0
- regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
- regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
- regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
- regscale/integrations/commercial/stigv2/__init__.py +0 -0
- regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
- regscale/integrations/commercial/stigv2/click_commands.py +95 -0
- regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
- regscale/integrations/commercial/synqly/__init__.py +0 -0
- regscale/integrations/commercial/synqly/assets.py +46 -0
- regscale/integrations/commercial/synqly/ticketing.py +132 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
- regscale/integrations/commercial/synqly_jira.py +840 -0
- regscale/integrations/commercial/tenablev2/__init__.py +0 -0
- regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
- regscale/integrations/commercial/tenablev2/click.py +1584 -0
- regscale/integrations/commercial/tenablev2/scanner.py +504 -0
- regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
- regscale/integrations/commercial/tenablev2/utils.py +78 -0
- regscale/integrations/commercial/tenablev2/variables.py +17 -0
- regscale/integrations/commercial/trivy.py +162 -0
- regscale/integrations/commercial/veracode.py +96 -0
- regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
- regscale/integrations/commercial/wizv2/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/click.py +429 -0
- regscale/integrations/commercial/wizv2/constants.py +1001 -0
- regscale/integrations/commercial/wizv2/issue.py +361 -0
- regscale/integrations/commercial/wizv2/models.py +112 -0
- regscale/integrations/commercial/wizv2/parsers.py +339 -0
- regscale/integrations/commercial/wizv2/sbom.py +115 -0
- regscale/integrations/commercial/wizv2/scanner.py +416 -0
- regscale/integrations/commercial/wizv2/utils.py +796 -0
- regscale/integrations/commercial/wizv2/variables.py +39 -0
- regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
- regscale/integrations/commercial/xray.py +91 -0
- regscale/integrations/integration/__init__.py +2 -0
- regscale/integrations/integration/integration.py +26 -0
- regscale/integrations/integration/inventory.py +17 -0
- regscale/integrations/integration/issue.py +100 -0
- regscale/integrations/integration_override.py +149 -0
- regscale/integrations/public/__init__.py +103 -0
- regscale/integrations/public/cisa.py +641 -0
- regscale/integrations/public/criticality_updater.py +70 -0
- regscale/integrations/public/emass.py +411 -0
- regscale/integrations/public/emass_slcm_import.py +697 -0
- regscale/integrations/public/fedramp/__init__.py +0 -0
- regscale/integrations/public/fedramp/appendix_parser.py +548 -0
- regscale/integrations/public/fedramp/click.py +479 -0
- regscale/integrations/public/fedramp/components.py +714 -0
- regscale/integrations/public/fedramp/docx_parser.py +259 -0
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
- regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
- regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
- regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
- regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
- regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
- regscale/integrations/public/fedramp/import_workbook.py +495 -0
- regscale/integrations/public/fedramp/inventory_items.py +244 -0
- regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
- regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
- regscale/integrations/public/fedramp/mappings/user.py +175 -0
- regscale/integrations/public/fedramp/mappings/values.py +141 -0
- regscale/integrations/public/fedramp/markdown_parser.py +150 -0
- regscale/integrations/public/fedramp/metadata.py +689 -0
- regscale/integrations/public/fedramp/models/__init__.py +59 -0
- regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
- regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
- regscale/integrations/public/fedramp/parts_mapper.py +107 -0
- regscale/integrations/public/fedramp/poam/__init__.py +0 -0
- regscale/integrations/public/fedramp/poam/scanner.py +851 -0
- regscale/integrations/public/fedramp/properties.py +201 -0
- regscale/integrations/public/fedramp/reporting.py +84 -0
- regscale/integrations/public/fedramp/resources.py +496 -0
- regscale/integrations/public/fedramp/rosetta.py +110 -0
- regscale/integrations/public/fedramp/ssp_logger.py +87 -0
- regscale/integrations/public/fedramp/system_characteristics.py +922 -0
- regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
- regscale/integrations/public/fedramp/system_implementation.py +190 -0
- regscale/integrations/public/fedramp/xml_utils.py +87 -0
- regscale/integrations/public/nist_catalog.py +275 -0
- regscale/integrations/public/oscal.py +1946 -0
- regscale/integrations/public/otx.py +169 -0
- regscale/integrations/scanner_integration.py +2692 -0
- regscale/integrations/variables.py +25 -0
- regscale/models/__init__.py +7 -0
- regscale/models/app_models/__init__.py +5 -0
- regscale/models/app_models/catalog_compare.py +213 -0
- regscale/models/app_models/click.py +252 -0
- regscale/models/app_models/datetime_encoder.py +21 -0
- regscale/models/app_models/import_validater.py +321 -0
- regscale/models/app_models/mapping.py +260 -0
- regscale/models/app_models/pipeline.py +37 -0
- regscale/models/click_models.py +413 -0
- regscale/models/config.py +154 -0
- regscale/models/email_style.css +67 -0
- regscale/models/hierarchy.py +8 -0
- regscale/models/inspect_models.py +79 -0
- regscale/models/integration_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/inspector.py +262 -0
- regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
- regscale/models/integration_models/aqua.py +247 -0
- regscale/models/integration_models/azure_alerts.py +255 -0
- regscale/models/integration_models/base64.py +23 -0
- regscale/models/integration_models/burp.py +433 -0
- regscale/models/integration_models/burp_models.py +128 -0
- regscale/models/integration_models/cisa_kev_data.json +19333 -0
- regscale/models/integration_models/defender_data.py +93 -0
- regscale/models/integration_models/defenderimport.py +143 -0
- regscale/models/integration_models/drf.py +443 -0
- regscale/models/integration_models/ecr_models/__init__.py +0 -0
- regscale/models/integration_models/ecr_models/data.py +69 -0
- regscale/models/integration_models/ecr_models/ecr.py +239 -0
- regscale/models/integration_models/flat_file_importer.py +1079 -0
- regscale/models/integration_models/grype_import.py +247 -0
- regscale/models/integration_models/ibm.py +126 -0
- regscale/models/integration_models/implementation_results.py +85 -0
- regscale/models/integration_models/nexpose.py +140 -0
- regscale/models/integration_models/prisma.py +202 -0
- regscale/models/integration_models/qualys.py +720 -0
- regscale/models/integration_models/qualys_scanner.py +160 -0
- regscale/models/integration_models/sbom/__init__.py +0 -0
- regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
- regscale/models/integration_models/send_reminders.py +620 -0
- regscale/models/integration_models/snyk.py +155 -0
- regscale/models/integration_models/synqly_models/__init__.py +0 -0
- regscale/models/integration_models/synqly_models/capabilities.json +1 -0
- regscale/models/integration_models/synqly_models/connector_types.py +22 -0
- regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
- regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
- regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
- regscale/models/integration_models/synqly_models/param.py +72 -0
- regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
- regscale/models/integration_models/synqly_models/tenants.py +39 -0
- regscale/models/integration_models/tenable_models/__init__.py +0 -0
- regscale/models/integration_models/tenable_models/integration.py +187 -0
- regscale/models/integration_models/tenable_models/models.py +513 -0
- regscale/models/integration_models/trivy_import.py +231 -0
- regscale/models/integration_models/veracode.py +217 -0
- regscale/models/integration_models/xray.py +135 -0
- regscale/models/locking.py +100 -0
- regscale/models/platform.py +110 -0
- regscale/models/regscale_models/__init__.py +67 -0
- regscale/models/regscale_models/assessment.py +570 -0
- regscale/models/regscale_models/assessment_plan.py +52 -0
- regscale/models/regscale_models/asset.py +567 -0
- regscale/models/regscale_models/asset_mapping.py +190 -0
- regscale/models/regscale_models/case.py +42 -0
- regscale/models/regscale_models/catalog.py +261 -0
- regscale/models/regscale_models/cci.py +46 -0
- regscale/models/regscale_models/change.py +167 -0
- regscale/models/regscale_models/checklist.py +372 -0
- regscale/models/regscale_models/comment.py +49 -0
- regscale/models/regscale_models/compliance_settings.py +112 -0
- regscale/models/regscale_models/component.py +412 -0
- regscale/models/regscale_models/component_mapping.py +65 -0
- regscale/models/regscale_models/control.py +38 -0
- regscale/models/regscale_models/control_implementation.py +1128 -0
- regscale/models/regscale_models/control_objective.py +261 -0
- regscale/models/regscale_models/control_parameter.py +100 -0
- regscale/models/regscale_models/control_test.py +34 -0
- regscale/models/regscale_models/control_test_plan.py +75 -0
- regscale/models/regscale_models/control_test_result.py +52 -0
- regscale/models/regscale_models/custom_field.py +245 -0
- regscale/models/regscale_models/data.py +109 -0
- regscale/models/regscale_models/data_center.py +40 -0
- regscale/models/regscale_models/deviation.py +203 -0
- regscale/models/regscale_models/email.py +97 -0
- regscale/models/regscale_models/evidence.py +47 -0
- regscale/models/regscale_models/evidence_mapping.py +40 -0
- regscale/models/regscale_models/facility.py +59 -0
- regscale/models/regscale_models/file.py +382 -0
- regscale/models/regscale_models/filetag.py +37 -0
- regscale/models/regscale_models/form_field_value.py +94 -0
- regscale/models/regscale_models/group.py +169 -0
- regscale/models/regscale_models/implementation_objective.py +335 -0
- regscale/models/regscale_models/implementation_option.py +275 -0
- regscale/models/regscale_models/implementation_role.py +33 -0
- regscale/models/regscale_models/incident.py +177 -0
- regscale/models/regscale_models/interconnection.py +43 -0
- regscale/models/regscale_models/issue.py +1176 -0
- regscale/models/regscale_models/leveraged_authorization.py +125 -0
- regscale/models/regscale_models/line_of_inquiry.py +52 -0
- regscale/models/regscale_models/link.py +205 -0
- regscale/models/regscale_models/meta_data.py +64 -0
- regscale/models/regscale_models/mixins/__init__.py +0 -0
- regscale/models/regscale_models/mixins/parent_cache.py +124 -0
- regscale/models/regscale_models/module.py +224 -0
- regscale/models/regscale_models/modules.py +191 -0
- regscale/models/regscale_models/objective.py +14 -0
- regscale/models/regscale_models/parameter.py +87 -0
- regscale/models/regscale_models/ports_protocol.py +81 -0
- regscale/models/regscale_models/privacy.py +89 -0
- regscale/models/regscale_models/profile.py +50 -0
- regscale/models/regscale_models/profile_link.py +68 -0
- regscale/models/regscale_models/profile_mapping.py +124 -0
- regscale/models/regscale_models/project.py +63 -0
- regscale/models/regscale_models/property.py +278 -0
- regscale/models/regscale_models/question.py +85 -0
- regscale/models/regscale_models/questionnaire.py +87 -0
- regscale/models/regscale_models/questionnaire_instance.py +177 -0
- regscale/models/regscale_models/rbac.py +132 -0
- regscale/models/regscale_models/reference.py +86 -0
- regscale/models/regscale_models/regscale_model.py +1643 -0
- regscale/models/regscale_models/requirement.py +29 -0
- regscale/models/regscale_models/risk.py +274 -0
- regscale/models/regscale_models/sbom.py +54 -0
- regscale/models/regscale_models/scan_history.py +436 -0
- regscale/models/regscale_models/search.py +53 -0
- regscale/models/regscale_models/security_control.py +132 -0
- regscale/models/regscale_models/security_plan.py +204 -0
- regscale/models/regscale_models/software_inventory.py +159 -0
- regscale/models/regscale_models/stake_holder.py +64 -0
- regscale/models/regscale_models/stig.py +647 -0
- regscale/models/regscale_models/supply_chain.py +152 -0
- regscale/models/regscale_models/system_role.py +188 -0
- regscale/models/regscale_models/system_role_external_assignment.py +40 -0
- regscale/models/regscale_models/tag.py +37 -0
- regscale/models/regscale_models/tag_mapping.py +19 -0
- regscale/models/regscale_models/task.py +133 -0
- regscale/models/regscale_models/threat.py +196 -0
- regscale/models/regscale_models/user.py +175 -0
- regscale/models/regscale_models/user_group.py +55 -0
- regscale/models/regscale_models/vulnerability.py +242 -0
- regscale/models/regscale_models/vulnerability_mapping.py +162 -0
- regscale/models/regscale_models/workflow.py +55 -0
- regscale/models/regscale_models/workflow_action.py +34 -0
- regscale/models/regscale_models/workflow_instance.py +269 -0
- regscale/models/regscale_models/workflow_instance_step.py +114 -0
- regscale/models/regscale_models/workflow_template.py +58 -0
- regscale/models/regscale_models/workflow_template_step.py +45 -0
- regscale/regscale.py +815 -0
- regscale/utils/__init__.py +7 -0
- regscale/utils/b64conversion.py +14 -0
- regscale/utils/click_utils.py +118 -0
- regscale/utils/decorators.py +48 -0
- regscale/utils/dict_utils.py +59 -0
- regscale/utils/files.py +79 -0
- regscale/utils/fxns.py +30 -0
- regscale/utils/graphql_client.py +113 -0
- regscale/utils/lists.py +16 -0
- regscale/utils/numbers.py +12 -0
- regscale/utils/shell.py +148 -0
- regscale/utils/string.py +121 -0
- regscale/utils/synqly_utils.py +165 -0
- regscale/utils/threading/__init__.py +8 -0
- regscale/utils/threading/threadhandler.py +131 -0
- regscale/utils/threading/threadsafe_counter.py +47 -0
- regscale/utils/threading/threadsafe_dict.py +242 -0
- regscale/utils/threading/threadsafe_list.py +83 -0
- regscale/utils/version.py +104 -0
- regscale/validation/__init__.py +0 -0
- regscale/validation/address.py +37 -0
- regscale/validation/record.py +48 -0
- regscale/visualization/__init__.py +5 -0
- regscale/visualization/click.py +34 -0
- regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
- regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
- regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
- regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
- regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
- regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
- tests/fixtures/__init__.py +2 -0
- tests/fixtures/api.py +87 -0
- tests/fixtures/models.py +91 -0
- tests/fixtures/test_fixture.py +144 -0
- tests/mocks/__init__.py +0 -0
- tests/mocks/objects.py +3 -0
- tests/mocks/response.py +32 -0
- tests/mocks/xml.py +13 -0
- tests/regscale/__init__.py +0 -0
- tests/regscale/core/__init__.py +0 -0
- tests/regscale/core/test_api.py +232 -0
- tests/regscale/core/test_app.py +406 -0
- tests/regscale/core/test_login.py +37 -0
- tests/regscale/core/test_logz.py +66 -0
- tests/regscale/core/test_sbom_generator.py +87 -0
- tests/regscale/core/test_validation_utils.py +163 -0
- tests/regscale/core/test_version.py +78 -0
- tests/regscale/models/__init__.py +0 -0
- tests/regscale/models/test_asset.py +71 -0
- tests/regscale/models/test_config.py +26 -0
- tests/regscale/models/test_control_implementation.py +27 -0
- tests/regscale/models/test_import.py +97 -0
- tests/regscale/models/test_issue.py +36 -0
- tests/regscale/models/test_mapping.py +52 -0
- tests/regscale/models/test_platform.py +31 -0
- tests/regscale/models/test_regscale_model.py +346 -0
- tests/regscale/models/test_report.py +32 -0
- tests/regscale/models/test_tenable_integrations.py +118 -0
- tests/regscale/models/test_user_model.py +121 -0
- tests/regscale/test_about.py +19 -0
- tests/regscale/test_authorization.py +65 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Control Objective Model"""
|
|
4
|
+
from collections import defaultdict
|
|
5
|
+
from typing import Any, Optional
|
|
6
|
+
|
|
7
|
+
from pydantic import Field, ConfigDict
|
|
8
|
+
|
|
9
|
+
from regscale.core.app.utils.app_utils import get_current_datetime
|
|
10
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ControlObjective(RegScaleModel):
|
|
14
|
+
"""RegScale Control Objective"""
|
|
15
|
+
|
|
16
|
+
_module_slug = "controlObjectives"
|
|
17
|
+
_unique_fields = [
|
|
18
|
+
["securityControlId", "name"],
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
id: int = 0
|
|
22
|
+
uuid: Optional[str] = None
|
|
23
|
+
name: str
|
|
24
|
+
description: str
|
|
25
|
+
otherId: str = "" # API does not return if None
|
|
26
|
+
archived: bool = False
|
|
27
|
+
securityControlId: int
|
|
28
|
+
dateCreated: str = Field(default_factory=get_current_datetime)
|
|
29
|
+
dateLastUpdated: str = Field(default_factory=get_current_datetime)
|
|
30
|
+
objectiveType: str = "objective"
|
|
31
|
+
|
|
32
|
+
@staticmethod
|
|
33
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
34
|
+
"""
|
|
35
|
+
Get additional endpoints for the ControlObjective
|
|
36
|
+
|
|
37
|
+
:return: Additional endpoints for the ControlObjective
|
|
38
|
+
:rtype: ConfigDict
|
|
39
|
+
"""
|
|
40
|
+
return ConfigDict(
|
|
41
|
+
get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}",
|
|
42
|
+
insert="/api/{model_slug}",
|
|
43
|
+
get_by_catalog="/api/{model_slug}/getByCatalog/{catalogId}",
|
|
44
|
+
get_by_catalogue="/api/{model_slug}/getByCatalogue/{catalogId}",
|
|
45
|
+
# Note: This is identical to get_by_catalog, might be redundant
|
|
46
|
+
get_by_control="/api/{model_slug}/getByControl/{controlId}",
|
|
47
|
+
batch_create="/api/{model_slug}/batchCreate",
|
|
48
|
+
) # type: ignore
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def get_by_catalog(cls, catalog_id: int) -> list["ControlObjective"]:
|
|
52
|
+
"""
|
|
53
|
+
Get a list of objects by catalog.
|
|
54
|
+
|
|
55
|
+
:param int catalog_id: The ID of the catalog
|
|
56
|
+
:return: A list of objects
|
|
57
|
+
:rtype: list["ControlObjective"]
|
|
58
|
+
"""
|
|
59
|
+
endpoint = cls.get_endpoint("get_by_catalog").format(catalogId=catalog_id)
|
|
60
|
+
return cls._handle_list_response(cls._get_api_handler().get(endpoint))
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def get_by_catalogue(cls, catalog_id: int) -> list["ControlObjective"]:
|
|
64
|
+
"""
|
|
65
|
+
Get a list of objects by catalogue.
|
|
66
|
+
|
|
67
|
+
:param int catalog_id: The ID of the catalogue
|
|
68
|
+
:return: A list of objects
|
|
69
|
+
:rtype: list["ControlObjective"]
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
return cls.get_by_catalog(cls, catalog_id)
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def get_by_control(cls, control_id: int) -> list["ControlObjective"]:
|
|
76
|
+
"""
|
|
77
|
+
Get a list of objects by control.
|
|
78
|
+
|
|
79
|
+
:param int control_id: The ID of the control
|
|
80
|
+
:return: A list of objects
|
|
81
|
+
:rtype: list["ControlObjective"]
|
|
82
|
+
"""
|
|
83
|
+
endpoint = cls.get_endpoint("get_by_control").format(controlId=control_id)
|
|
84
|
+
return cls._handle_list_response(cls._get_api_handler().get(endpoint))
|
|
85
|
+
|
|
86
|
+
@staticmethod
|
|
87
|
+
def from_dict(obj: Any) -> "ControlObjective":
|
|
88
|
+
"""
|
|
89
|
+
Create ControlObjective object from dict
|
|
90
|
+
|
|
91
|
+
:param Any obj: Dictionary
|
|
92
|
+
:return: ControlObjective class from provided dict
|
|
93
|
+
:rtype: ControlObjective
|
|
94
|
+
"""
|
|
95
|
+
_securityControlId = int(obj.get("securityControlId", 0))
|
|
96
|
+
_id = int(obj.get("id", 0))
|
|
97
|
+
_uuid = str(obj.get("uuid"))
|
|
98
|
+
_name = str(obj.get("name"))
|
|
99
|
+
_description = str(obj.get("description"))
|
|
100
|
+
_otherId = str(obj.get("otherId"))
|
|
101
|
+
_objectiveType = str(obj.get("objectiveType"))
|
|
102
|
+
_archived = False
|
|
103
|
+
return ControlObjective(
|
|
104
|
+
_securityControlId,
|
|
105
|
+
_id,
|
|
106
|
+
_uuid,
|
|
107
|
+
_name,
|
|
108
|
+
_description,
|
|
109
|
+
_otherId,
|
|
110
|
+
_objectiveType,
|
|
111
|
+
_archived,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
@classmethod
|
|
115
|
+
def fetch_control_objectives_by_other_id(
|
|
116
|
+
cls, parent_id: int, other_id_contains: str, skip: int = 0, take: int = 50
|
|
117
|
+
) -> list["ControlObjective"]:
|
|
118
|
+
"""
|
|
119
|
+
Fetch control objectives by other ID.
|
|
120
|
+
|
|
121
|
+
:param int parent_id: The ID of the parent
|
|
122
|
+
:param str other_id_contains: The other ID to search for
|
|
123
|
+
:param int skip: Number of items to skip
|
|
124
|
+
:param int take: Number of items to take
|
|
125
|
+
:return: A list of control objectives
|
|
126
|
+
:rtype: list["ControlObjective"]
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
query = f"""
|
|
130
|
+
query GetControlImplementations() {{
|
|
131
|
+
controlImplementations(
|
|
132
|
+
skip: {skip}, take: {take}, where: {{
|
|
133
|
+
parentId: {{eq: {parent_id}}},
|
|
134
|
+
control: {{
|
|
135
|
+
controlObjectives: {{
|
|
136
|
+
some: {{
|
|
137
|
+
otherId: {{
|
|
138
|
+
contains: "{other_id_contains}"
|
|
139
|
+
}}
|
|
140
|
+
}}
|
|
141
|
+
}}
|
|
142
|
+
}}
|
|
143
|
+
}}
|
|
144
|
+
) {{
|
|
145
|
+
items {{
|
|
146
|
+
id
|
|
147
|
+
control {{
|
|
148
|
+
id,
|
|
149
|
+
controlObjectives {{
|
|
150
|
+
id
|
|
151
|
+
uuid
|
|
152
|
+
name
|
|
153
|
+
description
|
|
154
|
+
otherId
|
|
155
|
+
archived
|
|
156
|
+
securityControlId
|
|
157
|
+
dateCreated
|
|
158
|
+
dateLastUpdated
|
|
159
|
+
objectiveType
|
|
160
|
+
}}
|
|
161
|
+
}}
|
|
162
|
+
}}
|
|
163
|
+
pageInfo {{
|
|
164
|
+
hasNextPage
|
|
165
|
+
}}
|
|
166
|
+
totalCount
|
|
167
|
+
}}
|
|
168
|
+
}}
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
response = cls._get_api_handler().graph(query)
|
|
172
|
+
control_objectives: list["ControlObjective"] = []
|
|
173
|
+
if "controlImplementations" in response:
|
|
174
|
+
# Extract controlObjectives from each control in the controlImplementations
|
|
175
|
+
for item in response["controlImplementations"]["items"]:
|
|
176
|
+
for objective in item["control"]["controlObjectives"]:
|
|
177
|
+
if (
|
|
178
|
+
other_id_contains in objective["otherId"]
|
|
179
|
+
): # API_PROBLEM: Hack to fix broken API returning too many results
|
|
180
|
+
if control_objective := cls(**objective):
|
|
181
|
+
control_objectives.append(control_objective)
|
|
182
|
+
return control_objectives
|
|
183
|
+
|
|
184
|
+
@classmethod
|
|
185
|
+
def fetch_control_objectives_by_name(
|
|
186
|
+
cls, parent_id: int, name_contains: str, skip: int = 0, take: int = 50
|
|
187
|
+
) -> list["ControlObjective"]:
|
|
188
|
+
"""
|
|
189
|
+
Fetch control objectives by other ID.
|
|
190
|
+
|
|
191
|
+
:param int parent_id: The ID of the parent
|
|
192
|
+
:param str name_contains: The name to search for
|
|
193
|
+
:param int skip: Number of items to skip
|
|
194
|
+
:param int take: Number of items to take
|
|
195
|
+
:return: A list of control objectives
|
|
196
|
+
:rtype: list["ControlObjective"]
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
query = f"""
|
|
200
|
+
query GetControlImplementations() {{
|
|
201
|
+
controlImplementations(
|
|
202
|
+
skip: {skip}, take: {take}, where: {{
|
|
203
|
+
parentId: {{eq: {parent_id}}},
|
|
204
|
+
control: {{
|
|
205
|
+
controlObjectives: {{
|
|
206
|
+
some: {{
|
|
207
|
+
name: {{
|
|
208
|
+
contains: "{name_contains}"
|
|
209
|
+
}}
|
|
210
|
+
}}
|
|
211
|
+
}}
|
|
212
|
+
}}
|
|
213
|
+
}}
|
|
214
|
+
) {{
|
|
215
|
+
items {{
|
|
216
|
+
id
|
|
217
|
+
control {{
|
|
218
|
+
id,
|
|
219
|
+
controlObjectives {{
|
|
220
|
+
id
|
|
221
|
+
uuid
|
|
222
|
+
name
|
|
223
|
+
description
|
|
224
|
+
otherId
|
|
225
|
+
archived
|
|
226
|
+
securityControlId
|
|
227
|
+
dateCreated
|
|
228
|
+
dateLastUpdated
|
|
229
|
+
objectiveType
|
|
230
|
+
}}
|
|
231
|
+
}}
|
|
232
|
+
}}
|
|
233
|
+
pageInfo {{
|
|
234
|
+
hasNextPage
|
|
235
|
+
}}
|
|
236
|
+
totalCount
|
|
237
|
+
}}
|
|
238
|
+
}}
|
|
239
|
+
"""
|
|
240
|
+
|
|
241
|
+
response = cls._get_api_handler().graph(query)
|
|
242
|
+
control_objectives: list["ControlObjective"] = []
|
|
243
|
+
if "controlImplementations" in response:
|
|
244
|
+
# Extract controlObjectives from each control in the controlImplementations
|
|
245
|
+
for item in response["controlImplementations"]["items"]:
|
|
246
|
+
for objective in item["control"]["controlObjectives"]:
|
|
247
|
+
if name_contains in objective["name"]: # TODO: Hack to fix broken API returning too many results
|
|
248
|
+
control_objectives.append(cls(**objective))
|
|
249
|
+
return control_objectives
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def map_ccis_to_control_ids(parent_id: int) -> dict:
|
|
253
|
+
ccis_to_control_ids: dict[str, set[int]] = defaultdict(set)
|
|
254
|
+
objectives = ControlObjective.fetch_control_objectives_by_other_id(parent_id=parent_id, other_id_contains="CCI-")
|
|
255
|
+
|
|
256
|
+
for objective in objectives:
|
|
257
|
+
cci_ids = objective.otherId.split(",")
|
|
258
|
+
for cci_id in cci_ids:
|
|
259
|
+
ccis_to_control_ids[cci_id.strip()].add(objective.securityControlId)
|
|
260
|
+
|
|
261
|
+
return ccis_to_control_ids
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Model for Control Parameter in the application"""
|
|
4
|
+
import warnings
|
|
5
|
+
from typing import Optional, List
|
|
6
|
+
from urllib.parse import urljoin
|
|
7
|
+
|
|
8
|
+
from pydantic import Field, ConfigDict
|
|
9
|
+
|
|
10
|
+
from regscale.core.app.api import Api
|
|
11
|
+
from regscale.core.app.application import Application
|
|
12
|
+
from regscale.core.app.utils.api_handler import APIInsertionError
|
|
13
|
+
from regscale.core.app.utils.app_utils import get_current_datetime
|
|
14
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ControlParameter(RegScaleModel):
|
|
18
|
+
"""
|
|
19
|
+
ControlParameter class
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
_module_slug = "controlParameters"
|
|
23
|
+
_module_string = "controlparameter"
|
|
24
|
+
_unique_fields = [
|
|
25
|
+
["parameterId", "securityControlId"],
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
id: Optional[int] = 0
|
|
29
|
+
uuid: Optional[str] = None
|
|
30
|
+
text: str = ""
|
|
31
|
+
parameterId: Optional[str] = None
|
|
32
|
+
otherId: Optional[str] = None
|
|
33
|
+
securityControlId: Optional[int] = None
|
|
34
|
+
archived: bool = False
|
|
35
|
+
createdById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
|
|
36
|
+
dateCreated: Optional[str] = Field(default_factory=get_current_datetime)
|
|
37
|
+
lastUpdatedById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
|
|
38
|
+
dateLastUpdated: Optional[str] = Field(default_factory=get_current_datetime)
|
|
39
|
+
tenantsId: Optional[int] = 1
|
|
40
|
+
dataType: Optional[str] = None
|
|
41
|
+
isPublic: bool = True
|
|
42
|
+
default: Optional[str] = None
|
|
43
|
+
displayName: str = ""
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
47
|
+
"""
|
|
48
|
+
Get additional endpoints for the ControlParameter
|
|
49
|
+
|
|
50
|
+
:return: Additional endpoints for the ControlParameter
|
|
51
|
+
:rtype: ConfigDict
|
|
52
|
+
"""
|
|
53
|
+
return ConfigDict( # type: ignore
|
|
54
|
+
get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}",
|
|
55
|
+
get_by_control="/api/{model_slug}/getByControl/{id}",
|
|
56
|
+
create="/api/{model_slug}",
|
|
57
|
+
batch_create="/api/{model_slug}/batchCreate",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def get_by_control(cls, control_id: int) -> Optional[List["ControlParameter"]]:
|
|
62
|
+
"""
|
|
63
|
+
Get a list of control parameters by control ID
|
|
64
|
+
:param int control_id:
|
|
65
|
+
:return: Optional[List["ControlParameter"]]
|
|
66
|
+
:rtype: Optional[List["ControlParameter"]]
|
|
67
|
+
"""
|
|
68
|
+
endpoint = cls.get_endpoint("get_by_control").format(id=control_id)
|
|
69
|
+
response = cls._get_api_handler().get(endpoint=endpoint)
|
|
70
|
+
if response and response.ok:
|
|
71
|
+
return [cls(**item) for item in response.json()]
|
|
72
|
+
return None
|
|
73
|
+
|
|
74
|
+
def insert_parameter(self, app: Application) -> dict:
|
|
75
|
+
"""
|
|
76
|
+
DEPRECATED: Insert a new control parameter
|
|
77
|
+
|
|
78
|
+
:param Application app: Application object
|
|
79
|
+
:raises APIInsertionError: If the API request fails
|
|
80
|
+
:return: JSON response as a dictionary
|
|
81
|
+
:rtype: dict
|
|
82
|
+
"""
|
|
83
|
+
warnings.warn(
|
|
84
|
+
"The 'insert_parameter' method is deprecated, use 'create' method instead",
|
|
85
|
+
DeprecationWarning,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Convert the model to a dictionary
|
|
89
|
+
api = Api()
|
|
90
|
+
data = self.dict()
|
|
91
|
+
api_url = urljoin(app.config["domain"], "/api/controlparameters")
|
|
92
|
+
# Make the API call
|
|
93
|
+
response = api.post(api_url, json=data)
|
|
94
|
+
|
|
95
|
+
# Check the response
|
|
96
|
+
if not response.ok:
|
|
97
|
+
print(response.text)
|
|
98
|
+
raise APIInsertionError(f"API request failed with status {response.status_code}")
|
|
99
|
+
|
|
100
|
+
return response.json()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Model for Control Test in the application"""
|
|
4
|
+
import uuid
|
|
5
|
+
|
|
6
|
+
from pydantic import ConfigDict, Field
|
|
7
|
+
|
|
8
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ControlTest(RegScaleModel):
|
|
12
|
+
"""Properties plan model"""
|
|
13
|
+
|
|
14
|
+
_module_slug = "controltests"
|
|
15
|
+
_unique_fields = [
|
|
16
|
+
["uuid"],
|
|
17
|
+
]
|
|
18
|
+
_parent_id_field = "parentControlId"
|
|
19
|
+
|
|
20
|
+
uuid: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
21
|
+
isPublic: bool = True
|
|
22
|
+
testCriteria: str
|
|
23
|
+
parentControlId: int
|
|
24
|
+
parentRequirementId: int = 0
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
28
|
+
"""
|
|
29
|
+
Function to get additional endpoints for the ControlTest model
|
|
30
|
+
|
|
31
|
+
:return: Additional endpoints for the ControlTest model
|
|
32
|
+
:rtype: ConfigDict
|
|
33
|
+
"""
|
|
34
|
+
return ConfigDict(get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}") # type: ignore
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Model for Control Test Plan in the application"""
|
|
4
|
+
import warnings
|
|
5
|
+
from typing import Optional
|
|
6
|
+
from urllib.parse import urljoin
|
|
7
|
+
|
|
8
|
+
from pydantic import ConfigDict
|
|
9
|
+
|
|
10
|
+
from regscale.core.app.api import Api
|
|
11
|
+
from regscale.core.app.application import Application
|
|
12
|
+
from regscale.core.app.utils.api_handler import APIInsertionError
|
|
13
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ControlTestPlan(RegScaleModel):
|
|
17
|
+
"""
|
|
18
|
+
ControlTestPlan class
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
_module_slug = "controlTestPlans"
|
|
22
|
+
_module_string = "controltestplan"
|
|
23
|
+
|
|
24
|
+
id: int = 0
|
|
25
|
+
uuid: Optional[str] = None
|
|
26
|
+
test: Optional[str] = None
|
|
27
|
+
testId: Optional[str] = None
|
|
28
|
+
securityControlId: Optional[int] = None
|
|
29
|
+
archived: bool = False
|
|
30
|
+
createdById: Optional[str] = None
|
|
31
|
+
dateCreated: Optional[str] = None
|
|
32
|
+
lastUpdatedById: Optional[str] = None
|
|
33
|
+
dateLastUpdated: Optional[str] = None
|
|
34
|
+
tenantsId: Optional[int] = None
|
|
35
|
+
isPublic: bool = True
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
39
|
+
"""
|
|
40
|
+
Get additional endpoints for the ControlTestPlan
|
|
41
|
+
|
|
42
|
+
:return: Additional endpoints for the ControlTestPlan
|
|
43
|
+
:rtype: ConfigDict
|
|
44
|
+
"""
|
|
45
|
+
return ConfigDict( # type: ignore
|
|
46
|
+
get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def insert_controltestplan(self, app: Application) -> dict:
|
|
50
|
+
"""
|
|
51
|
+
Insert a ControlTestPlan into the database
|
|
52
|
+
|
|
53
|
+
:param Application app: Application object
|
|
54
|
+
:raises APIInsertionError: API request failed
|
|
55
|
+
:return: JSON response
|
|
56
|
+
:rtype: dict
|
|
57
|
+
"""
|
|
58
|
+
warnings.warn(
|
|
59
|
+
"The 'insert_controltestplan' method is deprecated, use 'create' method instead",
|
|
60
|
+
DeprecationWarning,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Convert the model to a dictionary
|
|
64
|
+
api = Api()
|
|
65
|
+
data = self.dict()
|
|
66
|
+
api_url = urljoin(app.config["domain"], "/api/controltestplans")
|
|
67
|
+
# Make the API call
|
|
68
|
+
response = api.post(api_url, json=data)
|
|
69
|
+
|
|
70
|
+
# Check the response
|
|
71
|
+
if not response.ok:
|
|
72
|
+
print(response.text)
|
|
73
|
+
raise APIInsertionError(f"API request failed with status {response.status_code}")
|
|
74
|
+
|
|
75
|
+
return response.json()
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Model for Control Test Results in the application"""
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from pydantic import ConfigDict
|
|
8
|
+
|
|
9
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ControlTestResultStatus(str, Enum):
|
|
13
|
+
"""Control Test Statuses"""
|
|
14
|
+
|
|
15
|
+
FAIL = "Fail"
|
|
16
|
+
PASS = "Pass"
|
|
17
|
+
NOT_APPLICABLE = "Not Applicable"
|
|
18
|
+
NOT_REVIEWED = "Not Reviewed"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ControlTestResult(RegScaleModel):
|
|
22
|
+
"""Control Test Results model"""
|
|
23
|
+
|
|
24
|
+
_module_slug = "controltestresults"
|
|
25
|
+
|
|
26
|
+
id: Optional[int] = None
|
|
27
|
+
is_public: bool = True
|
|
28
|
+
result: ControlTestResultStatus
|
|
29
|
+
uuid: Optional[str] = None
|
|
30
|
+
observations: Optional[str] = None
|
|
31
|
+
gaps: Optional[str] = None
|
|
32
|
+
evidence: Optional[str] = None
|
|
33
|
+
bIssue: Optional[bool] = None
|
|
34
|
+
originalRisk: Optional[str] = None
|
|
35
|
+
identifiedRisk: Optional[str] = None
|
|
36
|
+
likelihood: Optional[str] = None
|
|
37
|
+
impact: Optional[str] = None
|
|
38
|
+
recommendationForMitigation: Optional[str] = None
|
|
39
|
+
dateAssessed: Optional[str] = None
|
|
40
|
+
assessedById: Optional[str] = None
|
|
41
|
+
parentTestId: Optional[int] = None
|
|
42
|
+
parentAssessmentId: Optional[int] = None
|
|
43
|
+
|
|
44
|
+
@staticmethod
|
|
45
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
46
|
+
"""
|
|
47
|
+
Get additional endpoints for the ControlTestResults model
|
|
48
|
+
|
|
49
|
+
:return: Additional endpoints for the ControlTestResults model
|
|
50
|
+
:rtype: ConfigDict
|
|
51
|
+
"""
|
|
52
|
+
return ConfigDict(get_by_parent="/api/{model_slug}/getByAssessment/{intParentID}") # type: ignore
|