summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiddhi Shah <ridhi.j.shah@gmail.com>2013-08-20 16:41:18 -0500
committerTim Simpson <tim.simpson@rackspace.com>2013-09-09 16:34:30 -0500
commit926a5ea721f9b155ce3d074694075b742d8c3306 (patch)
tree56e4b0dd2204c5f77adab3017db5d0dc4f695e74
parent901b02084f2927e18873eb76fa2aa1fcfde4f5ee (diff)
downloadtrove-926a5ea721f9b155ce3d074694075b742d8c3306.tar.gz
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
-rw-r--r--trove/common/apischema.py2
-rw-r--r--trove/guestagent/manager/mysql_service.py12
-rw-r--r--trove/tests/api/users.py17
-rw-r--r--trove/tests/fakes/guestagent.py4
4 files changed, 25 insertions, 10 deletions
diff --git a/trove/common/apischema.py b/trove/common/apischema.py
index a1165ebb..b658983e 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 8df37f24..0fb98b89 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 2c7868fd..cbdf7a9e 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 c31d1e94..55cfbb11 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: