regscale-cli 6.27.1.0__py3-none-any.whl → 6.27.3.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/_version.py +1 -1
- regscale/core/app/application.py +1 -0
- regscale/core/app/internal/control_editor.py +73 -21
- regscale/core/app/internal/login.py +4 -1
- regscale/core/app/internal/model_editor.py +219 -64
- regscale/core/app/utils/app_utils.py +41 -7
- regscale/core/login.py +21 -4
- regscale/core/utils/date.py +77 -1
- regscale/integrations/commercial/aws/scanner.py +7 -3
- regscale/integrations/commercial/microsoft_defender/defender_api.py +1 -1
- regscale/integrations/commercial/sicura/api.py +65 -29
- regscale/integrations/commercial/sicura/scanner.py +36 -7
- regscale/integrations/commercial/synqly/query_builder.py +4 -1
- regscale/integrations/commercial/tenablev2/commands.py +4 -4
- regscale/integrations/commercial/tenablev2/scanner.py +1 -2
- regscale/integrations/commercial/wizv2/scanner.py +40 -16
- regscale/integrations/control_matcher.py +78 -23
- regscale/integrations/public/cci_importer.py +400 -9
- regscale/integrations/public/csam/csam.py +572 -763
- 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 +17 -4
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +271 -62
- regscale/integrations/public/fedramp/poam/scanner.py +74 -7
- regscale/integrations/scanner_integration.py +16 -1
- regscale/models/integration_models/aqua.py +2 -2
- regscale/models/integration_models/cisa_kev_data.json +121 -18
- regscale/models/integration_models/flat_file_importer/__init__.py +4 -6
- regscale/models/integration_models/synqly_models/capabilities.json +1 -1
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +35 -2
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +41 -12
- regscale/models/platform.py +3 -0
- regscale/models/regscale_models/__init__.py +5 -0
- regscale/models/regscale_models/component.py +1 -1
- regscale/models/regscale_models/control_implementation.py +55 -24
- regscale/models/regscale_models/organization.py +3 -0
- regscale/models/regscale_models/regscale_model.py +17 -5
- regscale/models/regscale_models/security_plan.py +1 -0
- regscale/regscale.py +11 -1
- {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/METADATA +1 -1
- {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/RECORD +53 -49
- tests/regscale/core/test_login.py +171 -4
- tests/regscale/integrations/commercial/test_sicura.py +0 -1
- tests/regscale/integrations/commercial/wizv2/test_wizv2.py +86 -0
- tests/regscale/integrations/public/test_cci.py +596 -1
- tests/regscale/integrations/test_control_matcher.py +24 -0
- tests/regscale/models/test_control_implementation.py +118 -3
- {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/LICENSE +0 -0
- {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/WHEEL +0 -0
- {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/entry_points.txt +0 -0
- {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/top_level.txt +0 -0
|
@@ -522,6 +522,35 @@ class TestWizVulnerabilityIntegration(unittest.TestCase):
|
|
|
522
522
|
severity = WizVulnerabilityIntegration.get_issue_severity("Unknown")
|
|
523
523
|
self.assertEqual(severity, regscale_models.IssueSeverity.Low)
|
|
524
524
|
|
|
525
|
+
def test_get_issue_severity_none_maps_to_not_assigned(self, mock_parent_init):
|
|
526
|
+
"""Test REG-17981: Handle NONE severity from Wiz config findings."""
|
|
527
|
+
severity = WizVulnerabilityIntegration.get_issue_severity("None")
|
|
528
|
+
self.assertEqual(severity, regscale_models.IssueSeverity.NotAssigned)
|
|
529
|
+
|
|
530
|
+
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
531
|
+
def test_should_process_finding_by_severity_none_treated_as_informational(
|
|
532
|
+
self, mock_authenticate, mock_parent_init
|
|
533
|
+
):
|
|
534
|
+
"""Test REG-17981: NONE severity should be treated as informational for filtering."""
|
|
535
|
+
mock_authenticate.return_value = None
|
|
536
|
+
integration = WizVulnerabilityIntegration(plan_id=self.plan_id)
|
|
537
|
+
self._initialize_scanner_attributes(integration)
|
|
538
|
+
integration.app.config["scanners"] = {"wiz": {"minimumSeverity": "low"}}
|
|
539
|
+
# NONE severity should be filtered out when min is "low" (treated as informational)
|
|
540
|
+
self.assertFalse(integration.should_process_finding_by_severity("NONE"))
|
|
541
|
+
|
|
542
|
+
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
543
|
+
def test_should_process_finding_by_severity_none_allowed_with_informational(
|
|
544
|
+
self, mock_authenticate, mock_parent_init
|
|
545
|
+
):
|
|
546
|
+
"""Test REG-17981: NONE severity should be allowed when min severity is informational."""
|
|
547
|
+
mock_authenticate.return_value = None
|
|
548
|
+
integration = WizVulnerabilityIntegration(plan_id=self.plan_id)
|
|
549
|
+
self._initialize_scanner_attributes(integration)
|
|
550
|
+
integration.app.config["scanners"] = {"wiz": {"minimumSeverity": "informational"}}
|
|
551
|
+
# NONE severity should be processed when min is "informational"
|
|
552
|
+
self.assertTrue(integration.should_process_finding_by_severity("NONE"))
|
|
553
|
+
|
|
525
554
|
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
526
555
|
def test_should_process_finding_by_severity_critical(self, mock_authenticate, mock_parent_init):
|
|
527
556
|
mock_authenticate.return_value = None
|
|
@@ -687,6 +716,63 @@ class TestWizVulnerabilityIntegration(unittest.TestCase):
|
|
|
687
716
|
asset_id = integration.get_asset_id_from_node(node, WizVulnerabilityType.VULNERABILITY)
|
|
688
717
|
self.assertIsNone(asset_id)
|
|
689
718
|
|
|
719
|
+
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
720
|
+
def test_get_asset_id_with_none_value_returns_none(self, mock_authenticate, mock_parent_init):
|
|
721
|
+
"""Test REG-17981: Handle None value for asset container without AttributeError."""
|
|
722
|
+
from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
|
|
723
|
+
|
|
724
|
+
mock_authenticate.return_value = None
|
|
725
|
+
integration = WizVulnerabilityIntegration(plan_id=self.plan_id)
|
|
726
|
+
node = {"vulnerableAsset": None}
|
|
727
|
+
asset_id = integration.get_asset_id_from_node(node, WizVulnerabilityType.VULNERABILITY)
|
|
728
|
+
self.assertIsNone(asset_id)
|
|
729
|
+
|
|
730
|
+
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
731
|
+
def test_get_asset_id_with_none_resource_returns_none(self, mock_authenticate, mock_parent_init):
|
|
732
|
+
"""Test REG-17981: Handle None value for resource field without AttributeError."""
|
|
733
|
+
from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
|
|
734
|
+
|
|
735
|
+
mock_authenticate.return_value = None
|
|
736
|
+
integration = WizVulnerabilityIntegration(plan_id=self.plan_id)
|
|
737
|
+
node = {"resource": None}
|
|
738
|
+
asset_id = integration.get_asset_id_from_node(node, WizVulnerabilityType.CONFIGURATION)
|
|
739
|
+
self.assertIsNone(asset_id)
|
|
740
|
+
|
|
741
|
+
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
742
|
+
def test_get_asset_id_with_non_dict_value_returns_none(self, mock_authenticate, mock_parent_init):
|
|
743
|
+
"""Test REG-17981: Handle non-dict value for asset container without AttributeError."""
|
|
744
|
+
from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
|
|
745
|
+
|
|
746
|
+
mock_authenticate.return_value = None
|
|
747
|
+
integration = WizVulnerabilityIntegration(plan_id=self.plan_id)
|
|
748
|
+
# Test with a string value instead of dict
|
|
749
|
+
node = {"vulnerableAsset": "not-a-dict"}
|
|
750
|
+
asset_id = integration.get_asset_id_from_node(node, WizVulnerabilityType.VULNERABILITY)
|
|
751
|
+
self.assertIsNone(asset_id)
|
|
752
|
+
|
|
753
|
+
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
754
|
+
def test_get_provider_unique_id_with_none_value_returns_none(self, mock_authenticate, mock_parent_init):
|
|
755
|
+
"""Test REG-17981: Handle None value in get_provider_unique_id_from_node without AttributeError."""
|
|
756
|
+
from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
|
|
757
|
+
|
|
758
|
+
mock_authenticate.return_value = None
|
|
759
|
+
integration = WizVulnerabilityIntegration(plan_id=self.plan_id)
|
|
760
|
+
node = {"vulnerableAsset": None}
|
|
761
|
+
provider_id = integration.get_provider_unique_id_from_node(node, WizVulnerabilityType.VULNERABILITY)
|
|
762
|
+
self.assertIsNone(provider_id)
|
|
763
|
+
|
|
764
|
+
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
765
|
+
def test_get_provider_unique_id_with_non_dict_returns_none(self, mock_authenticate, mock_parent_init):
|
|
766
|
+
"""Test REG-17981: Handle non-dict value in get_provider_unique_id_from_node without AttributeError."""
|
|
767
|
+
from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
|
|
768
|
+
|
|
769
|
+
mock_authenticate.return_value = None
|
|
770
|
+
integration = WizVulnerabilityIntegration(plan_id=self.plan_id)
|
|
771
|
+
# Test with a list value instead of dict
|
|
772
|
+
node = {"vulnerableAsset": ["not", "a", "dict"]}
|
|
773
|
+
provider_id = integration.get_provider_unique_id_from_node(node, WizVulnerabilityType.VULNERABILITY)
|
|
774
|
+
self.assertIsNone(provider_id)
|
|
775
|
+
|
|
690
776
|
@patch("regscale.integrations.commercial.wizv2.scanner.WizVulnerabilityIntegration.authenticate")
|
|
691
777
|
def test_get_provider_unique_id_standard(self, mock_authenticate, mock_parent_init):
|
|
692
778
|
from regscale.integrations.commercial.wizv2.core.constants import WizVulnerabilityType
|