Open
Description
Issue description:
When using ReconnectLDAPObject, if a server disconnects after a connection is created, it fails with an ldap.TIMEOUT which is unhandled.
ldap.TIMEOUT is properly caught only during the initial connection, whereas in _apply_method_s which is applied to synchronous methods, ReconnectLDAPObject only catches the ldap.SERVER_DOWN exception.
Steps to reproduce:
To reproduce the issue, I created the following script to test. I created an interface with the additional 192.168.1.100 address, which I remove after initializing the ReconnectLDAPObject and binding.
import ldap
#from ldappool import StateConnector as Connector
#from ldap.ldapobject import SimpleLDAPObject as Connector
from ldap.ldapobject import ReconnectLDAPObject as Connector
from time import sleep
ldap.set_option(ldap.OPT_NETWORK_TIMEOUT, 10)
c = Connector('ldap://192.168.1.100,ldap://localhost')
c.network_timeout = 10
c.timeout = 10
c.simple_bind_s()
print('sleeping...')
sleep(30) # now remove the 192.168.1.100 IP address from the interface
print('awoke')
result = c.search_s(
'ou=Users,dc=openstack,dc=org',
1,
'(&(objectClass=inetOrgPerson)(uid=*))',
['mail', 'userPassword', 'description', 'enabled', 'uid', 'cn'],
0
)
print(result)
Traceback (most recent call last):
File "/home/ubuntu/devstack/test.py", line 18, in <module>
result = c.search_s(
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 631, in search_s
return self.search_ext_s(base,scope,filterstr,attrlist,attrsonly,None,None,timeout=self.timeout)
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 1030, in search_ext_s
return self._apply_method_s(SimpleLDAPObject.search_ext_s,*args,**kwargs)
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 968, in _apply_method_s
return func(self,*args,**kwargs)
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 625, in search_ext_s
return self.result(msgid,all=1,timeout=timeout)[1]
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 535, in result
resp_type, resp_data, resp_msgid = self.result2(msgid,all,timeout)
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 539, in result2
resp_type, resp_data, resp_msgid, resp_ctrls = self.result3(msgid,all,timeout)
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 543, in result3
resp_type, resp_data, resp_msgid, decoded_resp_ctrls, retoid, retval = self.result4(
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 553, in result4
ldap_result = self._ldap_call(self._l.result4,msgid,all,timeout,add_ctrls,add_intermediates,add_extop)
File "/usr/local/lib/python3.9/dist-packages/ldap/ldapobject.py", line 128, in _ldap_call
result = func(*args,**kwargs)
ldap.TIMEOUT
Operating system:
GNU Linux Ubuntu 21.04
Python version:
Python 3.9.5
python-ldap version:
3.4.0
Metadata
Metadata
Assignees
Labels
No labels