From 1d373da3746842b4c09f933896f3b37c4b36cd88 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Fri, 24 May 2019 13:12:13 +0200 Subject: [PATCH] Fix TypeError in compare_s, test and document error behavior Pass ``(ldap_res,)`` tuple to string formatting instead of ``ldap_res``. This changes fixes ``TypeError: not all arguments converted during string formatting``. https://github.com/python-ldap/python-ldap/pull/271 Fixes: https://github.com/python-ldap/python-ldap/issues/270 Signed-off-by: Christian Heimes --- Doc/reference/ldap.rst | 4 +++- Lib/ldap/ldapobject.py | 2 +- Tests/t_ldapobject.py | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Doc/reference/ldap.rst b/Doc/reference/ldap.rst index b13aa6f..69e2462 100644 --- a/Doc/reference/ldap.rst +++ b/Doc/reference/ldap.rst @@ -699,7 +699,9 @@ and wait for and return with the server's result, or with and the value *value*. The synchronous forms returns ``True`` or ``False``. The asynchronous forms returns the message ID of the initiated request, and the result of the asynchronous compare can be obtained using - :py:meth:`result()`. + :py:meth:`result()`. The operation can fail with an exception, e.g. + :py:exc:`ldap.NO_SUCH_OBJECT` when *dn* does not exist or + :py:exc:`ldap.UNDEFINED_TYPE` for an invalid attribute. Note that the asynchronous technique yields the answer by raising the exception objects :py:exc:`ldap.COMPARE_TRUE` or diff --git a/Lib/ldap/ldapobject.py b/Lib/ldap/ldapobject.py index e4e6841..f7443fa 100644 --- a/Lib/ldap/ldapobject.py +++ b/Lib/ldap/ldapobject.py @@ -526,7 +526,7 @@ def compare_ext_s(self,dn,attr,value,serverctrls=None,clientctrls=None): except ldap.COMPARE_FALSE: return False raise ldap.PROTOCOL_ERROR( - 'Compare operation returned wrong result: %r' % (ldap_res) + 'Compare operation returned wrong result: %r' % (ldap_res,) ) def compare(self,dn,attr,value): diff --git a/Tests/t_ldapobject.py b/Tests/t_ldapobject.py index 0619d51..67adeb2 100644 --- a/Tests/t_ldapobject.py +++ b/Tests/t_ldapobject.py @@ -661,6 +661,18 @@ def test_compare_s_false(self): result = l.compare_s('cn=Foo1,%s' % base, 'cn', b'Foo2') self.assertIs(result, False) + def test_compare_s_notfound(self): + base = self.server.suffix + l = self._ldap_conn + with self.assertRaises(ldap.NO_SUCH_OBJECT): + result = l.compare_s('cn=invalid,%s' % base, 'cn', b'Foo2') + + def test_compare_s_invalidattr(self): + base = self.server.suffix + l = self._ldap_conn + with self.assertRaises(ldap.UNDEFINED_TYPE): + result = l.compare_s('cn=Foo1,%s' % base, 'invalidattr', b'invalid') + class Test01_ReconnectLDAPObject(Test00_SimpleLDAPObject): """