From f65ba822682a8ea6939144a77bddef341b997911 Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Fri, 24 Apr 2015 13:29:12 +0200 Subject: [PATCH] Ensure that identity token in header is not an unicode string We need all the headers to be safe strings so they can be joined together and not become an unicode string in doing so. This fixes a bug when creating an image with non-ascii characters in the name. This is required for python 2.6 compatibility. Change-Id: I66ebc27edf4ccd8f903399da58705711c372536d Closes-Bug: 1448080 --- glanceclient/common/http.py | 3 ++- glanceclient/common/utils.py | 3 +-- glanceclient/tests/unit/test_http.py | 8 ++++++++ glanceclient/tests/unit/test_utils.py | 4 +++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/glanceclient/common/http.py b/glanceclient/common/http.py index e8f1d4de..10c680c2 100644 --- a/glanceclient/common/http.py +++ b/glanceclient/common/http.py @@ -135,7 +135,8 @@ class HTTPClient(_BaseHTTPClient): self.session.headers["User-Agent"] = USER_AGENT if self.auth_token: - self.session.headers["X-Auth-Token"] = self.auth_token + self.session.headers["X-Auth-Token"] = encodeutils.safe_encode( + self.auth_token) if self.language_header: self.session.headers["Accept-Language"] = self.language_header diff --git a/glanceclient/common/utils.py b/glanceclient/common/utils.py index 9d584fd0..88144ef8 100644 --- a/glanceclient/common/utils.py +++ b/glanceclient/common/utils.py @@ -449,8 +449,7 @@ def memoized_property(fn): def safe_header(name, value): if value is not None and name in SENSITIVE_HEADERS: - v = value.encode('utf-8') - h = hashlib.sha1(v) + h = hashlib.sha1(value) d = h.hexdigest() return name, "{SHA1}%s" % d else: diff --git a/glanceclient/tests/unit/test_http.py b/glanceclient/tests/unit/test_http.py index f7830b7e..5a0eec70 100644 --- a/glanceclient/tests/unit/test_http.py +++ b/glanceclient/tests/unit/test_http.py @@ -210,6 +210,14 @@ class TestClient(testtools.TestCase): self.assertEqual(b"ni\xc3\xb1o", encoded[b"test"]) self.assertNotIn("none-val", encoded) + def test_auth_token_header_encoding(self): + # Tests that X-Auth-Token header is converted to ascii string, as + # httplib in python 2.6 won't do the conversion + value = u'ni\xf1o' + http_client_object = http.HTTPClient(self.endpoint, token=value) + self.assertEqual(b'ni\xc3\xb1o', + http_client_object.session.headers['X-Auth-Token']) + def test_raw_request(self): """Verify the path being used for HTTP requests reflects accurately.""" headers = {"Content-Type": "text/plain"} diff --git a/glanceclient/tests/unit/test_utils.py b/glanceclient/tests/unit/test_utils.py index 0b2d6d90..d2b73dce 100644 --- a/glanceclient/tests/unit/test_utils.py +++ b/glanceclient/tests/unit/test_utils.py @@ -168,7 +168,9 @@ class TestUtils(testtools.TestCase): utils.safe_header('somekey', None)) for sensitive_header in utils.SENSITIVE_HEADERS: - (name, value) = utils.safe_header(sensitive_header, 'somestring') + (name, value) = utils.safe_header( + sensitive_header, + encodeutils.safe_encode('somestring')) self.assertEqual(sensitive_header, name) self.assertTrue(value.startswith("{SHA1}"))