From 3e2d88996c03bf1ed9eef819a4f27c35846787da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Barrois?= Date: Thu, 10 Mar 2016 11:32:18 +0100 Subject: [PATCH] Fix add_ext on Python2 (Closes #15). Under Python2, the code was breaking because add_ext and modify_ext use slightly different notions of a modlist: one expects a tuple of (operation, attribute_name, new_values) and the other a tuple of (attribute_name, new_values). The Py2/Py3 compatibility code didn't check for the latter. --- Lib/ldap/ldapobject.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Lib/ldap/ldapobject.py b/Lib/ldap/ldapobject.py index 9d24fd7..483f042 100644 --- a/Lib/ldap/ldapobject.py +++ b/Lib/ldap/ldapobject.py @@ -151,7 +151,7 @@ class SimpleLDAPObject: for value in values ) - def _unbytesify_modlist(self, modlist): + def _unbytesify_modlist(self, modlist, with_opcode): """Adapt a modlist according to bytes_mode. A modlist is a tuple of (op, attr, value), where: @@ -161,10 +161,16 @@ class SimpleLDAPObject: """ if not PY2: return modlist - return tuple( - (op, self._unbytesify_value(attr), val) - for op, attr, val in modlist - ) + if with_opcode: + return tuple( + (op, self._unbytesify_value(attr), val) + for op, attr, val in modlist + ) + else: + return tuple( + (self._unbytesify_value(attr), val) + for attr, val in modlist + ) def _bytesify_value(self, value): """Adapt a returned value according to bytes_mode. @@ -340,7 +346,7 @@ class SimpleLDAPObject: except that no operation integer need be included in the tuples. """ dn = self._unbytesify_value(dn) - modlist = self._unbytesify_modlist(modlist) + modlist = self._unbytesify_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): @@ -524,7 +530,7 @@ class SimpleLDAPObject: modify_ext(dn, modlist[,serverctrls=None[,clientctrls=None]]) -> int """ dn = self._unbytesify_value(dn) - modlist = self._unbytesify_modlist(modlist) + modlist = self._unbytesify_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):