Skip to content

Commit 6e9f305

Browse files
authored
Allow to pickle a unbound connection (#588)
1 parent 7af3125 commit 6e9f305

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

Lib/ldap/ldapobject.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,10 @@ def __getstate__(self):
877877
for k,v in self.__dict__.items()
878878
if k not in self.__transient_attrs__
879879
}
880-
state['_last_bind'] = self._last_bind[0].__name__, self._last_bind[1], self._last_bind[2]
880+
if self._last_bind is None:
881+
state['_last_bind'] = None
882+
else:
883+
state['_last_bind'] = self._last_bind[0].__name__, self._last_bind[1], self._last_bind[2]
881884
return state
882885

883886
def __setstate__(self,d):
@@ -888,7 +891,8 @@ def __setstate__(self,d):
888891
else:
889892
d.setdefault('bytes_strictness', 'warn')
890893
self.__dict__.update(d)
891-
self._last_bind = getattr(SimpleLDAPObject, self._last_bind[0]), self._last_bind[1], self._last_bind[2]
894+
if self._last_bind is not None:
895+
self._last_bind = getattr(SimpleLDAPObject, self._last_bind[0]), self._last_bind[1], self._last_bind[2]
892896
self._ldap_object_lock = self._ldap_lock()
893897
self._reconnect_lock = ldap.LDAPLock(desc='reconnect lock within %s' % (repr(self)))
894898
# XXX cannot pickle file, use default trace file

Tests/t_ldapobject.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,12 +617,20 @@ def test103_reconnect_get_state(self):
617617
)
618618

619619
def test104_reconnect_restore(self):
620-
l1 = self.ldap_object_class(self.server.ldap_uri)
620+
l0 = self.ldap_object_class(self.server.ldap_uri)
621+
622+
l0_state = pickle.dumps(l0)
623+
del l0
624+
l1 = pickle.loads(l0_state)
625+
self.assertEqual(l1.whoami_s(), '')
626+
621627
bind_dn = 'cn=user1,'+self.server.suffix
622628
l1.simple_bind_s(bind_dn, 'user1_pw')
629+
623630
self.assertEqual(l1.whoami_s(), 'dn:'+bind_dn)
624631
l1_state = pickle.dumps(l1)
625632
del l1
633+
626634
l2 = pickle.loads(l1_state)
627635
self.assertEqual(l2.whoami_s(), 'dn:'+bind_dn)
628636

0 commit comments

Comments
 (0)