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.

Files changed (53) hide show
  1. regscale/_version.py +1 -1
  2. regscale/core/app/application.py +1 -0
  3. regscale/core/app/internal/control_editor.py +73 -21
  4. regscale/core/app/internal/login.py +4 -1
  5. regscale/core/app/internal/model_editor.py +219 -64
  6. regscale/core/app/utils/app_utils.py +41 -7
  7. regscale/core/login.py +21 -4
  8. regscale/core/utils/date.py +77 -1
  9. regscale/integrations/commercial/aws/scanner.py +7 -3
  10. regscale/integrations/commercial/microsoft_defender/defender_api.py +1 -1
  11. regscale/integrations/commercial/sicura/api.py +65 -29
  12. regscale/integrations/commercial/sicura/scanner.py +36 -7
  13. regscale/integrations/commercial/synqly/query_builder.py +4 -1
  14. regscale/integrations/commercial/tenablev2/commands.py +4 -4
  15. regscale/integrations/commercial/tenablev2/scanner.py +1 -2
  16. regscale/integrations/commercial/wizv2/scanner.py +40 -16
  17. regscale/integrations/control_matcher.py +78 -23
  18. regscale/integrations/public/cci_importer.py +400 -9
  19. regscale/integrations/public/csam/csam.py +572 -763
  20. regscale/integrations/public/csam/csam_agency_defined.py +179 -0
  21. regscale/integrations/public/csam/csam_common.py +154 -0
  22. regscale/integrations/public/csam/csam_controls.py +432 -0
  23. regscale/integrations/public/csam/csam_poam.py +124 -0
  24. regscale/integrations/public/fedramp/click.py +17 -4
  25. regscale/integrations/public/fedramp/fedramp_cis_crm.py +271 -62
  26. regscale/integrations/public/fedramp/poam/scanner.py +74 -7
  27. regscale/integrations/scanner_integration.py +16 -1
  28. regscale/models/integration_models/aqua.py +2 -2
  29. regscale/models/integration_models/cisa_kev_data.json +121 -18
  30. regscale/models/integration_models/flat_file_importer/__init__.py +4 -6
  31. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  32. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +35 -2
  33. regscale/models/integration_models/synqly_models/ocsf_mapper.py +41 -12
  34. regscale/models/platform.py +3 -0
  35. regscale/models/regscale_models/__init__.py +5 -0
  36. regscale/models/regscale_models/component.py +1 -1
  37. regscale/models/regscale_models/control_implementation.py +55 -24
  38. regscale/models/regscale_models/organization.py +3 -0
  39. regscale/models/regscale_models/regscale_model.py +17 -5
  40. regscale/models/regscale_models/security_plan.py +1 -0
  41. regscale/regscale.py +11 -1
  42. {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/METADATA +1 -1
  43. {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/RECORD +53 -49
  44. tests/regscale/core/test_login.py +171 -4
  45. tests/regscale/integrations/commercial/test_sicura.py +0 -1
  46. tests/regscale/integrations/commercial/wizv2/test_wizv2.py +86 -0
  47. tests/regscale/integrations/public/test_cci.py +596 -1
  48. tests/regscale/integrations/test_control_matcher.py +24 -0
  49. tests/regscale/models/test_control_implementation.py +118 -3
  50. {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/LICENSE +0 -0
  51. {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/WHEEL +0 -0
  52. {regscale_cli-6.27.1.0.dist-info → regscale_cli-6.27.3.0.dist-info}/entry_points.txt +0 -0
  53. {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