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,275 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""RegScale Implementation Option Model"""
|
|
4
|
+
import warnings
|
|
5
|
+
from typing import Optional, List
|
|
6
|
+
from urllib.parse import urljoin
|
|
7
|
+
|
|
8
|
+
import requests
|
|
9
|
+
from pydantic import Field, ConfigDict, model_validator, BaseModel
|
|
10
|
+
|
|
11
|
+
from regscale.core.app.api import Api
|
|
12
|
+
from regscale.core.app.application import Application
|
|
13
|
+
from regscale.core.app.logz import create_logger
|
|
14
|
+
from regscale.core.app.utils.app_utils import get_current_datetime
|
|
15
|
+
from regscale.models.regscale_models.implementation_objective import ImplementationStatus
|
|
16
|
+
from regscale.models.regscale_models.objective import Objective
|
|
17
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
18
|
+
from regscale.models.regscale_models.search import Search
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ImplementationOption(RegScaleModel):
|
|
22
|
+
"""RegScale Implementation Option Model"""
|
|
23
|
+
|
|
24
|
+
_module_slug = "implementationOptions"
|
|
25
|
+
_unique_fields = [
|
|
26
|
+
["securityControlId", "name"],
|
|
27
|
+
]
|
|
28
|
+
_parent_id_field = "securityControlId"
|
|
29
|
+
|
|
30
|
+
id: int = Field(default=0)
|
|
31
|
+
uuid: str = Field(default="")
|
|
32
|
+
name: str = Field(..., description="Name of the implementation option")
|
|
33
|
+
description: str = Field(..., description="Description of the implementation option")
|
|
34
|
+
acceptability: str = Field(
|
|
35
|
+
ImplementationStatus.NOT_IMPLEMENTED, description="Acceptability status of the implementation option"
|
|
36
|
+
)
|
|
37
|
+
otherId: Optional[str] = Field(default=None, description="An optional other identifier")
|
|
38
|
+
securityControlId: Optional[int] = Field(default=None, description="Foreign Key SecurityControls.id")
|
|
39
|
+
objectiveId: Optional[int] = Field(default=None, description="Foreign Key ControlObjective.id")
|
|
40
|
+
archived: bool = Field(default=False, description="Archival status of the implementation option")
|
|
41
|
+
createdById: Optional[str] = Field(default=None, description="Foreign Key AspNetUsers.id")
|
|
42
|
+
dateCreated: str = Field(
|
|
43
|
+
default_factory=get_current_datetime, description="Creation date of the implementation option"
|
|
44
|
+
)
|
|
45
|
+
lastUpdatedById: Optional[str] = Field(default=None, description="Foreign Key AspNetUsers.id")
|
|
46
|
+
dateLastUpdated: str = Field(
|
|
47
|
+
default_factory=get_current_datetime, description="Last update date of the implementation option"
|
|
48
|
+
)
|
|
49
|
+
tenantsId: Optional[int] = Field(default=None, description="Foreign Key Tenants.id")
|
|
50
|
+
isPublic: bool = Field(default=False, description="Public visibility of the implementation option")
|
|
51
|
+
restricted: bool = Field(default=False, description="Restriction status of the implementation option")
|
|
52
|
+
restrictedSecurityPlanId: Optional[int] = Field(
|
|
53
|
+
default=None, description="Associated restricted security plan ID if any"
|
|
54
|
+
)
|
|
55
|
+
responsibility: Optional[str] = Field(default=None, description="Who is responsible for the implementation option")
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
59
|
+
"""
|
|
60
|
+
Get additional endpoints for the ImplementationOption model.
|
|
61
|
+
|
|
62
|
+
:return: A dictionary of additional endpoints
|
|
63
|
+
:rtype: ConfigDict
|
|
64
|
+
"""
|
|
65
|
+
return ConfigDict( # type: ignore
|
|
66
|
+
get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}/{securityPlanId}",
|
|
67
|
+
get_by_control="/api/{model_slug}/getByControl/{intControl}/{securityPlanId}",
|
|
68
|
+
batch_create="/api/{model_slug}/batchCreate",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def get_all_by_parent(
|
|
73
|
+
cls,
|
|
74
|
+
parent_id: int,
|
|
75
|
+
parent_module: Optional[str] = None,
|
|
76
|
+
search: Optional[Search] = None,
|
|
77
|
+
plan_id: Optional[int] = None,
|
|
78
|
+
) -> List["ImplementationOption"]:
|
|
79
|
+
"""
|
|
80
|
+
Get a list of objects by parent.
|
|
81
|
+
|
|
82
|
+
:param int parent_id: The ID of the parent
|
|
83
|
+
:param Optional[str] parent_module: The parent module
|
|
84
|
+
:param Optional[Search] search: The search object
|
|
85
|
+
:param Optional[int] plan_id: The ID of the security plan
|
|
86
|
+
:return: A list of objects
|
|
87
|
+
:rtype: List["ImplementationOption"]
|
|
88
|
+
"""
|
|
89
|
+
return cls._handle_list_response(
|
|
90
|
+
cls._get_api_handler().get(
|
|
91
|
+
endpoint=cls.get_endpoint("get_all_by_parent").format(
|
|
92
|
+
intParentID=parent_id,
|
|
93
|
+
securityPlanId=plan_id,
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
@classmethod
|
|
99
|
+
def get_by_control(cls, security_control_id: int, security_plan_id: int) -> list["ImplementationOption"]:
|
|
100
|
+
"""
|
|
101
|
+
Get a list of implementation options by control id and security plan id
|
|
102
|
+
|
|
103
|
+
:param int security_control_id: Security Control ID
|
|
104
|
+
:param int security_plan_id: Security Plan ID
|
|
105
|
+
:return: A list of Implementation Options as a dictionary from RegScale via API
|
|
106
|
+
:rtype: list[ImplementationOption]
|
|
107
|
+
"""
|
|
108
|
+
return cls._handle_list_response(
|
|
109
|
+
cls._get_api_handler().get(
|
|
110
|
+
endpoint=cls.get_endpoint("get_by_control").format(
|
|
111
|
+
intControl=security_control_id, securityPlanId=security_plan_id
|
|
112
|
+
),
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class ImplementationOptionDeprecated(BaseModel, Objective):
|
|
118
|
+
"""RegScale Implementation Option"""
|
|
119
|
+
|
|
120
|
+
_module_slug = "implementationoptions"
|
|
121
|
+
|
|
122
|
+
id: int = 0
|
|
123
|
+
uuid: str = ""
|
|
124
|
+
name: str # Required
|
|
125
|
+
description: str # Required
|
|
126
|
+
status: Optional[str] = None
|
|
127
|
+
acceptability: Optional[str] = (
|
|
128
|
+
None # Required for create but not returned on get by control ??? api is inconsistent
|
|
129
|
+
)
|
|
130
|
+
otherId: Optional[str] = None
|
|
131
|
+
securityControlId: Optional[int] = None
|
|
132
|
+
objectiveId: Optional[int] = None
|
|
133
|
+
restricted: bool = False
|
|
134
|
+
restrictedSecurityPlanId: Optional[int] = None
|
|
135
|
+
createdById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
|
|
136
|
+
lastUpdatedById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
|
|
137
|
+
dateCreated: str = Field(default_factory=get_current_datetime)
|
|
138
|
+
dateLastUpdated: str = Field(default_factory=get_current_datetime)
|
|
139
|
+
archived: bool = False
|
|
140
|
+
isPublic: bool = True
|
|
141
|
+
|
|
142
|
+
def __getitem__(
|
|
143
|
+
self, other: "ImplementationOptionDeprecated"
|
|
144
|
+
) -> str: # this allows getting an element (overrided method)
|
|
145
|
+
return self.name and self.description and self.objectiveId and self.securityControlId
|
|
146
|
+
|
|
147
|
+
@model_validator(mode="after")
|
|
148
|
+
def correct_control_id(self):
|
|
149
|
+
"""
|
|
150
|
+
Correct the acceptability value for the implementation option as it is not returned
|
|
151
|
+
by the API on get by control but is return in field status which is not a valid field for the model
|
|
152
|
+
"""
|
|
153
|
+
if self.acceptability is None and self.status is not None:
|
|
154
|
+
self.acceptability = self.status
|
|
155
|
+
|
|
156
|
+
@staticmethod
|
|
157
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
158
|
+
"""
|
|
159
|
+
Get additional endpoints for the ImplementationOptions model, using {model_slug} as a placeholder for the model slug.
|
|
160
|
+
|
|
161
|
+
:return: A dictionary of additional endpoints
|
|
162
|
+
:rtype: ConfigDict
|
|
163
|
+
"""
|
|
164
|
+
return ConfigDict( # type: ignore
|
|
165
|
+
get_by_control="/api/{model_slug}/getByControl/{intControl}/{securityPlanId}",
|
|
166
|
+
batch_create="/api/{model_slug}/batchCreate",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def __eq__(self, other: "ImplementationOptionDeprecated") -> bool:
|
|
170
|
+
"""
|
|
171
|
+
Check if two ImplementationOption objects are equal
|
|
172
|
+
|
|
173
|
+
:param ImplementationOptionDeprecated other: ImplementationOption object to compare
|
|
174
|
+
:return: True if equal, False if not
|
|
175
|
+
:rtype: bool
|
|
176
|
+
"""
|
|
177
|
+
return (
|
|
178
|
+
self.name == other.name
|
|
179
|
+
and self.description == other.description
|
|
180
|
+
and self.objectiveId == other.objectiveId
|
|
181
|
+
and self.securityControlId == other.securityControlId
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
def __hash__(self) -> hash:
|
|
185
|
+
"""
|
|
186
|
+
Hash a ImplementationOption object
|
|
187
|
+
|
|
188
|
+
:return: Hashed ImplementationOption object
|
|
189
|
+
:rtype: hash
|
|
190
|
+
"""
|
|
191
|
+
return hash((self.name, self.description, self.objectiveId, self.securityControlId))
|
|
192
|
+
|
|
193
|
+
@classmethod
|
|
194
|
+
def get_by_control(cls, security_control_id: int, security_plan_id: int) -> list["ImplementationOption"]:
|
|
195
|
+
"""
|
|
196
|
+
Get a list of implementation options by control id and security plan id
|
|
197
|
+
|
|
198
|
+
:param int security_control_id: Security Control ID
|
|
199
|
+
:param int security_plan_id: Security Plan ID
|
|
200
|
+
:return: A list of Implementation Options as a dictionary from RegScale via API
|
|
201
|
+
:rtype: list[ImplementationOption]
|
|
202
|
+
"""
|
|
203
|
+
return cls._handle_list_response(
|
|
204
|
+
cls._get_api_handler().get(
|
|
205
|
+
endpoint=cls.get_endpoint("get_by_control").format(
|
|
206
|
+
intControl=security_control_id, securityPlanId=security_plan_id
|
|
207
|
+
),
|
|
208
|
+
)
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
@staticmethod
|
|
212
|
+
def fetch_implementation_options(app: Application, control_id: int) -> list["ImplementationOptionDeprecated"]:
|
|
213
|
+
"""
|
|
214
|
+
Fetch list of implementation objectives by control id
|
|
215
|
+
|
|
216
|
+
:param Application app: Application Instance
|
|
217
|
+
:param int control_id: Security Control ID
|
|
218
|
+
:return: A list of Implementation Objectives as a dictionary from RegScale via API
|
|
219
|
+
:rtype: list[ImplementationOptionDeprecated]
|
|
220
|
+
"""
|
|
221
|
+
warnings.warn(
|
|
222
|
+
"The 'fetch_implemetation_options method is deprecated, use 'get_by_control' method instead",
|
|
223
|
+
DeprecationWarning,
|
|
224
|
+
)
|
|
225
|
+
results = []
|
|
226
|
+
logger = create_logger()
|
|
227
|
+
api = Api()
|
|
228
|
+
res = api.get(url=app.config["domain"] + f"/api/implementationoptions/getByControl/{control_id}")
|
|
229
|
+
if res.ok:
|
|
230
|
+
try:
|
|
231
|
+
results = [ImplementationOptionDeprecated(**opt) for opt in res.json()]
|
|
232
|
+
except requests.RequestException.JSONDecodeError:
|
|
233
|
+
logger.warning("Unable to find control implementation objectives.")
|
|
234
|
+
return results
|
|
235
|
+
|
|
236
|
+
def insert(self, api: Api) -> requests.Response:
|
|
237
|
+
"""
|
|
238
|
+
Insert implementation option into RegScale
|
|
239
|
+
|
|
240
|
+
:param Api api: The API instance
|
|
241
|
+
:return: API Response
|
|
242
|
+
:rtype: requests.Response
|
|
243
|
+
"""
|
|
244
|
+
warnings.warn(
|
|
245
|
+
"The 'insert_parameter' method is deprecated, use 'create' method instead",
|
|
246
|
+
DeprecationWarning,
|
|
247
|
+
)
|
|
248
|
+
response = api.post(
|
|
249
|
+
url=urljoin(api.config["domain"], "/api/implementationOptions"),
|
|
250
|
+
json=self.dict(),
|
|
251
|
+
)
|
|
252
|
+
api.logger.debug(
|
|
253
|
+
"ImplementationOption insertion Response: %s=%s",
|
|
254
|
+
response.status_code,
|
|
255
|
+
response.text,
|
|
256
|
+
)
|
|
257
|
+
if response.status_code == 400 and "Duplicate" in response.text:
|
|
258
|
+
# rev 5 contains multiple parts for each control with implemention options
|
|
259
|
+
# there will be duplicates (which is ok)
|
|
260
|
+
# do not log a message.
|
|
261
|
+
return response
|
|
262
|
+
if response.status_code == 422 and "Duplicate" in response.text:
|
|
263
|
+
# rev 5 contains multiple parts for each control with implemention options
|
|
264
|
+
# there will be duplicates (which is ok)
|
|
265
|
+
# do not log a message.
|
|
266
|
+
return response
|
|
267
|
+
|
|
268
|
+
if not response.ok or response.status_code != 200:
|
|
269
|
+
api.logger.error(
|
|
270
|
+
"Unable to insert Implementation Option into RegScale.\n%s:%s %s",
|
|
271
|
+
response.status_code,
|
|
272
|
+
response.reason,
|
|
273
|
+
response.text,
|
|
274
|
+
)
|
|
275
|
+
return response
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger("regscale")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImplementationRole(RegScaleModel):
|
|
10
|
+
"""Class for a RegScale SystemRoles"""
|
|
11
|
+
|
|
12
|
+
_module_slug = "implementingRoles"
|
|
13
|
+
|
|
14
|
+
id: Optional[int] = None
|
|
15
|
+
uuid: Optional[str] = None
|
|
16
|
+
parentId: int # Required Field
|
|
17
|
+
parentModule: str # Required Field
|
|
18
|
+
roleId: int # Required Field
|
|
19
|
+
isPublic: bool = True
|
|
20
|
+
|
|
21
|
+
@staticmethod
|
|
22
|
+
def add_role(role_id: int, control_implementation_id: int, parent_module: str) -> "ImplementationRole":
|
|
23
|
+
"""
|
|
24
|
+
Add a role to a control implementation
|
|
25
|
+
|
|
26
|
+
:param int role_id: The ID of the role to add
|
|
27
|
+
:param int control_implementation_id: The ID of the control implementation to add the role to
|
|
28
|
+
:param str parent_module: The parent module of the role
|
|
29
|
+
:return: The new role
|
|
30
|
+
:rtype: ImplementationRole
|
|
31
|
+
"""
|
|
32
|
+
role = ImplementationRole(roleId=role_id, parentId=control_implementation_id, parentModule=parent_module)
|
|
33
|
+
return role.create()
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""RegScale Incident Model"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional, Any
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
from pydantic import ConfigDict, field_validator
|
|
9
|
+
|
|
10
|
+
from regscale.core.app.api import Api
|
|
11
|
+
from regscale.core.app.application import Application
|
|
12
|
+
from regscale.core.app.utils.app_utils import camel_case, snake_case
|
|
13
|
+
from .regscale_model import RegScaleModel
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Incident(RegScaleModel):
|
|
17
|
+
"""RegScale Incident
|
|
18
|
+
|
|
19
|
+
:raises ValueError: Validation Error
|
|
20
|
+
:return: RegScale Incident
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
_module_slug = "incidents"
|
|
24
|
+
|
|
25
|
+
category: str # Required
|
|
26
|
+
detectionMethod: str # Required
|
|
27
|
+
dateDetected: str # Required
|
|
28
|
+
phase: str # Required
|
|
29
|
+
title: str # Required
|
|
30
|
+
incidentPOCId: str # Required
|
|
31
|
+
id: int = 0
|
|
32
|
+
attackVector: Optional[str] = None
|
|
33
|
+
compromiseDate: Optional[str] = None
|
|
34
|
+
cost: float = 0
|
|
35
|
+
dateResolved: Optional[str] = None
|
|
36
|
+
description: Optional[str] = None
|
|
37
|
+
ioc: Optional[str] = None
|
|
38
|
+
impact: Optional[str] = None
|
|
39
|
+
parentId: Optional[int] = None
|
|
40
|
+
responseActions: Optional[str] = None
|
|
41
|
+
sourceCause: Optional[str] = None
|
|
42
|
+
createdById: Optional[str] = None
|
|
43
|
+
dateCreated: Optional[str] = None
|
|
44
|
+
dateLastUpdated: Optional[str] = None
|
|
45
|
+
lastUpdatedById: Optional[str] = None
|
|
46
|
+
parentModule: Optional[str] = None
|
|
47
|
+
tenantsId: Optional[int] = None
|
|
48
|
+
facilityId: Optional[int] = None
|
|
49
|
+
# post_incident: Optional[str]
|
|
50
|
+
uuid: Optional[str] = None
|
|
51
|
+
isPublic: bool = True
|
|
52
|
+
orgId: Optional[int] = None
|
|
53
|
+
containmentSteps: Optional[str] = None
|
|
54
|
+
eradicationSteps: Optional[str] = None
|
|
55
|
+
recoverySteps: Optional[str] = None
|
|
56
|
+
severity: Optional[str] = None
|
|
57
|
+
|
|
58
|
+
@staticmethod
|
|
59
|
+
def _get_additional_endpoints() -> ConfigDict:
|
|
60
|
+
"""
|
|
61
|
+
Get additional endpoints for the Incidents model.
|
|
62
|
+
|
|
63
|
+
:return: A dictionary of additional endpoints
|
|
64
|
+
:rtype: ConfigDict
|
|
65
|
+
"""
|
|
66
|
+
return ConfigDict(
|
|
67
|
+
get_count="/api/{model_slug}/getCount",
|
|
68
|
+
get_all_by_parent="/api/{model_slug}/getAllByParent/{intParentID}/{strModule}",
|
|
69
|
+
get_filtered_list="/api/{model_slug}/getFilteredList/{strFind}",
|
|
70
|
+
graph="/api/{model_slug}/graph",
|
|
71
|
+
graph_by_date="/api/{model_slug}/graphByDate/{strGroupBy}/{year}",
|
|
72
|
+
main_dashboard="/api/{model_slug}/mainDashboard/{intYear}",
|
|
73
|
+
main_dashboard_chart="/api/{model_slug}/mainDashboardChart/{year}",
|
|
74
|
+
filter_incidents="/api/{model_slug}/filterIncidents",
|
|
75
|
+
query_by_custom_field="/api/{model_slug}/queryByCustomField/{strFieldName}/{strValue}",
|
|
76
|
+
report="/api/{model_slug}/report/{strReport}",
|
|
77
|
+
schedule="/api/{model_slug}/schedule/{year}/{dvar}",
|
|
78
|
+
graph_due_date="/api/{model_slug}/graphDueDate/{year}",
|
|
79
|
+
dashboard="/api/{model_slug}/dashboard/{strGroupBy}",
|
|
80
|
+
dashboard_by_parent="/api/{model_slug}/dashboardByParent/{strGroupBy}/{intId}/{strModule}",
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
@field_validator("category")
|
|
85
|
+
def check_category(cls, value: Any) -> str:
|
|
86
|
+
"""
|
|
87
|
+
Validate Category
|
|
88
|
+
|
|
89
|
+
:param Any value: An incident category
|
|
90
|
+
:raises ValueError: Validation Error if category is not in list
|
|
91
|
+
:return: An incident category
|
|
92
|
+
:rtype: str
|
|
93
|
+
"""
|
|
94
|
+
categories = [
|
|
95
|
+
"CAT 0 - Exercise/Network Defense Testing",
|
|
96
|
+
"CAT 1 - Unauthorized Access",
|
|
97
|
+
"CAT 2 - Denial of Service (DoS)",
|
|
98
|
+
"CAT 3 - Malicious Code",
|
|
99
|
+
"CAT 4 - Improper Usage",
|
|
100
|
+
"CAT 5 - Scans/Probes/Attempted Access",
|
|
101
|
+
"CAT 6 - Investigation",
|
|
102
|
+
]
|
|
103
|
+
if value not in categories:
|
|
104
|
+
cats = "\n".join(categories)
|
|
105
|
+
raise ValueError(f"Category must be one of the following:\n{cats}")
|
|
106
|
+
return value
|
|
107
|
+
|
|
108
|
+
@classmethod
|
|
109
|
+
@field_validator("phase")
|
|
110
|
+
def check_phases(cls, value: str) -> str:
|
|
111
|
+
"""Validate Phases
|
|
112
|
+
|
|
113
|
+
:raises ValueError: Validation Error for Incident Phase
|
|
114
|
+
:param str value: An incident phase
|
|
115
|
+
:return: An incident phase
|
|
116
|
+
:rtype: str
|
|
117
|
+
"""
|
|
118
|
+
phases = [
|
|
119
|
+
"Analysis",
|
|
120
|
+
"Closed",
|
|
121
|
+
"Containment",
|
|
122
|
+
"Detection",
|
|
123
|
+
"Eradication",
|
|
124
|
+
"Recovery",
|
|
125
|
+
]
|
|
126
|
+
if value not in phases:
|
|
127
|
+
phas = "\n".join(phases)
|
|
128
|
+
raise ValueError(f"Phase must be one of the following:\n{phas}")
|
|
129
|
+
return value
|
|
130
|
+
|
|
131
|
+
@staticmethod
|
|
132
|
+
def post_incident(incident: "Incident") -> requests.Response:
|
|
133
|
+
"""
|
|
134
|
+
Post Incident to RegScale via API
|
|
135
|
+
|
|
136
|
+
:param Incident incident: An instance of Incident
|
|
137
|
+
:return: Response object from API post to RegScale
|
|
138
|
+
:rtype: requests.Response
|
|
139
|
+
"""
|
|
140
|
+
app = Application()
|
|
141
|
+
config = app.config
|
|
142
|
+
api = Api()
|
|
143
|
+
url = config["domain"] + "/api/incidents"
|
|
144
|
+
incident.id = 0 # ID must be 0 for POST
|
|
145
|
+
incident_d = incident.dict()
|
|
146
|
+
response = api.post(url=url, json=incident_d)
|
|
147
|
+
return response
|
|
148
|
+
|
|
149
|
+
@staticmethod
|
|
150
|
+
def get_incident(incident_id: int) -> "Incident":
|
|
151
|
+
"""
|
|
152
|
+
Get Incident from RegScale with provided ID
|
|
153
|
+
|
|
154
|
+
:param int incident_id: An Incident ID
|
|
155
|
+
:return: RegScale incident object
|
|
156
|
+
:rtype: Incident
|
|
157
|
+
"""
|
|
158
|
+
app = Application()
|
|
159
|
+
config = app.config
|
|
160
|
+
api = Api()
|
|
161
|
+
url = config["domain"] + "/api/incidents/" + str(incident_id)
|
|
162
|
+
response = api.get(url=url)
|
|
163
|
+
dat = response.json()
|
|
164
|
+
convert = {
|
|
165
|
+
snake_case(camel_case(key)).lower().replace("pocid", "poc_id"): value for (key, value) in dat.items()
|
|
166
|
+
}
|
|
167
|
+
return Incident(**convert)
|
|
168
|
+
|
|
169
|
+
def to_dict(self) -> dict:
|
|
170
|
+
"""
|
|
171
|
+
Convert Incident object RegScale friendly dict, used in flask_api application
|
|
172
|
+
|
|
173
|
+
:return: RegScale friendly dict for posting to API
|
|
174
|
+
:rtype: dict
|
|
175
|
+
"""
|
|
176
|
+
dat = self.dict()
|
|
177
|
+
return {camel_case(key): value for (key, value) in dat.items()}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Model for Interconnect in the application"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class InterConnection(RegScaleModel):
|
|
11
|
+
"""RegScale Interconnects model"""
|
|
12
|
+
|
|
13
|
+
_module_slug = "interconnections"
|
|
14
|
+
|
|
15
|
+
id: int = 0
|
|
16
|
+
authorizationType: str
|
|
17
|
+
categorization: str
|
|
18
|
+
connectionType: str
|
|
19
|
+
name: str
|
|
20
|
+
organization: str
|
|
21
|
+
status: str
|
|
22
|
+
aOId: str
|
|
23
|
+
interconnectOwnerId: str
|
|
24
|
+
parentId: int = 0
|
|
25
|
+
parentModule: Optional[str] = None
|
|
26
|
+
isPublic: bool = True
|
|
27
|
+
agreementDate: Optional[str] = None
|
|
28
|
+
expirationDate: Optional[str] = None
|
|
29
|
+
description: Optional[str] = None
|
|
30
|
+
createdById: Optional[str] = None
|
|
31
|
+
dateCreated: Optional[str] = None
|
|
32
|
+
dateLastUpdated: Optional[str] = None
|
|
33
|
+
lastUpdatedById: Optional[str] = None
|
|
34
|
+
tenantsId: Optional[int] = None
|
|
35
|
+
uuid: Optional[str] = None
|
|
36
|
+
dataDirection: Optional[str] = None
|
|
37
|
+
externalEmail: Optional[str] = None
|
|
38
|
+
externalFQDN: Optional[str] = None
|
|
39
|
+
externalIpAddress: Optional[str] = None
|
|
40
|
+
externalPOC: Optional[str] = None
|
|
41
|
+
externalPhone: Optional[str] = None
|
|
42
|
+
sourceFQDN: Optional[str] = None
|
|
43
|
+
sourceIpAddress: Optional[str] = None
|