Return 404 when a secret does not have a payload
Currently when a Secret payload GET is performed, a 500 Error will be thrown if there is no payload present. The correct behavior would be to throw a 404. Change-Id: Ibbe8a592c853fc0196ae7c2daf365754c800fc87 Partial-Bug: #1561701
This commit is contained in:
parent
d1c370ed6d
commit
d9b5ac8295
|
@ -39,6 +39,11 @@ def _secret_not_found():
|
|||
'another castle.'))
|
||||
|
||||
|
||||
def _secret_payload_not_found():
|
||||
"""Throw exception indicating secret's payload is not found."""
|
||||
pecan.abort(404, u._('Not Found. Sorry but your secret has no payload.'))
|
||||
|
||||
|
||||
def _secret_already_has_data():
|
||||
"""Throw exception that the secret already has data."""
|
||||
pecan.abort(409, u._("Secret already has data, cannot modify it."))
|
||||
|
@ -148,6 +153,11 @@ class SecretController(controllers.ACLMixin):
|
|||
'application/octet-stream')
|
||||
pecan.override_template('', accept_header)
|
||||
|
||||
# check if payload exists before proceeding
|
||||
encrypted = getattr(secret, 'encrypted_data')
|
||||
if not encrypted:
|
||||
_secret_payload_not_found()
|
||||
|
||||
twsk = kwargs.get('trans_wrapped_session_key', None)
|
||||
transport_key = None
|
||||
|
||||
|
@ -178,11 +188,10 @@ class SecretController(controllers.ACLMixin):
|
|||
def payload(self, external_project_id, **kwargs):
|
||||
if pecan.request.method != 'GET':
|
||||
pecan.abort(405)
|
||||
resp = self._on_get_secret_payload(
|
||||
self.secret,
|
||||
external_project_id,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
resp = self._on_get_secret_payload(self.secret,
|
||||
external_project_id,
|
||||
**kwargs)
|
||||
|
||||
LOG.info(u._LI('Retrieved secret payload for project: %s'),
|
||||
external_project_id)
|
||||
|
|
|
@ -368,6 +368,18 @@ class WhenGettingPuttingOrDeletingSecret(utils.BarbicanAPIBaseTestCase):
|
|||
)
|
||||
self.assertEqual(404, get_resp.status_int)
|
||||
|
||||
def test_returns_404_on_get_payload_when_no_payload(self):
|
||||
resp, secret_uuid = create_secret(self.app)
|
||||
headers = {
|
||||
'Accept': 'text/plain',
|
||||
}
|
||||
get_resp = self.app.get(
|
||||
'/secrets/{0}/payload'.format(secret_uuid),
|
||||
headers=headers,
|
||||
expect_errors=True
|
||||
)
|
||||
self.assertEqual(404, get_resp.status_int)
|
||||
|
||||
def test_returns_404_on_get_with_bad_uuid(self):
|
||||
get_resp = self.app.get(
|
||||
'/secrets/98c876d9-aaac-44e4-8ea8-441932962b05X',
|
||||
|
|
|
@ -185,6 +185,21 @@ class SecretsTestCase(base.TestCase):
|
|||
resp = self.behaviors.get_secret_metadata('not_a_uuid')
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
|
||||
@testcase.attr('negative')
|
||||
def test_secret_get_secret_payload_doesnt_exist(self):
|
||||
"""GET a non-existent payload.
|
||||
|
||||
Should return a 404.
|
||||
"""
|
||||
test_model = secret_models.SecretModel(
|
||||
**self.default_secret_create_all_none_data)
|
||||
|
||||
resp, secret_ref = self.behaviors.create_secret(test_model)
|
||||
self.assertEqual(resp.status_code, 201)
|
||||
|
||||
resp = self.behaviors.get_secret(secret_ref, 'text/plain')
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
|
||||
@testcase.attr('positive')
|
||||
def test_secret_get_payload_no_accept_header(self):
|
||||
"""GET a secret payload, do not pass in accept header.
|
||||
|
|
Loading…
Reference in New Issue