Merge pull request #47159 from terminalmage/whitelist_blacklist-iter-fix

Fix for whitelist/blacklist checking for non-list iterables
This commit is contained in:
Nicole Thomas 2018-05-08 16:43:50 -04:00 committed by GitHub
commit 332e9f13a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 269 additions and 11 deletions

View file

@ -361,23 +361,46 @@ def check_whitelist_blacklist(value, whitelist=None, blacklist=None):
in the blacklist, then the whitelist is checked. If the value isn't
found in the whitelist, the function returns ``False``.
'''
if blacklist is not None:
if not isinstance(blacklist, list):
# Normalize the input so that we have a list
if blacklist:
if isinstance(blacklist, six.string_types):
blacklist = [blacklist]
for expr in blacklist:
if expr_match(value, expr):
return False
if not hasattr(blacklist, '__iter__'):
raise TypeError(
'Expecting iterable blacklist, but got {0} ({1})'.format(
type(blacklist).__name__, blacklist
)
)
else:
blacklist = []
if whitelist:
if not isinstance(whitelist, list):
if isinstance(whitelist, six.string_types):
whitelist = [whitelist]
for expr in whitelist:
if expr_match(value, expr):
return True
if not hasattr(whitelist, '__iter__'):
raise TypeError(
'Expecting iterable whitelist, but got {0} ({1})'.format(
type(whitelist).__name__, whitelist
)
)
else:
return True
whitelist = []
return False
_blacklist_match = any(expr_match(value, expr) for expr in blacklist)
_whitelist_match = any(expr_match(value, expr) for expr in whitelist)
if blacklist and not whitelist:
# Blacklist but no whitelist
return not _blacklist_match
elif whitelist and not blacklist:
# Whitelist but no blacklist
return _whitelist_match
elif blacklist and whitelist:
# Both whitelist and blacklist
return not _blacklist_match and _whitelist_match
else:
# No blacklist or whitelist passed
return True
def check_include_exclude(path_str, include_pat=None, exclude_pat=None):

View file

@ -204,3 +204,238 @@ class StringutilsTestCase(TestCase):
self.assertTrue(salt.utils.stringutils.expr_match(val, 'foo/*/baz'))
# Glob non-match
self.assertFalse(salt.utils.stringutils.expr_match(val, 'foo/*/bar'))
def test_check_whitelist_blacklist(self):
'''
Ensure that whitelist matching works on both PY2 and PY3
'''
whitelist = ['one/two/three', r'web[0-9]']
blacklist = ['four/five/six', r'web[5-9]']
# Tests with string whitelist/blacklist
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web_one',
whitelist=whitelist[1],
blacklist=None,
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web_one',
whitelist=whitelist[1],
blacklist=[],
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web1',
whitelist=whitelist[1],
blacklist=None,
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web1',
whitelist=whitelist[1],
blacklist=[],
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=None,
blacklist=blacklist[1],
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=[],
blacklist=blacklist[1],
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web_five',
whitelist=None,
blacklist=blacklist[1],
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web_five',
whitelist=[],
blacklist=blacklist[1],
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=whitelist[1],
blacklist=blacklist[1],
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web4',
whitelist=whitelist[1],
blacklist=blacklist[1],
)
)
# Tests with list whitelist/blacklist
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web_one',
whitelist=whitelist,
blacklist=None,
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web_one',
whitelist=whitelist,
blacklist=[],
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web1',
whitelist=whitelist,
blacklist=None,
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web1',
whitelist=whitelist,
blacklist=[],
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=None,
blacklist=blacklist,
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=[],
blacklist=blacklist,
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web_five',
whitelist=None,
blacklist=blacklist,
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web_five',
whitelist=[],
blacklist=blacklist,
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=whitelist,
blacklist=blacklist,
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web4',
whitelist=whitelist,
blacklist=blacklist,
)
)
# Tests with set whitelist/blacklist
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web_one',
whitelist=set(whitelist),
blacklist=None,
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web_one',
whitelist=set(whitelist),
blacklist=set(),
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web1',
whitelist=set(whitelist),
blacklist=None,
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web1',
whitelist=set(whitelist),
blacklist=set(),
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=None,
blacklist=set(blacklist),
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=set(),
blacklist=set(blacklist),
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web_five',
whitelist=None,
blacklist=set(blacklist),
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web_five',
whitelist=set(),
blacklist=set(blacklist),
)
)
self.assertFalse(
salt.utils.stringutils.check_whitelist_blacklist(
'web5',
whitelist=set(whitelist),
blacklist=set(blacklist),
)
)
self.assertTrue(
salt.utils.stringutils.check_whitelist_blacklist(
'web4',
whitelist=set(whitelist),
blacklist=set(blacklist),
)
)
# Test with invalid type for whitelist/blacklist
self.assertRaises(
TypeError,
salt.utils.stringutils.check_whitelist_blacklist,
'foo', whitelist=123
)
self.assertRaises(
TypeError,
salt.utils.stringutils.check_whitelist_blacklist,
'foo', blacklist=123
)