backends/ldap: apply force_bytes inside all structured settings (fixes #23698)

This commit is contained in:
Benjamin Dauvergne 2018-07-04 11:38:34 +02:00
parent f2c5b172be
commit 0445badc95
1 changed files with 12 additions and 0 deletions

View File

@ -58,6 +58,15 @@ for bundle_path in CA_BUNDLE_PATHS:
break
def map_bytes(d):
if isinstance(d, six.string_types):
return force_bytes(d)
elif isinstance(d, (list, tuple)):
return d.__class__(map_bytes(x) for x in d)
elif isinstance(d, dict):
return {map_bytes(k): map_bytes(v) for k, v in d.iteritems()}
class LDAPUser(get_user_model()):
SESSION_LDAP_DATA_KEY = 'ldap-data'
_changed = False
@ -1121,6 +1130,9 @@ class LDAPBackend(object):
if not isinstance(cls._DEFAULTS[d], bool) and d in cls._REQUIRED and not block[d]:
raise ImproperlyConfigured(
'LDAP_AUTH_SETTINGS: attribute %r is required but is empty')
# force_bytes all strings in iterable or dict
if isinstance(block[d], (list, tuple, dict)):
block[d] = map_bytes(block[d])
for i in cls._TO_ITERABLE:
if isinstance(block[i], six.string_types):
block[i] = (block[i],)