Validate key order meta fields.

When using barbican client to list malformed orders, the response
meta dictionary has invalid "request_type" key. Added check to
validate key order meta fields. Added unit test case.

Change-Id: I25c50d252daebe623e2f90e9395d0f77f9589b8d
Closes-Bug: #1596851
This commit is contained in:
Max Abidi
2016-05-23 11:45:37 -07:00
parent 85cddb0e78
commit cf4ec898a0
2 changed files with 40 additions and 1 deletions

View File

@@ -251,6 +251,8 @@ class KeyOrder(Order, KeyOrderFormatter):
KeyOrders can be used to request random key material from Barbican
"""
_type = 'key'
_validMeta = (u'name', u'algorithm', u'mode', u'bit_length', u'expiration',
u'payload_content_type')
def __init__(self, api, name=None, algorithm=None, bit_length=None,
mode=None, expiration=None, payload_content_type=None,
@@ -408,6 +410,16 @@ class OrderManager(base.BaseEntityManager):
response['source_container_ref'] = response['meta'].pop(
'container_ref')
# validate key_order meta fields.
if resp_type == 'key' and (
set(response['meta'].keys()) - set(KeyOrder._validMeta)):
invalidFields = ', '.join(
map(str, set(
response['meta'].keys()) -
set(KeyOrder._validMeta)))
raise TypeError(
'Invalid KeyOrder meta field: [%s]' % invalidFields)
response.update(response.pop('meta'))
if order_type is not None:

View File

@@ -47,6 +47,24 @@ class OrdersTestCase(test_client.BaseEntityResource):
"order_ref": "{1}"
}}""".format(self.secret_ref, self.entity_href)
self.key_order_invalid_data = """{{
"status": "ACTIVE",
"secret_ref": "{0}",
"updated": "2014-10-21T17:15:50.871596",
"meta": {{
"name": "secretname",
"algorithm": "aes",
"request_type":"invalid",
"payload_content_type": "application/octet-stream",
"mode": "cbc",
"bit_length": 256,
"expiration": "2015-02-28T19:14:44.180394"
}},
"created": "2014-10-21T17:15:50.824202",
"type": "key",
"order_ref": "{1}"
}}""".format(self.secret_ref, self.entity_href)
self.manager = self.client.orders
def _get_order_args(self, order_data):
@@ -84,7 +102,6 @@ class WhenTestingKeyOrders(OrdersTestCase):
order_href = order.submit()
self.assertEqual(self.entity_href, order_href)
# Verify that attributes are immutable after store.
attributes = [
"name", "expiration", "algorithm", "bit_length", "mode",
@@ -206,6 +223,16 @@ class WhenTestingOrderManager(OrdersTestCase):
# Verify the correct URL was used to make the call.
self.assertEqual(self.entity_href, self.responses.last_request.url)
def test_should_get_invalid_meta(self):
self.responses.get(self.entity_href, text=self.key_order_invalid_data)
try:
# Verify checking for invalid meta fields.
order = self.manager.get(order_ref=self.entity_href)
self.fail("Didn't raise an TypeError exception")
except TypeError:
pass
def test_should_get_list(self):
data = {"orders": [json.loads(self.key_order_data) for _ in range(3)]}
self.responses.get(self.entity_base, json=data)