From e2841f1ee5f932ca7b61fed08dba0336ddede03d Mon Sep 17 00:00:00 2001 From: Peter Hamilton Date: Wed, 7 Dec 2016 09:13:38 -0500 Subject: [PATCH] Updating the server to handle errors during attribute lookup This change updates the server to better handle exceptions thrown while looking up the value of different attributes on managed objects. Some managed objects in PyKMIP don't currently support attributes they are supposed to. This can cause lookup errors when using GetAttributes. This change suppresses any exceptions and simply returns None for the missing attribute value. The server unit tests have been updated to account for this change. --- kmip/services/server/engine.py | 11 ++++-- .../tests/unit/services/server/test_engine.py | 39 +++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) 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.