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,138 @@
|
|
|
1
|
+
from typing import List, Optional
|
|
2
|
+
from typing_extensions import TypedDict
|
|
3
|
+
|
|
4
|
+
from lxml import etree
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
6
|
+
|
|
7
|
+
from regscale.core.app.api import Api
|
|
8
|
+
from regscale.core.app.logz import create_logger
|
|
9
|
+
from regscale.integrations.public.fedramp.reporting import log_error, log_event
|
|
10
|
+
from regscale.models import regscale_models, StakeHolder, SystemRole
|
|
11
|
+
|
|
12
|
+
logger = create_logger()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class LogEventArgs(TypedDict):
|
|
16
|
+
"""
|
|
17
|
+
Args for the log_event function.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
record_type: str
|
|
21
|
+
event_msg: str
|
|
22
|
+
model_layer: str
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class LogErrorArgs(TypedDict):
|
|
26
|
+
"""
|
|
27
|
+
Args for the log_error function.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
record_type: str
|
|
31
|
+
missing_element: Optional[str]
|
|
32
|
+
model_layer: str
|
|
33
|
+
event_msg: str
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class FedrampTraversalError(TypedDict):
|
|
37
|
+
timestamp: str
|
|
38
|
+
level: str
|
|
39
|
+
model_layer: str
|
|
40
|
+
record_type: str
|
|
41
|
+
event: str
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class FedrampTraversalInfo(TypedDict):
|
|
45
|
+
timestamp: str
|
|
46
|
+
level: str
|
|
47
|
+
model_layer: str
|
|
48
|
+
record_type: str
|
|
49
|
+
event: str
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class FedrampTraversal(BaseModel):
|
|
53
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
54
|
+
|
|
55
|
+
# The Regscale API object we'll use to post from this traversal.
|
|
56
|
+
api: Api
|
|
57
|
+
|
|
58
|
+
# The root XML element.
|
|
59
|
+
root: etree._Element
|
|
60
|
+
|
|
61
|
+
# Namespaces for this traversal
|
|
62
|
+
namespaces: Optional[dict] = None
|
|
63
|
+
|
|
64
|
+
# This is the id of the ssp in RegScale, if it has been created.
|
|
65
|
+
ssp_id: Optional[int] = None
|
|
66
|
+
|
|
67
|
+
# This is the id of the catalogue in RegScale that the user has selected during upload.
|
|
68
|
+
catalogue_id: Optional[int] = None
|
|
69
|
+
|
|
70
|
+
# List of errors that have occurred during the traversal.
|
|
71
|
+
errors: List[FedrampTraversalError] = Field(default_factory=list)
|
|
72
|
+
|
|
73
|
+
# List of info messages that have occurred during the traversal.
|
|
74
|
+
infos: List[FedrampTraversalInfo] = Field(default_factory=list)
|
|
75
|
+
|
|
76
|
+
def fedramp_role_id_to_regscale_system_role_id(self, fedramp_role_id: str) -> Optional[int]:
|
|
77
|
+
"""
|
|
78
|
+
Get the RegScale SystemRole.id for a FedRAMP role id, contained in this SSP.
|
|
79
|
+
|
|
80
|
+
If no such mapping exists, returns None.
|
|
81
|
+
"""
|
|
82
|
+
# FUTURE-TODO: SPEED-OPTIMIZATION -- This could be cached on the traversal object,
|
|
83
|
+
# so it doesn't have to be refetched.
|
|
84
|
+
ssp_system_roles = SystemRole.get_all_by_ssp_id(self.api.app, self.ssp_id)
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
matching_system_roles = [
|
|
88
|
+
system_role for system_role in ssp_system_roles if system_role["fedrampRoleId"] == fedramp_role_id
|
|
89
|
+
]
|
|
90
|
+
except (KeyError, AttributeError):
|
|
91
|
+
matching_system_roles = [
|
|
92
|
+
system_role for system_role in ssp_system_roles if system_role.fedrampRoleId == fedramp_role_id
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
first_matching_system_role = matching_system_roles[0] if matching_system_roles else None
|
|
96
|
+
return first_matching_system_role["id"] if first_matching_system_role else None
|
|
97
|
+
|
|
98
|
+
def fedramp_party_to_regscale_stakeholder_id(self, party_fedramp_uuid: str) -> Optional[int]:
|
|
99
|
+
"""
|
|
100
|
+
Get the RegScale Stakeholder.id for a FedRAMP party UUID, contained in this SSP.
|
|
101
|
+
|
|
102
|
+
If no such mapping exists, returns None.
|
|
103
|
+
"""
|
|
104
|
+
# Parties MIGHT be able to be multiple things
|
|
105
|
+
# FOR SURE
|
|
106
|
+
# - Stakeholder
|
|
107
|
+
# All stakeholders
|
|
108
|
+
# FUTURE-TODO: SPEED-OPTIMIZATION -- This could be cached on the traversal object,
|
|
109
|
+
# so it doesn't have to be refetched.
|
|
110
|
+
stakeholders = StakeHolder.get_all_by_parent(
|
|
111
|
+
parent_id=self.ssp_id,
|
|
112
|
+
parent_module=regscale_models.SecurityPlan.get_module_slug(),
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Debug only.
|
|
116
|
+
logger.debug("stakeholders", stakeholders)
|
|
117
|
+
|
|
118
|
+
# get stakeholders with otherID = party_fedramp_uuid
|
|
119
|
+
matching_stakeholders = [
|
|
120
|
+
stakeholder for stakeholder in stakeholders if stakeholder.otherID == party_fedramp_uuid
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
first_matching_stakeholder = matching_stakeholders[0] if matching_stakeholders else None
|
|
124
|
+
|
|
125
|
+
return first_matching_stakeholder.id if first_matching_stakeholder else None
|
|
126
|
+
|
|
127
|
+
# TODO-FUTURE: MAYBE these need to be handled too?
|
|
128
|
+
# - SystemRole
|
|
129
|
+
# - User (probably not)
|
|
130
|
+
|
|
131
|
+
# Add an error to the traversal.
|
|
132
|
+
def log_error(self, error: LogErrorArgs):
|
|
133
|
+
# logger.error(f"{error.error_level}: {error.error_msg}")
|
|
134
|
+
self.errors.append(log_error(**error, level="Error"))
|
|
135
|
+
|
|
136
|
+
def log_info(self, event: LogEventArgs):
|
|
137
|
+
# logger.info(f"{info.info_level}: {info.info_msg}")
|
|
138
|
+
self.infos.append(log_event(**event, level="Info"))
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"""Import FedRAMP Revision 4 SSP XML into RegScale"""
|
|
2
|
+
|
|
3
|
+
# flake8: noqa
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Any, Dict, Tuple, Generator, Optional
|
|
6
|
+
|
|
7
|
+
from lxml import etree
|
|
8
|
+
from pydantic import ValidationError
|
|
9
|
+
|
|
10
|
+
from regscale.core.app.api import Api
|
|
11
|
+
from regscale.core.app.application import Application
|
|
12
|
+
from regscale.core.app.logz import create_logger
|
|
13
|
+
from regscale.integrations.public.fedramp.fedramp_traversal import FedrampTraversal
|
|
14
|
+
from regscale.integrations.public.fedramp.metadata import parse_metadata
|
|
15
|
+
from regscale.integrations.public.fedramp.reporting import write_events
|
|
16
|
+
from regscale.integrations.public.fedramp.system_characteristics import (
|
|
17
|
+
parse_minimum_ssp,
|
|
18
|
+
parse_system_characteristics,
|
|
19
|
+
)
|
|
20
|
+
from regscale.integrations.public.fedramp.system_control_implementations import (
|
|
21
|
+
fetch_implementations,
|
|
22
|
+
)
|
|
23
|
+
from regscale.integrations.public.fedramp.system_implementation import (
|
|
24
|
+
parse_system_implementation,
|
|
25
|
+
)
|
|
26
|
+
from regscale.core.app.utils.app_utils import (
|
|
27
|
+
get_file_name,
|
|
28
|
+
)
|
|
29
|
+
from regscale.core.app.utils.regscale_utils import create_new_data_submodule
|
|
30
|
+
from regscale.models.regscale_models import File, SecurityPlan
|
|
31
|
+
|
|
32
|
+
logger = create_logger()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def parse_and_load_xml_rev4(
|
|
36
|
+
context: Any, file_path: str, catalogue_id: int, filename: str = "Sample.xml"
|
|
37
|
+
) -> Generator[Tuple[str, Dict, Dict], None, None]:
|
|
38
|
+
"""
|
|
39
|
+
Parse and load XML Rev4
|
|
40
|
+
|
|
41
|
+
:param Any context: Flask app context
|
|
42
|
+
:param str file_path: Path to XML file
|
|
43
|
+
:param int catalogue_id: Catalogue ID user selected
|
|
44
|
+
:param str filename: Name of file that will be uploaded to RegScale
|
|
45
|
+
:yields Generator[Tuple[str, Dict, Dict]]: Tuple of filename and upload results
|
|
46
|
+
:return: Tuple of filename and upload results
|
|
47
|
+
:rtype: Generator[Tuple[str, Dict, Dict]]
|
|
48
|
+
"""
|
|
49
|
+
# Process with app request context to yield partial content to the browser
|
|
50
|
+
# with context:
|
|
51
|
+
logger.info(f"Parsing and loading file {file_path}.")
|
|
52
|
+
events_list = [] # will store events as they take place throughout the import process
|
|
53
|
+
app = Application()
|
|
54
|
+
api = Api()
|
|
55
|
+
events_list = [] # will store events as they take place throughout the import process
|
|
56
|
+
|
|
57
|
+
ns = {
|
|
58
|
+
"ns1": "http://csrc.nist.gov/ns/oscal/1.0",
|
|
59
|
+
"oscal": "http://csrc.nist.gov/ns/oscal/1.0",
|
|
60
|
+
"fedramp": "https://fedramp.gov/ns/oscal",
|
|
61
|
+
}
|
|
62
|
+
if context is not None:
|
|
63
|
+
yield "<div>Creating Security Plan...</div>"
|
|
64
|
+
tree = etree.parse(file_path)
|
|
65
|
+
root = tree.getroot()
|
|
66
|
+
ssp_uuid = root.attrib["uuid"]
|
|
67
|
+
new_ssp = {"uuid": ssp_uuid}
|
|
68
|
+
|
|
69
|
+
# Create fedramp traversal object.
|
|
70
|
+
trv = FedrampTraversal(
|
|
71
|
+
api=api,
|
|
72
|
+
root=root,
|
|
73
|
+
namespaces=ns,
|
|
74
|
+
)
|
|
75
|
+
# --- Set the catalogue_id on the traversal object.
|
|
76
|
+
trv.catalogue_id = catalogue_id
|
|
77
|
+
|
|
78
|
+
# 0. Create the EMPTY SSP that we need for later posts.
|
|
79
|
+
ssp_id = parse_minimum_ssp(api=api, root=root, new_ssp=new_ssp, ns=ns, events_list=events_list)
|
|
80
|
+
logger.info(f"Created new SSP in RegScale with ID {ssp_id}.")
|
|
81
|
+
# --- Set the ssp_id on the traversal object.
|
|
82
|
+
trv.ssp_id = ssp_id
|
|
83
|
+
|
|
84
|
+
# -- validate oscal ssp via API call
|
|
85
|
+
validatefile = "artifacts/validation-results.csv"
|
|
86
|
+
now = datetime.now()
|
|
87
|
+
validatefile = validatefile.replace(".", "-SSP-{0}_".format(ssp_id) + now.strftime("%Y%m%d."))
|
|
88
|
+
|
|
89
|
+
logger.info("Validating OSCAL file... please stand by.")
|
|
90
|
+
valid_msg = validate_oscal(trv, file_path)
|
|
91
|
+
validate_list = valid_msg
|
|
92
|
+
logger.info(valid_msg)
|
|
93
|
+
logger.info("Validation complete.")
|
|
94
|
+
|
|
95
|
+
write_events(validate_list, validatefile)
|
|
96
|
+
attach_artifact_to_ssp(trv=trv, file_path=validatefile, tags="imported-oscal-validation-report,")
|
|
97
|
+
|
|
98
|
+
trv.log_info(
|
|
99
|
+
{
|
|
100
|
+
"record_type": "oscal",
|
|
101
|
+
"event_msg": f"OSCAL validation of file '{get_file_name(file_path)}' ran successfully."
|
|
102
|
+
"Validation result file in RegScale.",
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# 1. Parse the <metadata> tag
|
|
107
|
+
parse_metadata(trv, app)
|
|
108
|
+
if context is not None:
|
|
109
|
+
yield "<div>Parsing metadata...</div>"
|
|
110
|
+
|
|
111
|
+
# upload xml file & data submodules in the SSP
|
|
112
|
+
attach_artifact_to_ssp(trv=trv, file_path=file_path, tags="system-security-plan,")
|
|
113
|
+
|
|
114
|
+
# 2. Parse the <system-characteristics> tag
|
|
115
|
+
parse_system_characteristics(ssp_id=ssp_id, root=root, ns=ns, events_list=events_list)
|
|
116
|
+
logger.info("System characteristics parsed successfully.")
|
|
117
|
+
|
|
118
|
+
# 3. Parse the <system-implementation> tag!
|
|
119
|
+
if context is not None:
|
|
120
|
+
yield "<div>Creating control implementations (this may take several minutes)...</div>"
|
|
121
|
+
parse_system_implementation(trv)
|
|
122
|
+
if context is not None:
|
|
123
|
+
yield "<div>Control implementations created.</div>"
|
|
124
|
+
|
|
125
|
+
# 4. TODO <control-implementation>
|
|
126
|
+
# parse_control_implementation()
|
|
127
|
+
|
|
128
|
+
# 5. Parse <back-matter>
|
|
129
|
+
# parse_back_matter()
|
|
130
|
+
|
|
131
|
+
# Write the events.
|
|
132
|
+
resultfile = "artifacts/import-results.csv"
|
|
133
|
+
now = datetime.now()
|
|
134
|
+
resultfile = resultfile.replace(".", "-SSP-{0}_".format(ssp_id) + now.strftime("%Y%m%d."))
|
|
135
|
+
|
|
136
|
+
logger.info("Uploading SSP to RegScale...")
|
|
137
|
+
if context is not None:
|
|
138
|
+
yield "<div>Uploading source SSP to RegScale...</div>"
|
|
139
|
+
|
|
140
|
+
try:
|
|
141
|
+
ssp = SecurityPlan(**new_ssp)
|
|
142
|
+
except ValidationError as exc:
|
|
143
|
+
logger.error(f"Failed to validate: {exc}")
|
|
144
|
+
return resultfile, {
|
|
145
|
+
"status": "failed",
|
|
146
|
+
}
|
|
147
|
+
# you can create a new ssp without the userId populated, but we normally use the userId from init.yaml
|
|
148
|
+
ssp.systemOwnerId = app.config["userId"]
|
|
149
|
+
ssp.id = ssp_id
|
|
150
|
+
ssp.uuid = ssp_uuid
|
|
151
|
+
new_ssp = ssp.update_ssp(api=api, return_id=False)
|
|
152
|
+
new_ssp_id = new_ssp.id
|
|
153
|
+
oscal_implementations = fetch_implementations(trv=trv, root=root, ssp=new_ssp)
|
|
154
|
+
|
|
155
|
+
upload_results = {
|
|
156
|
+
"ssp_id": new_ssp_id,
|
|
157
|
+
"implementations_loaded": len(oscal_implementations),
|
|
158
|
+
"ssp_title": new_ssp.systemName,
|
|
159
|
+
}
|
|
160
|
+
logger.info(f"Finished uploading SSP {ssp_id}")
|
|
161
|
+
|
|
162
|
+
final_list = [*events_list, *trv.errors, *trv.infos]
|
|
163
|
+
write_events(final_list, resultfile)
|
|
164
|
+
|
|
165
|
+
# upload privacyImpactAssessment. If is None then dont.
|
|
166
|
+
logger.info(f"Uploading validation results for import SSP {new_ssp_id}")
|
|
167
|
+
attach_artifact_to_ssp(trv=trv, file_path=resultfile, tags="imported-security-plan-report,")
|
|
168
|
+
if context is None:
|
|
169
|
+
return resultfile, upload_results, oscal_implementations
|
|
170
|
+
else:
|
|
171
|
+
yield resultfile, upload_results, oscal_implementations
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def validate_oscal(trv: FedrampTraversal, file_path: str) -> Optional[list[str]]:
|
|
175
|
+
"""
|
|
176
|
+
Function to validate the SSP XML file against NIST OSCAL constraints
|
|
177
|
+
|
|
178
|
+
:param FedrampTraversal trv: FedrampTraversal object
|
|
179
|
+
:param str file_path: Path to the file to validate
|
|
180
|
+
:raises ValueError: If the file size is over 100 MB
|
|
181
|
+
:return: List of validation results
|
|
182
|
+
:rtype: Optional[list[str]]
|
|
183
|
+
"""
|
|
184
|
+
api = trv.api
|
|
185
|
+
file_data = [bytes]
|
|
186
|
+
|
|
187
|
+
file_path, file_size = File._check_compression(file_path=file_path, size_limit_mb=100, file_data=file_data)
|
|
188
|
+
if file_size > 104857600:
|
|
189
|
+
mb_size = file_size / 1024 / 1024
|
|
190
|
+
limit_size = 104857600 / 1024 / 1024
|
|
191
|
+
raise ValueError(f"File size is {mb_size} MB. This is over the max file size of {limit_size} MB")
|
|
192
|
+
|
|
193
|
+
file_headers = {
|
|
194
|
+
"Authorization": api.config["token"],
|
|
195
|
+
"accept": "multipart/form-data, text/xml, text/html, application/json, text/plain, */*",
|
|
196
|
+
}
|
|
197
|
+
file_type_header = "multipart/form-data"
|
|
198
|
+
data = open(file_path, "rb").read()
|
|
199
|
+
if not data:
|
|
200
|
+
logger.info("unable to read file!")
|
|
201
|
+
|
|
202
|
+
files = [
|
|
203
|
+
(
|
|
204
|
+
"file",
|
|
205
|
+
(
|
|
206
|
+
file_path,
|
|
207
|
+
data or open(file_path, "rb").read(),
|
|
208
|
+
file_type_header,
|
|
209
|
+
),
|
|
210
|
+
)
|
|
211
|
+
]
|
|
212
|
+
|
|
213
|
+
url = f"{api.config['domain']}/api/oscal/ValidateNIST"
|
|
214
|
+
file_res = api.post(
|
|
215
|
+
url=url,
|
|
216
|
+
headers=file_headers,
|
|
217
|
+
files=files,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
if not file_res.ok:
|
|
221
|
+
api.logger.warning(f"{file_res.status_code} - {file_res.reason}")
|
|
222
|
+
return None
|
|
223
|
+
else:
|
|
224
|
+
retstr = file_res.text
|
|
225
|
+
retstr = retstr.replace("\x1b[97m[\x1b[0;91mERROR\x1b[0;97m] \x1b", "")
|
|
226
|
+
retstr = retstr.rsplit("[m[")
|
|
227
|
+
return retstr
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def attach_artifact_to_ssp(trv: FedrampTraversal, file_path: str, tags: str) -> None:
|
|
231
|
+
"""
|
|
232
|
+
Function to attach the XML file to the SSP's data and file submodules in RegScale
|
|
233
|
+
|
|
234
|
+
:param FedrampTraversal trv: FedrampTraversal object
|
|
235
|
+
:param str file_path: Path to the file to upload
|
|
236
|
+
:param str tags: Tags to attach to the file during upload
|
|
237
|
+
:rtype: None
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
# upload xml file to SSP
|
|
241
|
+
if File.upload_file_to_regscale(
|
|
242
|
+
file_name=file_path,
|
|
243
|
+
parent_id=trv.ssp_id,
|
|
244
|
+
parent_module="securityplans",
|
|
245
|
+
api=trv.api,
|
|
246
|
+
tags=tags,
|
|
247
|
+
return_object=True,
|
|
248
|
+
):
|
|
249
|
+
trv.log_info(
|
|
250
|
+
{
|
|
251
|
+
"record_type": "file",
|
|
252
|
+
"event_msg": f"Uploaded file '{get_file_name(file_path)}' to SSP# {get_file_name(file_path)}"
|
|
253
|
+
"File module in RegScale.",
|
|
254
|
+
}
|
|
255
|
+
)
|
|
256
|
+
else:
|
|
257
|
+
trv.log_error(
|
|
258
|
+
{
|
|
259
|
+
"record_type": "file",
|
|
260
|
+
"event_msg": f"Failed to upload file '{get_file_name(file_path)}' to SSP# {trv.ssp_id} "
|
|
261
|
+
"File module in RegScale.",
|
|
262
|
+
}
|
|
263
|
+
)
|
|
264
|
+
if create_new_data_submodule(parent_id=trv.ssp_id, parent_module="securityplans", file_path=file_path):
|
|
265
|
+
trv.log_info(
|
|
266
|
+
{
|
|
267
|
+
"record_type": "Data",
|
|
268
|
+
"event_msg": f"Uploaded file '{get_file_name(file_path)}' to SSP# {get_file_name(file_path)}"
|
|
269
|
+
"Data module in RegScale.",
|
|
270
|
+
}
|
|
271
|
+
)
|
|
272
|
+
else:
|
|
273
|
+
trv.log_error(
|
|
274
|
+
{
|
|
275
|
+
"record_type": "Data",
|
|
276
|
+
"event_msg": f"Failed to upload file '{get_file_name(file_path)}' to SSP# {trv.ssp_id} "
|
|
277
|
+
" Data module in RegScale.",
|
|
278
|
+
}
|
|
279
|
+
)
|