mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge pull request #47159 from terminalmage/whitelist_blacklist-iter-fix
Fix for whitelist/blacklist checking for non-list iterables
This commit is contained in:
commit
332e9f13a6
2 changed files with 269 additions and 11 deletions
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
Loading…
Add table
Reference in a new issue