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