From 4e2abfeec4ef6fa9d7830b56a49091dec489a376 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Tue, 17 Jul 2018 09:24:53 -0700 Subject: [PATCH] Handle non-string keys appropriately In python dict keys can be anything that is hashable; which includes non-strings such as ints. Currently the code is blowing up with these types of keys with exceptions like: TypeError: argument of type 'int' is not iterable So to fix that handle the case where non-string keys are found. Change-Id: I4f576a089df6f68e43572bf0eee15e99f2b557fe --- oslo_utils/strutils.py | 16 +++++++++++----- oslo_utils/tests/test_strutils.py | 7 +++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/oslo_utils/strutils.py b/oslo_utils/strutils.py index ae4d00db..8eaa73d1 100644 --- a/oslo_utils/strutils.py +++ b/oslo_utils/strutils.py @@ -361,15 +361,21 @@ def mask_dict_password(dictionary, secret="***"): # nosec continue # NOTE(jlvillal): Check to see if anything in the dictionary 'key' # contains any key specified in _SANITIZE_KEYS. - for sani_key in _SANITIZE_KEYS: - if sani_key in k: - out[k] = secret - break - else: + k_matched = False + if isinstance(k, six.string_types): + for sani_key in _SANITIZE_KEYS: + if sani_key in k: + out[k] = secret + k_matched = True + break + if not k_matched: # We did not find a match for the key name in the # _SANITIZE_KEYS, so we fall through to here if isinstance(v, six.string_types): out[k] = mask_password(v, secret=secret) + else: + # Just leave it alone. + out[k] = v return out diff --git a/oslo_utils/tests/test_strutils.py b/oslo_utils/tests/test_strutils.py index 0560d080..41007ccd 100644 --- a/oslo_utils/tests/test_strutils.py +++ b/oslo_utils/tests/test_strutils.py @@ -634,6 +634,13 @@ class MaskDictionaryPasswordTestCase(test_base.BaseTestCase): self.assertEqual(expected, strutils.mask_dict_password(payload)) + def test_do_an_int(self): + payload = {} + payload[1] = 2 + expected = payload.copy() + self.assertEqual(expected, + strutils.mask_dict_password(payload)) + def test_mask_values(self): payload = {'somekey': 'test = cmd --password my\xe9\x80\x80pass'} expected = {'somekey': 'test = cmd --password ***'}