]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Don't allow slashes in Stack or Resource names
authorZane Bitter <zbitter@redhat.com>
Wed, 12 Dec 2012 12:47:33 +0000 (13:47 +0100)
committerZane Bitter <zbitter@redhat.com>
Wed, 12 Dec 2012 14:53:52 +0000 (15:53 +0100)
There is no way for the ReST API to handle Stack or Resource names that
contain slashes since WSGI decodes the path before passing it to the
application, such that even correctly url-encoded slashes are
indistinguishable from path separators. Therefore, prohibit slashes in
Stack and Resource names.

bug 1088928

Change-Id: Ie6fa5a1bc7b5ae7054300419644008c5cc42187e
Signed-off-by: Zane Bitter <zbitter@redhat.com>
heat/engine/parser.py
heat/engine/resource.py
heat/tests/test_engine_service.py

index de415d2153db6d1f6a29527d7e1b891d9695caaa..56cb057a28c9a0f9b685b8f91311674c994a22b7 100644 (file)
@@ -58,6 +58,10 @@ class Stack(object):
         Parameters object. The database ID may also be initialised, if the
         stack is already in the database.
         '''
+
+        if '/' in stack_name:
+            raise ValueError(_('Stack name may not contain "/"'))
+
         self.id = stack_id
         self.context = context
         self.clients = Clients(context)
index c71602bec575aea87840e81476fbaa40107bcad8..cc16e41b637c7884c92165120e12ef4ccdc079bf 100644 (file)
@@ -106,6 +106,9 @@ class Resource(object):
         return ResourceClass(name, json, stack)
 
     def __init__(self, name, json_snippet, stack):
+        if '/' in name:
+            raise ValueError(_('Resource name may not contain "/"'))
+
         self.references = []
         self.stack = stack
         self.context = stack.context
index e2a79a8ff781bb08daa93432c5e2fbb3f80fe2d7..dc9e8402c703cf31daa6ed1689c00d821c8b0741 100644 (file)
@@ -217,6 +217,25 @@ class stackServiceCreateUpdateDeleteTest(unittest.TestCase):
         self.assertEqual(result, {'Description': error})
         self.m.VerifyAll()
 
+    def test_stack_create_invalid_stack_name(self):
+        stack_name = 'service_create/test_stack'
+        stack = get_wordpress_stack('test_stack', self.ctx)
+
+        self.assertRaises(ValueError, self.man.create_stack,
+                                      self.ctx, stack_name,
+                                      stack.t, {}, {})
+
+    def test_stack_create_invalid_resource_name(self):
+        stack_name = 'service_create_test_stack_invalid_res'
+        stack = get_wordpress_stack(stack_name, self.ctx)
+        tmpl = dict(stack.t)
+        tmpl['Resources']['Web/Server'] = tmpl['Resources']['WebServer']
+        del tmpl['Resources']['WebServer']
+
+        self.assertRaises(ValueError, self.man.create_stack,
+                                      self.ctx, stack_name,
+                                      stack.t, {}, {})
+
     def test_stack_delete(self):
         stack_name = 'service_delete_test_stack'
         stack = get_wordpress_stack(stack_name, self.ctx)