regscale-cli 6.21.2.0__py3-none-any.whl → 6.28.2.1__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.
- regscale/_version.py +1 -1
- regscale/airflow/hierarchy.py +2 -2
- regscale/core/app/api.py +5 -2
- regscale/core/app/application.py +36 -6
- regscale/core/app/internal/control_editor.py +73 -21
- regscale/core/app/internal/evidence.py +727 -204
- regscale/core/app/internal/login.py +4 -2
- regscale/core/app/internal/model_editor.py +219 -64
- regscale/core/app/utils/app_utils.py +86 -12
- regscale/core/app/utils/catalog_utils/common.py +1 -1
- regscale/core/login.py +21 -4
- regscale/core/utils/async_graphql_client.py +363 -0
- regscale/core/utils/date.py +77 -1
- regscale/dev/cli.py +26 -0
- regscale/dev/code_gen.py +109 -24
- regscale/dev/version.py +72 -0
- regscale/integrations/commercial/__init__.py +30 -2
- regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
- regscale/integrations/commercial/aws/cli.py +3107 -54
- regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
- regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
- regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
- regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
- regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
- regscale/integrations/commercial/aws/config_compliance.py +914 -0
- regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
- regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
- regscale/integrations/commercial/aws/evidence_generator.py +283 -0
- regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
- regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
- regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
- regscale/integrations/commercial/aws/iam_evidence.py +574 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
- regscale/integrations/commercial/aws/inventory/base.py +107 -5
- regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
- regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
- regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
- regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
- regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
- regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
- regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
- regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
- regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
- regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
- regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
- regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
- regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
- regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
- regscale/integrations/commercial/aws/kms_evidence.py +879 -0
- regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
- regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
- regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
- regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
- regscale/integrations/commercial/aws/org_evidence.py +666 -0
- regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
- regscale/integrations/commercial/aws/s3_evidence.py +632 -0
- regscale/integrations/commercial/aws/scanner.py +1072 -205
- regscale/integrations/commercial/aws/security_hub.py +319 -0
- regscale/integrations/commercial/aws/session_manager.py +282 -0
- regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
- regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
- regscale/integrations/commercial/jira.py +489 -153
- regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
- regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
- regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
- regscale/integrations/commercial/qualys/__init__.py +167 -68
- regscale/integrations/commercial/qualys/scanner.py +305 -39
- regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
- regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
- regscale/integrations/commercial/sicura/api.py +79 -42
- regscale/integrations/commercial/sicura/commands.py +8 -2
- regscale/integrations/commercial/sicura/scanner.py +83 -44
- regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
- regscale/integrations/commercial/synqly/assets.py +133 -16
- regscale/integrations/commercial/synqly/edr.py +2 -8
- regscale/integrations/commercial/synqly/query_builder.py +536 -0
- regscale/integrations/commercial/synqly/ticketing.py +27 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
- regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
- regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
- regscale/integrations/commercial/tenablev2/commands.py +146 -5
- regscale/integrations/commercial/tenablev2/scanner.py +1 -3
- regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
- regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
- regscale/integrations/commercial/wizv2/click.py +191 -76
- regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
- regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
- regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
- regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
- regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
- regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
- regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
- regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
- regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
- regscale/integrations/commercial/wizv2/issue.py +776 -28
- regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
- regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
- regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
- regscale/integrations/commercial/wizv2/reports.py +243 -0
- regscale/integrations/commercial/wizv2/sbom.py +1 -1
- regscale/integrations/commercial/wizv2/scanner.py +1031 -441
- regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
- regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
- regscale/integrations/commercial/wizv2/variables.py +89 -3
- regscale/integrations/compliance_integration.py +1036 -151
- regscale/integrations/control_matcher.py +432 -0
- regscale/integrations/due_date_handler.py +333 -0
- regscale/integrations/milestone_manager.py +291 -0
- regscale/integrations/public/__init__.py +14 -0
- regscale/integrations/public/cci_importer.py +834 -0
- regscale/integrations/public/csam/__init__.py +0 -0
- regscale/integrations/public/csam/csam.py +938 -0
- regscale/integrations/public/csam/csam_agency_defined.py +179 -0
- regscale/integrations/public/csam/csam_common.py +154 -0
- regscale/integrations/public/csam/csam_controls.py +432 -0
- regscale/integrations/public/csam/csam_poam.py +124 -0
- regscale/integrations/public/fedramp/click.py +77 -6
- regscale/integrations/public/fedramp/docx_parser.py +10 -1
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
- regscale/integrations/public/fedramp/fedramp_five.py +1 -1
- regscale/integrations/public/fedramp/poam/scanner.py +75 -7
- regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
- regscale/integrations/scanner_integration.py +1961 -430
- regscale/models/integration_models/CCI_List.xml +1 -0
- regscale/models/integration_models/aqua.py +2 -2
- regscale/models/integration_models/cisa_kev_data.json +805 -11
- regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
- regscale/models/integration_models/nexpose.py +36 -10
- regscale/models/integration_models/qualys.py +3 -4
- regscale/models/integration_models/synqly_models/capabilities.json +1 -1
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
- regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
- regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
- regscale/models/locking.py +12 -8
- regscale/models/platform.py +4 -2
- regscale/models/regscale_models/__init__.py +7 -0
- regscale/models/regscale_models/assessment.py +2 -1
- regscale/models/regscale_models/catalog.py +1 -1
- regscale/models/regscale_models/compliance_settings.py +251 -1
- regscale/models/regscale_models/component.py +1 -0
- regscale/models/regscale_models/control_implementation.py +236 -41
- regscale/models/regscale_models/control_objective.py +74 -5
- regscale/models/regscale_models/file.py +2 -0
- regscale/models/regscale_models/form_field_value.py +5 -3
- regscale/models/regscale_models/inheritance.py +44 -0
- regscale/models/regscale_models/issue.py +301 -102
- regscale/models/regscale_models/milestone.py +33 -14
- regscale/models/regscale_models/organization.py +3 -0
- regscale/models/regscale_models/regscale_model.py +310 -73
- regscale/models/regscale_models/security_plan.py +4 -2
- regscale/models/regscale_models/vulnerability.py +3 -3
- regscale/regscale.py +25 -4
- regscale/templates/__init__.py +0 -0
- regscale/utils/threading/threadhandler.py +20 -15
- regscale/validation/record.py +23 -1
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
- tests/core/__init__.py +0 -0
- tests/core/utils/__init__.py +0 -0
- tests/core/utils/test_async_graphql_client.py +472 -0
- tests/fixtures/test_fixture.py +13 -8
- tests/regscale/core/test_login.py +171 -4
- tests/regscale/integrations/commercial/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
- tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
- tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
- tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
- tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
- tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
- tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
- tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
- tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
- tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
- tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
- tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
- tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
- tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
- tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
- tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
- tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
- tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
- tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
- tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
- tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
- tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
- tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
- tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
- tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
- tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
- tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
- tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
- tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
- tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
- tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
- tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
- tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
- tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
- tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
- tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
- tests/regscale/integrations/commercial/conftest.py +28 -0
- tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
- tests/regscale/integrations/commercial/test_aws.py +3742 -0
- tests/regscale/integrations/commercial/test_burp.py +48 -0
- tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
- tests/regscale/integrations/commercial/test_dependabot.py +341 -0
- tests/regscale/integrations/commercial/test_gcp.py +1543 -0
- tests/regscale/integrations/commercial/test_gitlab.py +549 -0
- tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
- tests/regscale/integrations/commercial/test_jira.py +2204 -0
- tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
- tests/regscale/integrations/commercial/test_okta.py +1228 -0
- tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
- tests/regscale/integrations/commercial/test_sicura.py +349 -0
- tests/regscale/integrations/commercial/test_snow.py +423 -0
- tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
- tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
- tests/regscale/integrations/commercial/test_stig.py +33 -0
- tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
- tests/regscale/integrations/commercial/test_stigv2.py +406 -0
- tests/regscale/integrations/commercial/test_wiz.py +1365 -0
- tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
- tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
- tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
- tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
- tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
- tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
- tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
- tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
- tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
- tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
- tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
- tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
- tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
- tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
- tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
- tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
- tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
- tests/regscale/integrations/public/__init__.py +0 -0
- tests/regscale/integrations/public/fedramp/__init__.py +1 -0
- tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
- tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
- tests/regscale/integrations/public/test_alienvault.py +220 -0
- tests/regscale/integrations/public/test_cci.py +1053 -0
- tests/regscale/integrations/public/test_cisa.py +1021 -0
- tests/regscale/integrations/public/test_emass.py +518 -0
- tests/regscale/integrations/public/test_fedramp.py +1152 -0
- tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
- tests/regscale/integrations/public/test_file_uploads.py +506 -0
- tests/regscale/integrations/public/test_oscal.py +453 -0
- tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
- tests/regscale/integrations/test_control_matcher.py +1421 -0
- tests/regscale/integrations/test_control_matching.py +155 -0
- tests/regscale/integrations/test_milestone_manager.py +408 -0
- tests/regscale/models/test_control_implementation.py +118 -3
- tests/regscale/models/test_form_field_value_integration.py +304 -0
- tests/regscale/models/test_issue.py +378 -1
- tests/regscale/models/test_module_integration.py +582 -0
- tests/regscale/models/test_tenable_integrations.py +811 -105
- regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
- regscale/integrations/public/fedramp/parts_mapper.py +0 -107
- /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
- /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
"""This module contains the Compliance Settings model class."""
|
|
2
2
|
|
|
3
|
-
from typing import List, Optional
|
|
3
|
+
from typing import ClassVar, Dict, List, Optional
|
|
4
4
|
|
|
5
5
|
from pydantic import ConfigDict
|
|
6
6
|
|
|
7
7
|
from regscale.models.regscale_models.regscale_model import RegScaleModel
|
|
8
8
|
|
|
9
|
+
# Import the actual RegScale ControlImplementationStatus enum
|
|
10
|
+
from regscale.models.regscale_models.control_implementation import ControlImplementationStatus
|
|
11
|
+
|
|
12
|
+
# Constants
|
|
13
|
+
NOT_APPLICABLE_KEY = "not applicable"
|
|
14
|
+
|
|
9
15
|
|
|
10
16
|
class ComplianceSettings(RegScaleModel):
|
|
11
17
|
"""
|
|
@@ -110,3 +116,247 @@ class ComplianceSettings(RegScaleModel):
|
|
|
110
116
|
:rtype: List[str]
|
|
111
117
|
"""
|
|
112
118
|
return self.__class__.get_labels(self.id, setting_field)
|
|
119
|
+
|
|
120
|
+
@classmethod
|
|
121
|
+
def get_settings_list(cls) -> List[dict]:
|
|
122
|
+
"""
|
|
123
|
+
Get all compliance settings list items from settingsList endpoint.
|
|
124
|
+
|
|
125
|
+
:return: A list of compliance settings list items
|
|
126
|
+
:rtype: List[dict]
|
|
127
|
+
"""
|
|
128
|
+
response = cls._get_api_handler().get(endpoint="/api/compliance/settingsList")
|
|
129
|
+
if response and response.ok:
|
|
130
|
+
return response.json()
|
|
131
|
+
return []
|
|
132
|
+
|
|
133
|
+
@classmethod
|
|
134
|
+
def get_default_responsibility_for_compliance_setting(cls, compliance_setting_id: int) -> Optional[str]:
|
|
135
|
+
"""
|
|
136
|
+
Get the default responsibility value for a specific compliance setting.
|
|
137
|
+
|
|
138
|
+
:param int compliance_setting_id: The compliance setting ID
|
|
139
|
+
:return: The default responsibility value or None if not found
|
|
140
|
+
:rtype: Optional[str]
|
|
141
|
+
"""
|
|
142
|
+
settings_list = cls.get_settings_list()
|
|
143
|
+
for setting in settings_list:
|
|
144
|
+
if setting.get("complianceSettingId") == compliance_setting_id and setting.get("isDefault", False):
|
|
145
|
+
return setting.get("statusName")
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
# Status mapping dictionaries for different frameworks using actual RegScale values
|
|
149
|
+
DOD_STATUS_MAPPINGS: ClassVar[Dict[str, str]] = {
|
|
150
|
+
"pass": ControlImplementationStatus.Implemented.value,
|
|
151
|
+
"fail": ControlImplementationStatus.NotImplemented.value,
|
|
152
|
+
NOT_APPLICABLE_KEY: ControlImplementationStatus.NA.value,
|
|
153
|
+
"n/a": ControlImplementationStatus.NA.value,
|
|
154
|
+
"na": ControlImplementationStatus.NA.value,
|
|
155
|
+
"planned": ControlImplementationStatus.Planned.value,
|
|
156
|
+
"alternative": ControlImplementationStatus.Alternative.value,
|
|
157
|
+
"partial": ControlImplementationStatus.PartiallyImplemented.value,
|
|
158
|
+
"unknown": ControlImplementationStatus.Planned.value,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
FEDRAMP_STATUS_MAPPINGS: ClassVar[Dict[str, str]] = {
|
|
162
|
+
"pass": ControlImplementationStatus.Implemented.value,
|
|
163
|
+
"fail": ControlImplementationStatus.InRemediation.value,
|
|
164
|
+
"partial": ControlImplementationStatus.PartiallyImplemented.value,
|
|
165
|
+
NOT_APPLICABLE_KEY: ControlImplementationStatus.NA.value,
|
|
166
|
+
"n/a": ControlImplementationStatus.NA.value,
|
|
167
|
+
"na": ControlImplementationStatus.NA.value,
|
|
168
|
+
"planned": ControlImplementationStatus.Planned.value,
|
|
169
|
+
"alternative": ControlImplementationStatus.Alternative.value,
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
NIST_STATUS_MAPPINGS: ClassVar[Dict[str, str]] = {
|
|
173
|
+
"pass": ControlImplementationStatus.FullyImplemented.value,
|
|
174
|
+
"fail": ControlImplementationStatus.NotImplemented.value,
|
|
175
|
+
"partial": ControlImplementationStatus.PartiallyImplemented.value,
|
|
176
|
+
NOT_APPLICABLE_KEY: ControlImplementationStatus.NA.value,
|
|
177
|
+
"n/a": ControlImplementationStatus.NA.value,
|
|
178
|
+
"na": ControlImplementationStatus.NA.value,
|
|
179
|
+
"planned": ControlImplementationStatus.Planned.value,
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
DEFAULT_STATUS_MAPPINGS: ClassVar[Dict[str, str]] = {
|
|
183
|
+
"pass": ControlImplementationStatus.FullyImplemented.value,
|
|
184
|
+
"fail": ControlImplementationStatus.NotImplemented.value,
|
|
185
|
+
"partial": ControlImplementationStatus.PartiallyImplemented.value,
|
|
186
|
+
NOT_APPLICABLE_KEY: ControlImplementationStatus.NA.value,
|
|
187
|
+
"n/a": ControlImplementationStatus.NA.value,
|
|
188
|
+
"na": ControlImplementationStatus.NA.value,
|
|
189
|
+
"remediation": ControlImplementationStatus.InRemediation.value,
|
|
190
|
+
"planned": ControlImplementationStatus.Planned.value,
|
|
191
|
+
"inherited": ControlImplementationStatus.Inherited.value,
|
|
192
|
+
"risk accepted": ControlImplementationStatus.RiskAccepted.value,
|
|
193
|
+
"archived": ControlImplementationStatus.Archived.value,
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def get_status_mapping(cls, framework: str, result: str, override: Optional[str] = None) -> str:
|
|
198
|
+
"""
|
|
199
|
+
Get the implementation status mapping for a given result and framework.
|
|
200
|
+
|
|
201
|
+
:param str framework: The compliance framework (DoD, FedRAMP, NIST, or Default)
|
|
202
|
+
:param str result: The assessment result (Pass, Fail, Not Applicable, etc.)
|
|
203
|
+
:param Optional[str] override: Optional override value to use instead of the mapping
|
|
204
|
+
:return: The mapped implementation status
|
|
205
|
+
:rtype: str
|
|
206
|
+
"""
|
|
207
|
+
# Use override if provided
|
|
208
|
+
if override:
|
|
209
|
+
return override
|
|
210
|
+
|
|
211
|
+
# Normalize result to lowercase
|
|
212
|
+
result_lower = result.lower().strip()
|
|
213
|
+
|
|
214
|
+
# Select the appropriate mapping based on framework
|
|
215
|
+
if framework.upper() in ["DOD", "RMF", "DEFENSE"]:
|
|
216
|
+
mappings = cls.DOD_STATUS_MAPPINGS
|
|
217
|
+
default_fail = ControlImplementationStatus.NotImplemented.value
|
|
218
|
+
elif framework.upper() == "FEDRAMP":
|
|
219
|
+
mappings = cls.FEDRAMP_STATUS_MAPPINGS
|
|
220
|
+
default_fail = ControlImplementationStatus.InRemediation.value
|
|
221
|
+
elif framework.upper() in ["NIST", "800-53", "FISMA"]:
|
|
222
|
+
mappings = cls.NIST_STATUS_MAPPINGS
|
|
223
|
+
default_fail = ControlImplementationStatus.NotImplemented.value
|
|
224
|
+
else:
|
|
225
|
+
mappings = cls.DEFAULT_STATUS_MAPPINGS
|
|
226
|
+
default_fail = ControlImplementationStatus.NotImplemented.value
|
|
227
|
+
|
|
228
|
+
# Get the mapped status
|
|
229
|
+
if result_lower in mappings:
|
|
230
|
+
return mappings[result_lower]
|
|
231
|
+
|
|
232
|
+
# Handle common variations
|
|
233
|
+
if result_lower in ["passed", "passing", "compliant", "success"]:
|
|
234
|
+
return mappings.get("pass", ControlImplementationStatus.FullyImplemented.value)
|
|
235
|
+
elif result_lower in ["failed", "failing", "non-compliant", "failure"]:
|
|
236
|
+
return mappings.get("fail", default_fail)
|
|
237
|
+
|
|
238
|
+
# Default to a reasonable value based on result type
|
|
239
|
+
if "pass" in result_lower or "implement" in result_lower:
|
|
240
|
+
return mappings.get("pass", ControlImplementationStatus.FullyImplemented.value)
|
|
241
|
+
elif "fail" in result_lower or "not" in result_lower:
|
|
242
|
+
return mappings.get("fail", default_fail)
|
|
243
|
+
elif "n/a" in result_lower or NOT_APPLICABLE_KEY in result_lower:
|
|
244
|
+
return mappings.get(NOT_APPLICABLE_KEY, ControlImplementationStatus.NA.value)
|
|
245
|
+
|
|
246
|
+
# If nothing matches, return a sensible default
|
|
247
|
+
return default_fail
|
|
248
|
+
|
|
249
|
+
def _detect_framework_from_title(self) -> str:
|
|
250
|
+
"""
|
|
251
|
+
Detect framework type from compliance setting title.
|
|
252
|
+
|
|
253
|
+
:return: Framework name ("DoD", "FedRAMP", "NIST", or "Default")
|
|
254
|
+
:rtype: str
|
|
255
|
+
"""
|
|
256
|
+
if not self.title:
|
|
257
|
+
return "Default"
|
|
258
|
+
|
|
259
|
+
title_lower = self.title.lower()
|
|
260
|
+
if any(kw in title_lower for kw in ["dod", "rmf", "defense"]):
|
|
261
|
+
return "DoD"
|
|
262
|
+
elif "fedramp" in title_lower:
|
|
263
|
+
return "FedRAMP"
|
|
264
|
+
elif any(kw in title_lower for kw in ["nist", "800-53", "fisma"]):
|
|
265
|
+
return "NIST"
|
|
266
|
+
return "Default"
|
|
267
|
+
|
|
268
|
+
def _find_compatible_pass_label(self, available_labels: List[str]) -> Optional[str]:
|
|
269
|
+
"""
|
|
270
|
+
Find a compatible label for Pass results from available labels.
|
|
271
|
+
|
|
272
|
+
:param List[str] available_labels: Available status labels
|
|
273
|
+
:return: Compatible label or None
|
|
274
|
+
:rtype: Optional[str]
|
|
275
|
+
"""
|
|
276
|
+
for label in available_labels:
|
|
277
|
+
if any(kw in label.lower() for kw in ["implemented", "complete", "satisfied"]):
|
|
278
|
+
return label
|
|
279
|
+
return None
|
|
280
|
+
|
|
281
|
+
def _find_compatible_fail_label(self, available_labels: List[str]) -> Optional[str]:
|
|
282
|
+
"""
|
|
283
|
+
Find a compatible label for Fail results from available labels.
|
|
284
|
+
|
|
285
|
+
:param List[str] available_labels: Available status labels
|
|
286
|
+
:return: Compatible label or None
|
|
287
|
+
:rtype: Optional[str]
|
|
288
|
+
"""
|
|
289
|
+
for label in available_labels:
|
|
290
|
+
if any(kw in label.lower() for kw in ["not implemented", "remediation", "planned"]):
|
|
291
|
+
return label
|
|
292
|
+
return None
|
|
293
|
+
|
|
294
|
+
def _find_compatible_na_label(self, available_labels: List[str]) -> Optional[str]:
|
|
295
|
+
"""
|
|
296
|
+
Find a compatible label for Not Applicable results from available labels.
|
|
297
|
+
|
|
298
|
+
:param List[str] available_labels: Available status labels
|
|
299
|
+
:return: Compatible label or None
|
|
300
|
+
:rtype: Optional[str]
|
|
301
|
+
"""
|
|
302
|
+
for label in available_labels:
|
|
303
|
+
if any(kw in label.lower() for kw in [NOT_APPLICABLE_KEY, "n/a"]):
|
|
304
|
+
return label
|
|
305
|
+
return None
|
|
306
|
+
|
|
307
|
+
def _find_fallback_status(self, result: str, available_labels: List[str]) -> Optional[str]:
|
|
308
|
+
"""
|
|
309
|
+
Find a fallback status based on result type when exact match not found.
|
|
310
|
+
|
|
311
|
+
:param str result: The assessment result
|
|
312
|
+
:param List[str] available_labels: Available status labels
|
|
313
|
+
:return: Fallback status or None
|
|
314
|
+
:rtype: Optional[str]
|
|
315
|
+
"""
|
|
316
|
+
result_lower = result.lower().strip()
|
|
317
|
+
|
|
318
|
+
# For Pass results
|
|
319
|
+
if result_lower in ["pass", "passed", "passing"]:
|
|
320
|
+
return self._find_compatible_pass_label(available_labels)
|
|
321
|
+
|
|
322
|
+
# For Fail results
|
|
323
|
+
if result_lower in ["fail", "failed", "failing"]:
|
|
324
|
+
return self._find_compatible_fail_label(available_labels)
|
|
325
|
+
|
|
326
|
+
# For Not Applicable
|
|
327
|
+
if result_lower in [NOT_APPLICABLE_KEY, "n/a", "na"]:
|
|
328
|
+
return self._find_compatible_na_label(available_labels)
|
|
329
|
+
|
|
330
|
+
return None
|
|
331
|
+
|
|
332
|
+
def get_implementation_status_for_result(self, result: str, override: Optional[str] = None) -> str:
|
|
333
|
+
"""
|
|
334
|
+
Get the implementation status for a given assessment result based on this compliance setting.
|
|
335
|
+
|
|
336
|
+
:param str result: The assessment result (Pass, Fail, Not Applicable, etc.)
|
|
337
|
+
:param Optional[str] override: Optional override value to use instead of the mapping
|
|
338
|
+
:return: The mapped implementation status that exists in this compliance setting
|
|
339
|
+
:rtype: str
|
|
340
|
+
"""
|
|
341
|
+
# Detect framework from title
|
|
342
|
+
framework = self._detect_framework_from_title()
|
|
343
|
+
|
|
344
|
+
# Get the mapped status
|
|
345
|
+
mapped_status = self.get_status_mapping(framework, result, override)
|
|
346
|
+
|
|
347
|
+
# Check if this status exists in the available labels
|
|
348
|
+
available_labels = self.get_field_labels("implementationStatus")
|
|
349
|
+
if available_labels and mapped_status in available_labels:
|
|
350
|
+
return mapped_status
|
|
351
|
+
|
|
352
|
+
# If mapped status doesn't exist, try to find a compatible one
|
|
353
|
+
if available_labels:
|
|
354
|
+
fallback_status = self._find_fallback_status(result, available_labels)
|
|
355
|
+
if fallback_status:
|
|
356
|
+
return fallback_status
|
|
357
|
+
|
|
358
|
+
# If no match found, return first available
|
|
359
|
+
return available_labels[0]
|
|
360
|
+
|
|
361
|
+
# Return the mapped status even if not in labels (fallback)
|
|
362
|
+
return mapped_status
|