diff --git a/kmip/services/server/engine.py b/kmip/services/server/engine.py index f62d24a..490217c 100644 --- a/kmip/services/server/engine.py +++ b/kmip/services/server/engine.py @@ -649,10 +649,13 @@ class KmipEngine(object): attribute_name, object_type ): - attribute_value = self._get_attribute_from_managed_object( - managed_object, - attribute_name - ) + try: + attribute_value = self._get_attribute_from_managed_object( + managed_object, + attribute_name + ) + except Exception: + attribute_value = None if attribute_value is not None: if self._attribute_policy.is_attribute_multivalued( diff --git a/kmip/tests/unit/services/server/test_engine.py b/kmip/tests/unit/services/server/test_engine.py index 0957eec..0f16279 100644 --- a/kmip/tests/unit/services/server/test_engine.py +++ b/kmip/tests/unit/services/server/test_engine.py @@ -1417,6 +1417,45 @@ class TestKmipEngine(testtools.TestCase): ) self.assertIn(attribute, result) + def test_get_attributes_from_managed_object_with_missing_attribute(self): + """ + Test that any exceptions are suppressed when attempting to retrieve + non-existent attributes from managed objects. + """ + e = engine.KmipEngine() + e._data_store = self.engine + e._data_store_session_factory = self.session_factory + e._data_session = e._data_store_session_factory() + e._logger = mock.MagicMock() + + symmetric_key = pie_objects.SymmetricKey( + enums.CryptographicAlgorithm.AES, + 0, + b'', + masks=[enums.CryptographicUsageMask.ENCRYPT, + enums.CryptographicUsageMask.DECRYPT] + ) + symmetric_key.names = ['Name 1', 'Name 2'] + + e._data_session.add(symmetric_key) + e._data_session.commit() + e._data_session = e._data_store_session_factory() + + e._get_attribute_from_managed_object = mock.Mock() + e._get_attribute_from_managed_object.side_effect = Exception + + result = e._get_attributes_from_managed_object( + symmetric_key, + ['Unique Identifier', + 'Name', + 'Cryptographic Algorithm', + 'Cryptographic Length', + 'Cryptographic Usage Mask', + 'invalid'] + ) + + self.assertEqual(0, len(result)) + def test_get_attribute_from_managed_object(self): """ Test that an attribute can be retrieved from a given managed object.