From 4594c44aae197756de4135b6fe6efa39a9a04084 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Wed, 12 Dec 2012 12:06:56 +0100 Subject: [PATCH] Don't allow identifiers with slashes Ensure that creating an Identifier with a slash in either the stack name or the resource name results in an immediate exception. Change-Id: I79121a26009b5b7b3eee994f98ba802b239f5f12 Signed-off-by: Zane Bitter --- heat/common/identifier.py | 5 +++++ heat/tests/test_identifier.py | 32 ++++++++++++++++++++------------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/heat/common/identifier.py b/heat/common/identifier.py index bd339eea..9739ee50 100644 --- a/heat/common/identifier.py +++ b/heat/common/identifier.py @@ -36,6 +36,9 @@ class HeatIdentifier(collections.Mapping): if path and not path.startswith('/'): path = '/' + path + if '/' in stack_name: + raise ValueError('Stack name may not contain "/"') + self.identity = { self.TENANT: tenant, self.STACK_NAME: stack_name, @@ -163,6 +166,8 @@ class ResourceIdentifier(HeatIdentifier): the owning stack and the resource name. ''' if resource_name is not None: + if '/' in resource_name: + raise ValueError('Resource name may not contain "/"') path = '/'.join([path.rstrip('/'), 'resources', resource_name]) super(ResourceIdentifier, self).__init__(tenant, stack_name, diff --git a/heat/tests/test_identifier.py b/heat/tests/test_identifier.py index 3a951c6a..30469ba3 100644 --- a/heat/tests/test_identifier.py +++ b/heat/tests/test_identifier.py @@ -194,7 +194,7 @@ class IdentifierTest(unittest.TestCase): identifier.HeatIdentifier.from_arn_url, url) def test_arn_url_parse_badurl_host(self): - url = 'htt:///foo/arn%3Aopenstack%3Aheat%3A%3At%3Asticks/s/i/p' + url = 'http:///foo/arn%3Aopenstack%3Aheat%3A%3At%3Asticks/s/i/p' self.assertRaises(ValueError, identifier.HeatIdentifier.from_arn_url, url) @@ -240,10 +240,10 @@ class IdentifierTest(unittest.TestCase): self.assertEqual(hi.arn(), 'arn:openstack:heat::%3A%2F:stacks/s/i') def test_name_escape(self): - hi = identifier.HeatIdentifier('t', ':/', 'i') - self.assertEqual(hi.stack_name, ':/') - self.assertEqual(hi.url_path(), 't/stacks/%3A%2F/i') - self.assertEqual(hi.arn(), 'arn:openstack:heat::t:stacks/%3A%2F/i') + hi = identifier.HeatIdentifier('t', ':%', 'i') + self.assertEqual(hi.stack_name, ':%') + self.assertEqual(hi.url_path(), 't/stacks/%3A%25/i') + self.assertEqual(hi.arn(), 'arn:openstack:heat::t:stacks/%3A%25/i') def test_id_escape(self): hi = identifier.HeatIdentifier('t', 's', ':/') @@ -269,15 +269,15 @@ class IdentifierTest(unittest.TestCase): self.assertEqual(hi.tenant, ':/') def test_name_decode(self): - arn = 'arn:openstack:heat::t:stacks/%3A%2F/i' + arn = 'arn:openstack:heat::t:stacks/%3A%25/i' hi = identifier.HeatIdentifier.from_arn(arn) - self.assertEqual(hi.stack_name, ':/') + self.assertEqual(hi.stack_name, ':%') def test_url_name_decode(self): - enc_arn = 'arn%3Aopenstack%3Aheat%3A%3At%3Astacks%2F%253A%252F%2Fi' + enc_arn = 'arn%3Aopenstack%3Aheat%3A%3At%3Astacks%2F%253A%2525%2Fi' url = self.url_prefix + enc_arn hi = identifier.HeatIdentifier.from_arn_url(url) - self.assertEqual(hi.stack_name, ':/') + self.assertEqual(hi.stack_name, ':%') def test_id_decode(self): arn = 'arn:openstack:heat::t:stacks/s/%3A%2F' @@ -302,7 +302,7 @@ class IdentifierTest(unittest.TestCase): self.assertEqual(hi.path, '/:/') def test_arn_escape_decode_round_trip(self): - hii = identifier.HeatIdentifier(':/', ':/', ':/', ':/') + hii = identifier.HeatIdentifier(':/', ':%', ':/', ':/') hio = identifier.HeatIdentifier.from_arn(hii.arn()) self.assertEqual(hio.tenant, hii.tenant) self.assertEqual(hio.stack_name, hii.stack_name) @@ -310,13 +310,13 @@ class IdentifierTest(unittest.TestCase): self.assertEqual(hio.path, hii.path) def test_arn_decode_escape_round_trip(self): - arn = 'arn:openstack:heat::%3A%2F:stacks/%3A%2F/%3A%2F/%3A/' + arn = 'arn:openstack:heat::%3A%2F:stacks/%3A%25/%3A%2F/%3A/' hi = identifier.HeatIdentifier.from_arn(arn) self.assertEqual(hi.arn(), arn) def test_arn_url_decode_escape_round_trip(self): enc_arn = "".join(['arn%3Aopenstack%3Aheat%3A%3A%253A%252F%3A', - 'stacks%2F%253A%252F%2F%253A%252F%2F%253A']) + 'stacks%2F%253A%2525%2F%253A%252F%2F%253A']) url = self.url_prefix + enc_arn hi = identifier.HeatIdentifier.from_arn_url(url) print "SHDEBUG hi.arn()=%s" % hi.arn() @@ -324,6 +324,10 @@ class IdentifierTest(unittest.TestCase): hi.arn_url_path()) self.assertEqual(hi, hi2) + def test_stack_name_slash(self): + self.assertRaises(ValueError, identifier.HeatIdentifier, + 't', 's/s', 'i', 'p') + def test_equal(self): hi1 = identifier.HeatIdentifier('t', 's', 'i', 'p') hi2 = identifier.HeatIdentifier('t', 's', 'i', 'p') @@ -385,6 +389,10 @@ class ResourceIdentifierTest(unittest.TestCase): ri = identifier.ResourceIdentifier('t', 's', 'i', '', 'r') self.assertEqual(ri.resource_name, 'r') + def test_resource_name_slash(self): + self.assertRaises(ValueError, identifier.ResourceIdentifier, + 't', 's', 'i', 'p', 'r/r') + @attr(tag=['unit', 'identifier']) @attr(speed='fast') -- 2.45.2