From 9fb933872d27365a30dc07fc55e3233c38c88420 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 20 Dec 2017 12:38:25 +0100 Subject: [PATCH] Show argument name instead of content in LDAPBytesWarning Based on earlier patch by Christian Heimes https://github.com/python-ldap/python-ldap/pull/145 Fixes: https://github.com/python-ldap/python-ldap/issues/132 Fixes: https://github.com/python-ldap/python-ldap/issues/144 --- Lib/ldap/ldapobject.py | 66 +++++++++++++++++++++--------------------- Tests/t_ldapobject.py | 8 ++--- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Lib/ldap/ldapobject.py b/Lib/ldap/ldapobject.py index bc78fb7..f65e09a 100644 --- a/Lib/ldap/ldapobject.py +++ b/Lib/ldap/ldapobject.py @@ -122,7 +122,7 @@ def __init__( # On by default on Py2, off on Py3. self.bytes_mode = bytes_mode - def _bytesify_input(self, value): + def _bytesify_input(self, arg_name, value): """Adapt a value following bytes_mode in Python 2. In Python 3, returns the original value unmodified. @@ -147,9 +147,9 @@ def _bytesify_input(self, value): raise TypeError("All provided fields *must* be bytes when bytes mode is on; got %r" % (value,)) else: _raise_byteswarning( - "Received non-bytes value %r with default (disabled) bytes mode; " + "Received non-bytes value for '{}' with default (disabled) bytes mode; " "please choose an explicit " - "option for bytes_mode on your LDAP connection" % (value,)) + "option for bytes_mode on your LDAP connection".format(arg_name)) return value.encode('utf-8') else: if not isinstance(value, text_type): @@ -157,22 +157,7 @@ def _bytesify_input(self, value): assert not isinstance(value, bytes) return value.encode('utf-8') - def _bytesify_inputs(self, *values): - """Adapt values following bytes_mode. - - Applies _bytesify_input on each arg. - - Usage: - >>> a, b, c = self._bytesify_inputs(a, b, c) - """ - if not PY2: - return values - return ( - self._bytesify_input(value) - for value in values - ) - - def _bytesify_modlist(self, modlist, with_opcode): + def _bytesify_modlist(self, arg_name, modlist, with_opcode): """Adapt a modlist according to bytes_mode. A modlist is a tuple of (op, attr, value), where: @@ -184,12 +169,12 @@ def _bytesify_modlist(self, modlist, with_opcode): return modlist if with_opcode: return tuple( - (op, self._bytesify_input(attr), val) + (op, self._bytesify_input(arg_name, attr), val) for op, attr, val in modlist ) else: return tuple( - (self._bytesify_input(attr), val) + (self._bytesify_input(arg_name, attr), val) for attr, val in modlist ) @@ -398,8 +383,9 @@ def add_ext(self,dn,modlist,serverctrls=None,clientctrls=None): The parameter modlist is similar to the one passed to modify(), except that no operation integer need be included in the tuples. """ - dn = self._bytesify_input(dn) - modlist = self._bytesify_modlist(modlist, with_opcode=False) + if PY2: + dn = self._bytesify_input('dn', dn) + modlist = self._bytesify_modlist('modlist', modlist, with_opcode=False) return self._ldap_call(self._l.add_ext,dn,modlist,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls)) def add_ext_s(self,dn,modlist,serverctrls=None,clientctrls=None): @@ -424,7 +410,9 @@ def simple_bind(self,who='',cred='',serverctrls=None,clientctrls=None): """ simple_bind([who='' [,cred='']]) -> int """ - who, cred = self._bytesify_inputs(who, cred) + if PY2: + who = self._bytesify_input('who', who) + cred = self._bytesify_input('cred', cred) return self._ldap_call(self._l.simple_bind,who,cred,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls)) def simple_bind_s(self,who='',cred='',serverctrls=None,clientctrls=None): @@ -501,7 +489,9 @@ def compare_ext(self,dn,attr,value,serverctrls=None,clientctrls=None): A design bug in the library prevents value from containing nul characters. """ - dn, attr = self._bytesify_inputs(dn, attr) + if PY2: + dn = self._bytesify_input('dn', dn) + attr = self._bytesify_input('attr', attr) return self._ldap_call(self._l.compare_ext,dn,attr,value,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls)) def compare_ext_s(self,dn,attr,value,serverctrls=None,clientctrls=None): @@ -532,7 +522,7 @@ def delete_ext(self,dn,serverctrls=None,clientctrls=None): form returns the message id of the initiated request, and the result can be obtained from a subsequent call to result(). """ - dn = self._bytesify_input(dn) + dn = self._bytesify_input('dn', dn) return self._ldap_call(self._l.delete_ext,dn,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls)) def delete_ext_s(self,dn,serverctrls=None,clientctrls=None): @@ -581,8 +571,9 @@ def modify_ext(self,dn,modlist,serverctrls=None,clientctrls=None): """ modify_ext(dn, modlist[,serverctrls=None[,clientctrls=None]]) -> int """ - dn = self._bytesify_input(dn) - modlist = self._bytesify_modlist(modlist, with_opcode=True) + if PY2: + dn = self._bytesify_input('dn', dn) + modlist = self._bytesify_modlist('modlist', modlist, with_opcode=True) return self._ldap_call(self._l.modify_ext,dn,modlist,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls)) def modify_ext_s(self,dn,modlist,serverctrls=None,clientctrls=None): @@ -636,7 +627,10 @@ def modrdn_s(self,dn,newrdn,delold=1): return self.rename_s(dn,newrdn,None,delold) def passwd(self,user,oldpw,newpw,serverctrls=None,clientctrls=None): - user, oldpw, newpw = self._bytesify_inputs(user, oldpw, newpw) + if PY2: + user = self._bytesify_input('user', user) + oldpw = self._bytesify_input('oldpw', oldpw) + newpw = self._bytesify_input('newpw', newpw) return self._ldap_call(self._l.passwd,user,oldpw,newpw,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls)) def passwd_s(self,user,oldpw,newpw,serverctrls=None,clientctrls=None): @@ -658,7 +652,10 @@ def rename(self,dn,newrdn,newsuperior=None,delold=1,serverctrls=None,clientctrls This actually corresponds to the rename* routines in the LDAP-EXT C API library. """ - dn, newrdn, newsuperior = self._bytesify_inputs(dn, newrdn, newsuperior) + if PY2: + dn = self._bytesify_input('dn', dn) + newrdn = self._bytesify_input('newrdn', newrdn) + newsuperior = self._bytesify_input('newsuperior', newsuperior) return self._ldap_call(self._l.rename,dn,newrdn,newsuperior,delold,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls)) def rename_s(self,dn,newrdn,newsuperior=None,delold=1,serverctrls=None,clientctrls=None): @@ -796,9 +793,12 @@ def search_ext(self,base,scope,filterstr='(objectClass=*)',attrlist=None,attrson The amount of search results retrieved can be limited with the sizelimit parameter if non-zero. """ - base, filterstr = self._bytesify_inputs(base, filterstr) - if attrlist is not None: - attrlist = tuple(self._bytesify_inputs(*attrlist)) + if PY2: + base = self._bytesify_input('base', base) + filterstr = self._bytesify_input('filterstr', filterstr) + if attrlist is not None: + attrlist = tuple(self._bytesify_input('attrlist', a) + for a in attrlist) return self._ldap_call( self._l.search_ext, base,scope,filterstr, diff --git a/Tests/t_ldapobject.py b/Tests/t_ldapobject.py index 62591d7..b51b4cc 100644 --- a/Tests/t_ldapobject.py +++ b/Tests/t_ldapobject.py @@ -348,9 +348,9 @@ def test_ldapbyteswarning(self): self.assertIs(msg.category, ldap.LDAPBytesWarning) self.assertEqual( text_type(msg.message), - "Received non-bytes value u'%s' with default (disabled) bytes " + "Received non-bytes value for 'base' with default (disabled) bytes " "mode; please choose an explicit option for bytes_mode on your " - "LDAP connection" % self.server.suffix + "LDAP connection" ) @contextlib.contextmanager @@ -394,10 +394,10 @@ def _test_byteswarning_level_search(self, methodname): self.assertEqual(len(w), 2, w) self._check_byteswarning( - w[0], u"Received non-bytes value u'(cn=Foo*)'") + w[0], u"Received non-bytes value for 'filterstr'") self._check_byteswarning( - w[1], u"Received non-bytes value u'*'") + w[1], u"Received non-bytes value for 'attrlist'") @unittest.skipUnless(PY2, "no bytes_mode under Py3") def test_byteswarning_level_search(self):