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