summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Shepherd <jshepher@rackspace.com>2012-02-26 22:23:30 -0600
committerBrian Waldon <bcwaldon@gmail.com>2012-02-29 11:41:43 -0800
commitc8b0a9a3be7ca276d91d470a629fdd0209812993 (patch)
tree5a718ab323c408b2ecd3ff211823b089158d568c
parentf38281d60c033b61f30aff2ad05ed4b87d1f6ade (diff)
downloadnova-c8b0a9a3be7ca276d91d470a629fdd0209812993.tar.gz
nova-c8b0a9a3be7ca276d91d470a629fdd0209812993.tar.xz
nova-c8b0a9a3be7ca276d91d470a629fdd0209812993.zip
Ensures that keypair names are only AlphaNumeric.
Throws a 400 error if keypair contains any unsafe characters. Safe characters are '_-', digits, and ascii_leters. Added test_keypair_create_with_non_alphanumeric_name. Fixes bug 937408. Change-Id: If9b1393ee8f36113d2fa8a3b97ca526cc2e6ccf1
-rw-r--r--nova/api/openstack/compute/contrib/keypairs.py10
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_keypairs.py14
2 files changed, 24 insertions, 0 deletions
diff --git a/nova/api/openstack/compute/contrib/keypairs.py b/nova/api/openstack/compute/contrib/keypairs.py
index 0e8a4bb06..5f6f56e15 100644
--- a/nova/api/openstack/compute/contrib/keypairs.py
+++ b/nova/api/openstack/compute/contrib/keypairs.py
@@ -17,6 +17,8 @@
""" Keypair management extension"""
+import string
+
import webob
import webob.exc
@@ -61,6 +63,13 @@ class KeypairController(object):
'public_key': public_key,
'fingerprint': fingerprint}
+ def _validate_keypair_name(self, value):
+ safechars = "_-" + string.digits + string.ascii_letters
+ clean_value = "".join(x for x in value if x in safechars)
+ if clean_value != value:
+ msg = _("Keypair name contains unsafe characters")
+ raise webob.exc.HTTPBadRequest(explanation=msg)
+
@wsgi.serializers(xml=KeypairTemplate)
def create(self, req, body):
"""
@@ -80,6 +89,7 @@ class KeypairController(object):
authorize(context)
params = body['keypair']
name = params['name']
+ self._validate_keypair_name(name)
if not 0 < len(name) < 256:
msg = _('Keypair name must be between 1 and 255 characters long')
diff --git a/nova/tests/api/openstack/compute/contrib/test_keypairs.py b/nova/tests/api/openstack/compute/contrib/test_keypairs.py
index fa04e5efb..7ec5a5d6f 100644
--- a/nova/tests/api/openstack/compute/contrib/test_keypairs.py
+++ b/nova/tests/api/openstack/compute/contrib/test_keypairs.py
@@ -107,6 +107,20 @@ class KeypairsTest(test.TestCase):
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
+ def test_keypair_create_with_non_alphanumeric_name(self):
+ body = {
+ 'keypair': {
+ 'name': 'test/keypair'
+ }
+ }
+ req = webob.Request.blank('/v2/fake/os-keypairs')
+ req.method = 'POST'
+ req.body = json.dumps(body)
+ req.headers['Content-Type'] = 'application/json'
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+ self.assertEqual(res.status_int, 400)
+
def test_keypair_import(self):
body = {
'keypair': {