From 926a5ea721f9b155ce3d074694075b742d8c3306 Mon Sep 17 00:00:00 2001 From: Riddhi Shah Date: Tue, 20 Aug 2013 16:41:18 -0500 Subject: [PATCH] Modify User Attributes API - Fix This fix does not allow empty host strings in the update user call. Besides, it also enusres that database access is not lost during an update of the host attribute Change-Id: I57b7733c264d2bcd70dfea95f85aae68553c4dff Fixes: bug #1214166 Fixes: bug #1214555 --- trove/common/apischema.py | 2 +- trove/guestagent/manager/mysql_service.py | 12 +++++------- trove/tests/api/users.py | 17 +++++++++++++++++ trove/tests/fakes/guestagent.py | 4 ++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/trove/common/apischema.py b/trove/common/apischema.py index a1165ebb1d..b658983e06 100644 --- a/trove/common/apischema.py +++ b/trove/common/apischema.py @@ -57,7 +57,7 @@ non_empty_string = { host_string = { "type": "string", - "minLength": 0, + "minLength": 1, "pattern": "^[%]?[\w(-).]*[%]?$" } diff --git a/trove/guestagent/manager/mysql_service.py b/trove/guestagent/manager/mysql_service.py index 8df37f2436..0fb98b893e 100644 --- a/trove/guestagent/manager/mysql_service.py +++ b/trove/guestagent/manager/mysql_service.py @@ -345,13 +345,11 @@ class MySqlAdmin(object): new_host=user_attrs.get('host')) t = text(str(uu)) client.execute(t) - if user_attrs.get('name') is not None: - if user_attrs['name'] not in grantee: - if user_attrs.get('host') is None: - host = user.host - else: - host = user_attrs.get('host') - self.grant_access(user_attrs['name'], host, db_access) + uname = user_attrs.get('name') or username + host = user_attrs.get('host') or hostname + find_user = "'%s'@'%s'" % (uname, host) + if find_user not in grantee: + self.grant_access(uname, host, db_access) def create_database(self, databases): """Create the list of specified databases""" diff --git a/trove/tests/api/users.py b/trove/tests/api/users.py index 2c7868fdca..cbdf7a9eb2 100644 --- a/trove/tests/api/users.py +++ b/trove/tests/api/users.py @@ -276,6 +276,23 @@ class TestUsers(object): self.dbaas.users.update_attributes, instance_info.id, "root", user_new) + @test() + def test_updateuser_emptyhost(self): + # Cannot update the user hostname with an empty string + users = [] + username = "testuser1" + hostname = "192.168.0.1" + users.append({"name": username, "password": "password", + "host": hostname, "databases": []}) + self.dbaas.users.create(instance_info.id, users) + user_new = {"host": ""} + hostname = hostname.replace('.', '%2e') + assert_raises(exceptions.BadRequest, + self.dbaas.users.update_attributes, instance_info.id, + username, user_new, hostname) + assert_equal(400, self.dbaas.last_http_code) + self.dbaas.users.delete(instance_info.id, username, hostname=hostname) + @test(depends_on=[test_create_users]) def test_hostname_ipv4_restriction(self): # By default, user hostnames are required to be % or IPv4 addresses. diff --git a/trove/tests/fakes/guestagent.py b/trove/tests/fakes/guestagent.py index c31d1e94be..55cfbb1122 100644 --- a/trove/tests/fakes/guestagent.py +++ b/trove/tests/fakes/guestagent.py @@ -106,13 +106,13 @@ class FakeGuest(object): self._create_user({ "_name": name, "_host": host, - "_password": self.users[(name, host)]['password'], + "_password": self.users[(old_name, host)]['_password'], "_databases": [], }) self.grants[(name, host)] = old_grants del self.users[(old_name, old_host)] if new_password: - self.users[(name, host)]['password'] = new_password + self.users[(name, host)]['_password'] = new_password def create_database(self, databases): for db in databases: