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
This commit is contained in:
Joshua Harlow 2018-07-17 09:24:53 -07:00
parent 2b36107f0b
commit 4e2abfeec4
2 changed files with 18 additions and 5 deletions

View File

@ -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

View File

@ -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 ***'}