19692613 problem in SERVICE/KEYSTONE
authordavid.comay@oracle.com
Tue, 30 Sep 2014 13:40:13 -0700
changeset 2123 f6fdb3e3b490
parent 2122 10e05329fee6
child 2124 c9bbad49190b
19692613 problem in SERVICE/KEYSTONE
components/python/keystoneclient/patches/01-CVE-2014-7144.patch
components/python/keystoneclient/resolve.deps
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/python/keystoneclient/patches/01-CVE-2014-7144.patch	Tue Sep 30 13:40:13 2014 -0700
@@ -0,0 +1,98 @@
+This upstream patch addresses CVE-2014-7144 and is tracked under
+Launchpad bug 1353315. It is addressed in keystonemiddleware 1.2.0 and
+python-keystoneclient 0.11.0. It has been modified to apply cleanly
+into our current python-keystoneclient 0.8.0 implementation.
+
+commit 5c9c97f1a5dffe5964e945bf68d009fd68e616fc
+Author: Qin Zhao <[email protected]>
+Date:   Wed Aug 6 15:47:58 2014 +0800
+
+    Fix the condition expression for ssl_insecure
+    
+    In the existing code, self.ssl_insecure is a string. If insecure
+    option is set in nova api-paste.ini, whatever it is 'true' or
+    'false', kwargs['verify'] will become False. This commit corrects
+    the condition expression. This patch is backported from
+    https://review.openstack.org/#/c/113191/
+    
+    Change-Id: I91db8e1cb39c017167a4160079846ac7c0663b03
+    Closes-Bug: 1353315
+
+diff --git a/keystoneclient/middleware/auth_token.py b/keystoneclient/middleware/auth_token.py
+index d2eb29b..b0316dd 100644
+--- python-keystoneclient-0.8.0/keystoneclient/middleware/auth_token.py.~1~	2014-04-16 20:01:14.000000000 -0700
++++ python-keystoneclient-0.8.0/keystoneclient/middleware/auth_token.py	2014-09-25 15:54:35.018360494 -0700
+@@ -369,6 +369,27 @@ def safe_quote(s):
+     return urllib.parse.quote(s) if s == urllib.parse.unquote(s) else s
+ 
+ 
++def _conf_values_type_convert(conf):
++    """Convert conf values into correct type."""
++    if not conf:
++        return {}
++    _opts = {}
++    opt_types = dict((o.dest, o.type) for o in opts)
++    for k, v in six.iteritems(conf):
++        try:
++            if v is None:
++                _opts[k] = v
++            else:
++                _opts[k] = opt_types[k](v)
++        except KeyError:
++            _opts[k] = v
++        except ValueError as e:
++            raise ConfigurationError(
++                'Unable to convert the value of %s option into correct '
++                'type: %s' % (k, e))
++    return _opts
++
++
+ class InvalidUserToken(Exception):
+     pass
+ 
+@@ -404,7 +425,10 @@ class AuthProtocol(object):
+     def __init__(self, app, conf):
+         self.LOG = logging.getLogger(conf.get('log_name', __name__))
+         self.LOG.info('Starting keystone auth_token middleware')
+-        self.conf = conf
++        # NOTE(wanghong): If options are set in paste file, all the option
++        # values passed into conf are string type. So, we should convert the
++        # conf value into correct type.
++        self.conf = _conf_values_type_convert(conf)
+         self.app = app
+ 
+         # delay_auth_decision means we still allow unauthenticated requests
+diff --git a/keystoneclient/tests/test_auth_token_middleware.py b/keystoneclient/tests/test_auth_token_middleware.py
+index 5e1a71f..d794ae3 100644
+--- python-keystoneclient-0.8.0/keystoneclient/tests/test_auth_token_middleware.py.~1~	2014-04-16 20:01:14.000000000 -0700
++++ python-keystoneclient-0.8.0/keystoneclient/tests/test_auth_token_middleware.py	2014-09-25 15:52:13.791997920 -0700
+@@ -484,6 +484,29 @@ class NoMemcacheAuthToken(BaseAuthTokenM
+         self.assertEqual(
+             set([inner_cache, outer_cache]), set(self.middleware._cache_pool))
+ 
++    def test_conf_values_type_convert(self):
++        conf = {
++            'revocation_cache_time': '24',
++            'identity_uri': 'https://keystone.example.com:1234',
++            'include_service_catalog': '0',
++            'nonexsit_option': '0',
++        }
++
++        middleware = auth_token.AuthProtocol(self.fake_app, conf)
++        self.assertEqual(datetime.timedelta(seconds=24),
++                         middleware.token_revocation_list_cache_timeout)
++        self.assertEqual(False, middleware.include_service_catalog)
++        self.assertEqual('https://keystone.example.com:1234',
++                         middleware.identity_uri)
++        self.assertEqual('0', middleware.conf['nonexsit_option'])
++
++    def test_conf_values_type_convert_with_wrong_value(self):
++        conf = {
++            'include_service_catalog': '123',
++        }
++        self.assertRaises(auth_token.ConfigurationError,
++                          auth_token.AuthProtocol, self.fake_app, conf)
++
+ 
+ class CommonAuthTokenMiddlewareTest(object):
+ 
--- a/components/python/keystoneclient/resolve.deps	Tue Sep 30 00:32:37 2014 -0700
+++ b/components/python/keystoneclient/resolve.deps	Tue Sep 30 13:40:13 2014 -0700
@@ -1,3 +1,2 @@
 runtime/python-26
 runtime/python-27
-runtime/python-34