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
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Tests for Microsoft Defender constants"""
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
from regscale.integrations.commercial.microsoft_defender import defender_constants
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestDefenderConstants:
|
|
10
|
+
"""Test class for Microsoft Defender constants"""
|
|
11
|
+
|
|
12
|
+
def test_date_format_constant(self):
|
|
13
|
+
"""Test DATE_FORMAT constant exists and has correct value"""
|
|
14
|
+
assert hasattr(defender_constants, "DATE_FORMAT")
|
|
15
|
+
assert defender_constants.DATE_FORMAT == "%Y-%m-%dT%H:%M:%S"
|
|
16
|
+
|
|
17
|
+
def test_identification_type_constant(self):
|
|
18
|
+
"""Test IDENTIFICATION_TYPE constant exists and has correct value"""
|
|
19
|
+
assert hasattr(defender_constants, "IDENTIFICATION_TYPE")
|
|
20
|
+
assert defender_constants.IDENTIFICATION_TYPE == "Vulnerability Assessment"
|
|
21
|
+
|
|
22
|
+
def test_cloud_recs_constant(self):
|
|
23
|
+
"""Test CLOUD_RECS constant exists and has correct value"""
|
|
24
|
+
assert hasattr(defender_constants, "CLOUD_RECS")
|
|
25
|
+
assert defender_constants.CLOUD_RECS == "Microsoft Defender for Cloud Recommendation"
|
|
26
|
+
|
|
27
|
+
def test_app_json_constant(self):
|
|
28
|
+
"""Test APP_JSON constant exists and has correct value"""
|
|
29
|
+
assert hasattr(defender_constants, "APP_JSON")
|
|
30
|
+
assert defender_constants.APP_JSON == "application/json"
|
|
31
|
+
|
|
32
|
+
def test_afd_endpoints_constant(self):
|
|
33
|
+
"""Test AFD_ENDPOINTS constant exists and has correct value"""
|
|
34
|
+
assert hasattr(defender_constants, "AFD_ENDPOINTS")
|
|
35
|
+
assert defender_constants.AFD_ENDPOINTS == "microsoft.cdn/profiles/afdendpoints"
|
|
36
|
+
|
|
37
|
+
def test_resources_query_constant(self):
|
|
38
|
+
"""Test RESOURCES_QUERY constant exists and contains expected content"""
|
|
39
|
+
assert hasattr(defender_constants, "RESOURCES_QUERY")
|
|
40
|
+
assert isinstance(defender_constants.RESOURCES_QUERY, str)
|
|
41
|
+
assert "resources" in defender_constants.RESOURCES_QUERY
|
|
42
|
+
assert "subscriptionId" in defender_constants.RESOURCES_QUERY
|
|
43
|
+
assert "{SUBSCRIPTION_ID}" in defender_constants.RESOURCES_QUERY
|
|
44
|
+
assert "resourceName = name" in defender_constants.RESOURCES_QUERY
|
|
45
|
+
assert "resourceType = type" in defender_constants.RESOURCES_QUERY
|
|
46
|
+
assert "resourceLocation = location" in defender_constants.RESOURCES_QUERY
|
|
47
|
+
assert "resourceGroup = resourceGroup" in defender_constants.RESOURCES_QUERY
|
|
48
|
+
assert "resourceId = id" in defender_constants.RESOURCES_QUERY
|
|
49
|
+
|
|
50
|
+
def test_container_scan_query_constant(self):
|
|
51
|
+
"""Test CONTAINER_SCAN_QUERY constant exists and contains expected content"""
|
|
52
|
+
assert hasattr(defender_constants, "CONTAINER_SCAN_QUERY")
|
|
53
|
+
assert isinstance(defender_constants.CONTAINER_SCAN_QUERY, str)
|
|
54
|
+
assert "securityresources" in defender_constants.CONTAINER_SCAN_QUERY
|
|
55
|
+
assert "microsoft.security/assessments" in defender_constants.CONTAINER_SCAN_QUERY
|
|
56
|
+
assert "{RESOURCE_GROUP}" in defender_constants.CONTAINER_SCAN_QUERY
|
|
57
|
+
assert "subassessments" in defender_constants.CONTAINER_SCAN_QUERY
|
|
58
|
+
assert "severity" in defender_constants.CONTAINER_SCAN_QUERY
|
|
59
|
+
|
|
60
|
+
def test_db_scan_query_constant(self):
|
|
61
|
+
"""Test DB_SCAN_QUERY constant exists and contains expected content"""
|
|
62
|
+
assert hasattr(defender_constants, "DB_SCAN_QUERY")
|
|
63
|
+
assert isinstance(defender_constants.DB_SCAN_QUERY, str)
|
|
64
|
+
assert "securityresources" in defender_constants.DB_SCAN_QUERY
|
|
65
|
+
assert "microsoft.security/assessments/subassessments" in defender_constants.DB_SCAN_QUERY
|
|
66
|
+
assert "{ASSESSMENT_KEY}" in defender_constants.DB_SCAN_QUERY
|
|
67
|
+
assert "{SUBSCRIPTION_ID}" in defender_constants.DB_SCAN_QUERY
|
|
68
|
+
assert "Unhealthy" in defender_constants.DB_SCAN_QUERY
|
|
69
|
+
|
|
70
|
+
def test_resources_query_formatting(self):
|
|
71
|
+
"""Test that RESOURCES_QUERY can be formatted with subscription ID"""
|
|
72
|
+
subscription_id = "test-subscription-123"
|
|
73
|
+
formatted_query = defender_constants.RESOURCES_QUERY.format(SUBSCRIPTION_ID=subscription_id)
|
|
74
|
+
|
|
75
|
+
assert subscription_id in formatted_query
|
|
76
|
+
assert "{SUBSCRIPTION_ID}" not in formatted_query
|
|
77
|
+
|
|
78
|
+
def test_container_scan_query_formatting(self):
|
|
79
|
+
"""Test that CONTAINER_SCAN_QUERY can be formatted with resource group"""
|
|
80
|
+
resource_group = "test-resource-group"
|
|
81
|
+
formatted_query = defender_constants.CONTAINER_SCAN_QUERY.format(RESOURCE_GROUP=resource_group)
|
|
82
|
+
|
|
83
|
+
assert resource_group in formatted_query
|
|
84
|
+
assert "{RESOURCE_GROUP}" not in formatted_query
|
|
85
|
+
|
|
86
|
+
def test_db_scan_query_formatting(self):
|
|
87
|
+
"""Test that DB_SCAN_QUERY can be formatted with assessment key and subscription ID"""
|
|
88
|
+
assessment_key = "test-assessment-key"
|
|
89
|
+
subscription_id = "test-subscription-123"
|
|
90
|
+
formatted_query = defender_constants.DB_SCAN_QUERY.format(
|
|
91
|
+
ASSESSMENT_KEY=assessment_key, SUBSCRIPTION_ID=subscription_id
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
assert assessment_key in formatted_query
|
|
95
|
+
assert subscription_id in formatted_query
|
|
96
|
+
assert "{ASSESSMENT_KEY}" not in formatted_query
|
|
97
|
+
assert "{SUBSCRIPTION_ID}" not in formatted_query
|
|
98
|
+
|
|
99
|
+
def test_all_constants_are_strings(self):
|
|
100
|
+
"""Test that all constants are strings"""
|
|
101
|
+
constants_to_check = [
|
|
102
|
+
"DATE_FORMAT",
|
|
103
|
+
"IDENTIFICATION_TYPE",
|
|
104
|
+
"CLOUD_RECS",
|
|
105
|
+
"APP_JSON",
|
|
106
|
+
"AFD_ENDPOINTS",
|
|
107
|
+
"RESOURCES_QUERY",
|
|
108
|
+
"CONTAINER_SCAN_QUERY",
|
|
109
|
+
"DB_SCAN_QUERY",
|
|
110
|
+
]
|
|
111
|
+
|
|
112
|
+
for constant_name in constants_to_check:
|
|
113
|
+
constant_value = getattr(defender_constants, constant_name)
|
|
114
|
+
assert isinstance(constant_value, str), f"{constant_name} should be a string"
|
|
115
|
+
|
|
116
|
+
def test_query_constants_multiline(self):
|
|
117
|
+
"""Test that query constants are properly formatted multiline strings"""
|
|
118
|
+
query_constants = ["RESOURCES_QUERY", "CONTAINER_SCAN_QUERY", "DB_SCAN_QUERY"]
|
|
119
|
+
|
|
120
|
+
for constant_name in query_constants:
|
|
121
|
+
query = getattr(defender_constants, constant_name)
|
|
122
|
+
# Should contain newlines indicating multiline format
|
|
123
|
+
assert "\n" in query, f"{constant_name} should be a multiline string"
|
|
124
|
+
# Should not start or end with excessive whitespace
|
|
125
|
+
assert not query.startswith("\n\n"), f"{constant_name} should not start with excessive newlines"
|
|
126
|
+
assert not query.endswith("\n\n\n"), f"{constant_name} should not end with excessive newlines"
|
|
127
|
+
|
|
128
|
+
def test_resources_query_kusto_syntax(self):
|
|
129
|
+
"""Test that RESOURCES_QUERY contains valid Kusto query syntax"""
|
|
130
|
+
query = defender_constants.RESOURCES_QUERY
|
|
131
|
+
|
|
132
|
+
# Check for key Kusto operators and functions
|
|
133
|
+
assert "extend" in query
|
|
134
|
+
assert "case(" in query
|
|
135
|
+
assert "project" in query
|
|
136
|
+
assert "tostring(" in query
|
|
137
|
+
# Check for proper field references
|
|
138
|
+
assert "resourceType =~" in query
|
|
139
|
+
assert "properties" in query
|
|
140
|
+
|
|
141
|
+
def test_container_scan_query_kusto_syntax(self):
|
|
142
|
+
"""Test that CONTAINER_SCAN_QUERY contains valid Kusto query syntax"""
|
|
143
|
+
query = defender_constants.CONTAINER_SCAN_QUERY
|
|
144
|
+
|
|
145
|
+
# Check for key Kusto operators
|
|
146
|
+
assert "summarize" in query
|
|
147
|
+
assert "join" in query
|
|
148
|
+
assert "kind=inner" in query
|
|
149
|
+
assert "extract(" in query
|
|
150
|
+
assert "where" in query
|
|
151
|
+
assert "parse_json(" in query
|
|
152
|
+
assert "order by" in query
|
|
153
|
+
|
|
154
|
+
def test_db_scan_query_kusto_syntax(self):
|
|
155
|
+
"""Test that DB_SCAN_QUERY contains valid Kusto query syntax"""
|
|
156
|
+
query = defender_constants.DB_SCAN_QUERY
|
|
157
|
+
|
|
158
|
+
# Check for key Kusto operators and functions
|
|
159
|
+
assert "extend" in query
|
|
160
|
+
assert "extract(" in query
|
|
161
|
+
assert "strcat(" in query
|
|
162
|
+
assert "iff(" in query
|
|
163
|
+
assert "project" in query
|
|
164
|
+
assert "where" in query
|
|
165
|
+
|
|
166
|
+
# ==============================
|
|
167
|
+
# NEW TESTS FOR ENTRA CONSTANTS
|
|
168
|
+
# ==============================
|
|
169
|
+
|
|
170
|
+
def test_entra_endpoints_constant(self):
|
|
171
|
+
"""Test ENTRA_ENDPOINTS constant exists and has correct structure"""
|
|
172
|
+
assert hasattr(defender_constants, "ENTRA_ENDPOINTS")
|
|
173
|
+
entra_endpoints = defender_constants.ENTRA_ENDPOINTS
|
|
174
|
+
assert isinstance(entra_endpoints, dict)
|
|
175
|
+
assert len(entra_endpoints) > 0
|
|
176
|
+
|
|
177
|
+
# Test a few key endpoints exist
|
|
178
|
+
expected_endpoints = [
|
|
179
|
+
"users",
|
|
180
|
+
"guest_users",
|
|
181
|
+
"groups_and_members",
|
|
182
|
+
"security_groups",
|
|
183
|
+
"role_assignments",
|
|
184
|
+
"role_definitions",
|
|
185
|
+
"pim_assignments",
|
|
186
|
+
"pim_eligibility",
|
|
187
|
+
"conditional_access",
|
|
188
|
+
"auth_methods_policy",
|
|
189
|
+
"user_mfa_registration",
|
|
190
|
+
"mfa_registered_users",
|
|
191
|
+
"sign_in_logs",
|
|
192
|
+
"directory_audits",
|
|
193
|
+
"provisioning_logs",
|
|
194
|
+
"access_review_definitions",
|
|
195
|
+
"access_review_instances",
|
|
196
|
+
"access_review_decisions",
|
|
197
|
+
]
|
|
198
|
+
|
|
199
|
+
for endpoint in expected_endpoints:
|
|
200
|
+
assert endpoint in entra_endpoints, f"Missing endpoint: {endpoint}"
|
|
201
|
+
|
|
202
|
+
def test_entra_endpoints_url_format(self):
|
|
203
|
+
"""Test ENTRA_ENDPOINTS URLs have correct format"""
|
|
204
|
+
entra_endpoints = defender_constants.ENTRA_ENDPOINTS
|
|
205
|
+
for key, url in entra_endpoints.items():
|
|
206
|
+
assert isinstance(url, str), f"URL for {key} should be string"
|
|
207
|
+
assert url.startswith("/"), f"URL for {key} should start with forward slash (relative URL)"
|
|
208
|
+
assert (
|
|
209
|
+
"?" in url or "$" in url or url.count("/") > 1
|
|
210
|
+
), f"URL for {key} should contain query parameters or path segments"
|
|
211
|
+
|
|
212
|
+
def test_evidence_to_controls_mapping_constant(self):
|
|
213
|
+
"""Test EVIDENCE_TO_CONTROLS_MAPPING constant exists and has correct structure"""
|
|
214
|
+
assert hasattr(defender_constants, "EVIDENCE_TO_CONTROLS_MAPPING")
|
|
215
|
+
mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
|
|
216
|
+
assert isinstance(mapping, dict)
|
|
217
|
+
assert len(mapping) > 0
|
|
218
|
+
|
|
219
|
+
# Test each evidence type maps to a list of control IDs
|
|
220
|
+
for evidence_type, controls in mapping.items():
|
|
221
|
+
assert isinstance(evidence_type, str), f"Evidence type should be string: {evidence_type}"
|
|
222
|
+
assert isinstance(controls, list), f"Controls should be list for {evidence_type}"
|
|
223
|
+
assert len(controls) > 0, f"Controls list should not be empty for {evidence_type}"
|
|
224
|
+
|
|
225
|
+
# Test each control ID is a string
|
|
226
|
+
for control in controls:
|
|
227
|
+
assert isinstance(control, str), f"Control ID should be string: {control} for {evidence_type}"
|
|
228
|
+
|
|
229
|
+
def test_evidence_to_controls_mapping_coverage(self):
|
|
230
|
+
"""Test EVIDENCE_TO_CONTROLS_MAPPING covers expected evidence types"""
|
|
231
|
+
mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
|
|
232
|
+
expected_evidence_types = [
|
|
233
|
+
"users",
|
|
234
|
+
"users_delta",
|
|
235
|
+
"guest_users",
|
|
236
|
+
"groups_and_members",
|
|
237
|
+
"security_groups",
|
|
238
|
+
"role_assignments",
|
|
239
|
+
"role_definitions",
|
|
240
|
+
"pim_assignments",
|
|
241
|
+
"pim_eligibility",
|
|
242
|
+
"conditional_access",
|
|
243
|
+
"auth_methods_policy",
|
|
244
|
+
"user_mfa_registration",
|
|
245
|
+
"mfa_registered_users",
|
|
246
|
+
"sign_in_logs",
|
|
247
|
+
"directory_audits",
|
|
248
|
+
"provisioning_logs",
|
|
249
|
+
"access_review_definitions",
|
|
250
|
+
]
|
|
251
|
+
|
|
252
|
+
for evidence_type in expected_evidence_types:
|
|
253
|
+
assert evidence_type in mapping, f"Missing evidence type mapping: {evidence_type}"
|
|
254
|
+
|
|
255
|
+
def test_endpoint_parameters_mapping_constant(self):
|
|
256
|
+
"""Test ENDPOINT_PARAMETERS_MAPPING constant exists and has correct structure"""
|
|
257
|
+
if hasattr(defender_constants, "ENDPOINT_PARAMETERS_MAPPING"):
|
|
258
|
+
mapping = defender_constants.ENDPOINT_PARAMETERS_MAPPING
|
|
259
|
+
assert isinstance(mapping, dict)
|
|
260
|
+
|
|
261
|
+
# Test that certain endpoints requiring parameters are included
|
|
262
|
+
for endpoint, params in mapping.items():
|
|
263
|
+
assert isinstance(params, list), f"Parameters should be list for {endpoint}"
|
|
264
|
+
for param in params:
|
|
265
|
+
assert isinstance(param, str), f"Parameter should be string: {param} for {endpoint}"
|
|
266
|
+
|
|
267
|
+
def test_specific_entra_endpoint_formats(self):
|
|
268
|
+
"""Test specific endpoint URLs have expected formats"""
|
|
269
|
+
entra_endpoints = defender_constants.ENTRA_ENDPOINTS
|
|
270
|
+
|
|
271
|
+
# Test users endpoint
|
|
272
|
+
if "users" in entra_endpoints:
|
|
273
|
+
users_url = entra_endpoints["users"]
|
|
274
|
+
assert "$select=" in users_url or "$" in users_url
|
|
275
|
+
|
|
276
|
+
# Test sign-in logs endpoint
|
|
277
|
+
if "sign_in_logs" in entra_endpoints:
|
|
278
|
+
signin_url = entra_endpoints["sign_in_logs"]
|
|
279
|
+
assert "auditLogs/signIns" in signin_url
|
|
280
|
+
|
|
281
|
+
# Test groups and members endpoint
|
|
282
|
+
if "groups_and_members" in entra_endpoints:
|
|
283
|
+
groups_url = entra_endpoints["groups_and_members"]
|
|
284
|
+
assert "groups" in groups_url
|
|
285
|
+
|
|
286
|
+
def test_control_mappings_have_appropriate_controls(self):
|
|
287
|
+
"""Test that evidence types have appropriate control mappings"""
|
|
288
|
+
mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
|
|
289
|
+
|
|
290
|
+
# Test that user-related evidence maps to access control (AC) controls
|
|
291
|
+
user_evidence_types = ["users", "guest_users", "users_delta"]
|
|
292
|
+
for evidence_type in user_evidence_types:
|
|
293
|
+
if evidence_type in mapping:
|
|
294
|
+
controls = mapping[evidence_type]
|
|
295
|
+
# Should have at least some controls
|
|
296
|
+
assert len(controls) > 0, f"User evidence {evidence_type} should have controls"
|
|
297
|
+
|
|
298
|
+
# Test that authentication evidence maps to appropriate controls
|
|
299
|
+
auth_evidence_types = ["user_mfa_registration", "mfa_registered_users", "auth_methods_policy"]
|
|
300
|
+
for evidence_type in auth_evidence_types:
|
|
301
|
+
if evidence_type in mapping:
|
|
302
|
+
controls = mapping[evidence_type]
|
|
303
|
+
# Should have at least some controls
|
|
304
|
+
assert len(controls) > 0, f"Auth evidence {evidence_type} should have controls"
|
|
305
|
+
|
|
306
|
+
def test_no_duplicate_controls_in_mappings(self):
|
|
307
|
+
"""Test that there are no duplicate controls in evidence mappings"""
|
|
308
|
+
mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
|
|
309
|
+
for evidence_type, controls in mapping.items():
|
|
310
|
+
unique_controls = set(controls)
|
|
311
|
+
assert len(unique_controls) == len(controls), f"Duplicate controls found in {evidence_type}: {controls}"
|
|
312
|
+
|
|
313
|
+
def test_entra_constants_not_empty(self):
|
|
314
|
+
"""Test that all Entra constants are properly initialized and not empty"""
|
|
315
|
+
# ENTRA_ENDPOINTS should exist and not be empty
|
|
316
|
+
assert hasattr(defender_constants, "ENTRA_ENDPOINTS")
|
|
317
|
+
entra_endpoints = defender_constants.ENTRA_ENDPOINTS
|
|
318
|
+
assert entra_endpoints is not None
|
|
319
|
+
assert len(entra_endpoints) > 0
|
|
320
|
+
|
|
321
|
+
# EVIDENCE_TO_CONTROLS_MAPPING should exist and not be empty
|
|
322
|
+
assert hasattr(defender_constants, "EVIDENCE_TO_CONTROLS_MAPPING")
|
|
323
|
+
evidence_mapping = defender_constants.EVIDENCE_TO_CONTROLS_MAPPING
|
|
324
|
+
assert evidence_mapping is not None
|
|
325
|
+
assert len(evidence_mapping) > 0
|
|
326
|
+
|
|
327
|
+
# Note: EVIDENCE_TYPE_MAPPINGS doesn't exist in current implementation
|