commit 06f90a4b1226e1bd31208b9958932cf8da25299c Author: Jan Rękorajski <bagg...@pld-linux.org> Date: Tue Jan 7 21:33:35 2014 +0100
- added fixes and updates from various github forks abandon.patch | 133 ++++++++++++++++++++++++++++++++++++ deprecated-exception.patch | 36 ++++++++++ module-typo.patch | 25 +++++++ python-ldaptor.spec | 12 ++++ sasl.patch | 166 +++++++++++++++++++++++++++++++++++++++++++++ starttls-fix.patch | 34 ++++++++++ unicode.patch | 84 +++++++++++++++++++++++ 7 files changed, 490 insertions(+) --- diff --git a/python-ldaptor.spec b/python-ldaptor.spec index 7f6a6dd..544b164 100644 --- a/python-ldaptor.spec +++ b/python-ldaptor.spec @@ -14,6 +14,12 @@ Source0: https://codeload.github.com/antong/ldaptor/tar.gz/%{githash}?/python-ld Source1: global.cfg Patch0: %{name}-remove-webui.patch Patch1: %{name}-doc-paths.patch +Patch2: deprecated-exception.patch +Patch3: module-typo.patch +Patch4: sasl.patch +Patch5: starttls-fix.patch +Patch6: unicode.patch +Patch7: abandon.patch URL: https://github.com/antong/ldaptor BuildRequires: python-distribute BuildRequires: rpm-pythonprov @@ -70,6 +76,12 @@ rm -rf ldaptor/test/web/ rm -f ldaptor/test/test_webui.* %patch0 -p1 %patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 %build %{__python} setup.py build diff --git a/abandon.patch b/abandon.patch new file mode 100644 index 0000000..d3c540d --- /dev/null +++ b/abandon.patch @@ -0,0 +1,133 @@ +From 549f3b2e81735b11aa8c8ce80736772ed9ee36a2 Mon Sep 17 00:00:00 2001 +From: Stefan Andersson <noro...@gmail.com> +Date: Fri, 3 Feb 2012 11:41:26 +0100 +Subject: [PATCH] Add LDAPAbandonRequest Cherry picked + 893b8f9a1dbdb7229849a9bc506bb0fa46491a00 from norox. + +--- + ldaptor/protocols/pureldap.py | 32 ++++++++++++++++++++++++++++++-- + ldaptor/test/test_pureldap.py | 19 +++++++++++++++++++ + 2 files changed, 49 insertions(+), 2 deletions(-) + +diff --git a/ldaptor/protocols/pureldap.py b/ldaptor/protocols/pureldap.py +index 974293d..a332de1 100644 +--- a/ldaptor/protocols/pureldap.py ++++ b/ldaptor/protocols/pureldap.py +@@ -41,6 +41,9 @@ def escape(s): + s = s.replace('\0', r'\00') + return s + ++class LDAPInteger(BERInteger): ++ pass ++ + class LDAPString(BEROctetString): + pass + +@@ -1121,9 +1124,33 @@ class LDAPModifyDNResponse(LDAPResult): + + #class LDAPCompareResponse(LDAPProtocolResponse): + #class LDAPCompareRequest(LDAPProtocolRequest): +-#class LDAPAbandonRequest(LDAPProtocolRequest): +-# needs_answer=0 + ++class LDAPAbandonRequest(LDAPProtocolRequest, LDAPInteger): ++ tag = CLASS_APPLICATION|0x10 ++ needs_answer=0 ++ ++ def __init__(self, value=None, id=None, tag=None): ++ """ ++ Initialize the object ++ ++ l=LDAPAbandonRequest(id=1) ++ """ ++ if id is None and value is not None: ++ id = value ++ LDAPProtocolRequest.__init__(self) ++ LDAPInteger.__init__(self, value=id, tag=tag) ++ ++ def __str__(self): ++ return LDAPInteger.__str__(self) ++ ++ def __repr__(self): ++ if self.tag==self.__class__.tag: ++ return self.__class__.__name__+"(id=%s)" \ ++ %repr(self.value) ++ else: ++ return self.__class__.__name__ \ ++ +"(id=%s, tag=%d)" \ ++ %(repr(self.value), self.tag) + + class LDAPOID(BEROctetString): + pass +@@ -1330,4 +1357,5 @@ class LDAPBERDecoderContext(BERDecoderContext): + LDAPExtendedResponse.tag: LDAPExtendedResponse, + LDAPModifyDNRequest.tag: LDAPModifyDNRequest, + LDAPModifyDNResponse.tag: LDAPModifyDNResponse, ++ LDAPAbandonRequest.tag: LDAPAbandonRequest, + } +diff --git a/ldaptor/test/test_pureldap.py b/ldaptor/test/test_pureldap.py +index 16a6843..869485c 100644 +--- a/ldaptor/test/test_pureldap.py ++++ b/ldaptor/test/test_pureldap.py +@@ -546,6 +546,25 @@ class KnownValues(unittest.TestCase): + + l('foo')) + ), + ++ (pureldap.LDAPExtendedRequest, ++ [], ++ {'requestName': '42.42.42', ++ 'requestValue': None, ++ }, ++ None, ++ [0x40|0x20|23, 1+1+8] ++ + ([0x80|0] ++ + [len('42.42.42')] ++ + l('42.42.42')) ++ ), ++ ++ (pureldap.LDAPAbandonRequest, ++ [], ++ {'id': 3}, ++ None, ++ [0x40|0x10, 0x01, 3] ++ ), ++ + (pureldap.LDAPBindRequest, + [], + {'auth': ('PLAIN', 'test'), +-- +1.8.5.1 + +From 4d5656fc1fd2a7456357eb1e504e08f55c361aba Mon Sep 17 00:00:00 2001 +From: Stefan Andersson <noro...@gmail.com> +Date: Mon, 30 Jan 2012 13:48:41 +0100 +Subject: [PATCH] requestValue is optional according to RFC 2251, make it so. + added unittest and changed assert + +Conflicts: + + ldaptor/protocols/pureldap.py + ldaptor/test/test_pureldap.py +--- + ldaptor/protocols/pureldap.py | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/ldaptor/protocols/pureldap.py b/ldaptor/protocols/pureldap.py +index a332de1..aa16138 100644 +--- a/ldaptor/protocols/pureldap.py ++++ b/ldaptor/protocols/pureldap.py +@@ -1125,6 +1125,11 @@ class LDAPModifyDNResponse(LDAPResult): + #class LDAPCompareResponse(LDAPProtocolResponse): + #class LDAPCompareRequest(LDAPProtocolRequest): + ++class LDAPBERDecoderContext_LDAPAbandonRequest(BERDecoderContext): ++ Identities = { ++ CLASS_CONTEXT|0x50: BEROctetString, ++ } ++ + class LDAPAbandonRequest(LDAPProtocolRequest, LDAPInteger): + tag = CLASS_APPLICATION|0x10 + needs_answer=0 +-- +1.8.5.1 + diff --git a/deprecated-exception.patch b/deprecated-exception.patch new file mode 100644 index 0000000..e829649 --- /dev/null +++ b/deprecated-exception.patch @@ -0,0 +1,36 @@ +From 9ae91b2ba8d7d215e43b98ab37006b2271d20d7c Mon Sep 17 00:00:00 2001 +From: davide colombo <dcolombo@davec.(none)> +Date: Fri, 18 Feb 2011 12:16:51 +0100 +Subject: [PATCH] Fix deprecated exception error + +--- + ldaptor/protocols/ldap/ldaperrors.py | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/ldaptor/protocols/ldap/ldaperrors.py b/ldaptor/protocols/ldap/ldaperrors.py +index ef609a3..b56d688 100644 +--- a/ldaptor/protocols/ldap/ldaperrors.py ++++ b/ldaptor/protocols/ldap/ldaperrors.py +@@ -39,6 +39,11 @@ def __init__(self, msg): + pass + + class LDAPException(Exception, LDAPResult): ++ ++ def _get_message(self): return self.__message ++ def _set_message(self, value): self.__message = value ++ message = property(_get_message, _set_message) ++ + def __init__(self, message=None): + Exception.__init__(self) + self.message=message +@@ -52,7 +57,6 @@ def __str__(self): + else: + return 'Unknown LDAP error %r' % self + +- + class LDAPUnknownError(LDAPException): + resultCode=None + +-- +1.8.5.1 + diff --git a/module-typo.patch b/module-typo.patch new file mode 100644 index 0000000..450501c --- /dev/null +++ b/module-typo.patch @@ -0,0 +1,25 @@ +From 43af9e185728ae3a006cbdea33d41f099f80c45f Mon Sep 17 00:00:00 2001 +From: Edmund Jorgensen <tomh...@gmail.com> +Date: Tue, 22 May 2012 17:17:08 -0400 +Subject: [PATCH] Fix typo in module name: pureldap -> pureber. + +--- + ldaptor/protocols/ldap/ldapserver.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ldaptor/protocols/ldap/ldapserver.py b/ldaptor/protocols/ldap/ldapserver.py +index 38ae55c..1512827 100644 +--- a/ldaptor/protocols/ldap/ldapserver.py ++++ b/ldaptor/protocols/ldap/ldapserver.py +@@ -43,7 +43,7 @@ def dataReceived(self, recd): + while 1: + try: + o, bytes=pureber.berDecodeObject(self.berdecoder, self.buffer) +- except pureldap.BERExceptionInsufficientData: #TODO ++ except pureber.BERExceptionInsufficientData: #TODO + o, bytes=None, 0 + self.buffer = self.buffer[bytes:] + if o is None: +-- +1.8.5.1 + diff --git a/sasl.patch b/sasl.patch new file mode 100644 index 0000000..aa78bbb --- /dev/null +++ b/sasl.patch @@ -0,0 +1,166 @@ +From f7440e50350710c0355f33d766f2ac10df8f5fd6 Mon Sep 17 00:00:00 2001 +From: Adam Goodman <akgood@garglezomper7.local> +Date: Tue, 21 Jun 2011 16:04:22 -0400 +Subject: [PATCH] added very basic, low-level support for SASL credentials in + the pureldap module + +When constructing an LDAPBindRequest, now you can pass 'sasl=True' to +indicate you're providing SASL, rather than plain, credentials. Then, +provide the 'auth' parameter as a tuple of (mechanism, +credentials). For example, if constructing a bind request for an +Active Directory server, you might do something like: + +LDAPBindRequest(dn=..., auth=('GSS-SPNEGO', 'NTLMSSP...'), sasl=True) + +(note that 'NTLMSSP' begins an NTLM Negotiate Message) + +Also, when parsing server responses (e.g. LDAPBindResponse), the +serverSaslCreds field will be populated if appropriate. + +None of this is exposed in the higher-level interfaces +(e.g. LDAPClient) yet. +--- + ldaptor/protocols/pureldap.py | 47 +++++++++++++++++++++++++++++-------------- + ldaptor/test/test_pureldap.py | 9 +++++++++ + 2 files changed, 41 insertions(+), 15 deletions(-) + +diff --git a/ldaptor/protocols/pureldap.py b/ldaptor/protocols/pureldap.py +index 3db3b4c..985fe7f 100644 +--- a/ldaptor/protocols/pureldap.py ++++ b/ldaptor/protocols/pureldap.py +@@ -115,6 +115,7 @@ class LDAPProtocolResponse(LDAPProtocolOp): + class LDAPBERDecoderContext_LDAPBindRequest(BERDecoderContext): + Identities = { + CLASS_CONTEXT|0x00: BEROctetString, ++ CLASS_CONTEXT|0x03: BERSequence, + } + + class LDAPBindRequest(LDAPProtocolRequest, BERSequence): +@@ -125,14 +126,28 @@ def fromBER(klass, tag, content, berdecoder=None): + LDAPBERDecoderContext_LDAPBindRequest( + fallback=berdecoder)) + ++ sasl = False ++ auth = None ++ if isinstance(l[2], BEROctetString): ++ auth = l[2].value ++ elif isinstance(l[2], BERSequence): ++ auth = (l[2][0].value, l[2][1].value) ++ sasl = True ++ + r = klass(version=l[0].value, + dn=l[1].value, +- auth=l[2].value, +- tag=tag) ++ auth=auth, ++ tag=tag, ++ sasl=sasl) + return r + fromBER = classmethod(fromBER) + +- def __init__(self, version=None, dn=None, auth=None, tag=None): ++ def __init__(self, version=None, dn=None, auth=None, tag=None, sasl=False): ++ """Constructor for LDAP Bind Request ++ ++ For sasl=False, pass a string password for 'auth' ++ For sasl=True, pass a tuple of (mechanism, credentials) for 'auth'""" ++ + LDAPProtocolRequest.__init__(self) + BERSequence.__init__(self, [], tag=tag) + self.version=version +@@ -144,12 +159,18 @@ def __init__(self, version=None, dn=None, auth=None, tag=None): + self.auth=auth + if self.auth is None: + self.auth='' ++ assert(not sasl) ++ self.sasl=sasl + + def __str__(self): ++ if not self.sasl: ++ auth_ber = BEROctetString(self.auth, tag=CLASS_CONTEXT|0) ++ else: ++ auth_ber = BERSequence([BEROctetString(self.auth[0]), BEROctetString(self.auth[1])], tag=CLASS_CONTEXT|3) + return str(BERSequence([ + BERInteger(self.version), + BEROctetString(self.dn), +- BEROctetString(self.auth, tag=CLASS_CONTEXT|0), ++ auth_ber, + ], tag=self.tag)) + + def __repr__(self): +@@ -159,10 +180,9 @@ def __repr__(self): + l.append('auth=%s' % repr(self.auth)) + if self.tag!=self.__class__.tag: + l.append('tag=%d' % self.tag) ++ l.append('sasl=%s' % repr(self.sasl)) + return self.__class__.__name__+'('+', '.join(l)+')' + +- +- + class LDAPReferral(BERSequence): + tag = CLASS_CONTEXT | 0x03 + +@@ -242,8 +262,8 @@ def __repr__(self): + l.append('tag=%d' % self.tag) + return self.__class__.__name__+'('+', '.join(l)+')' + +-class LDAPBindResponse_serverSaslCreds(BERSequence): +- tag = CLASS_CONTEXT|0x03 ++class LDAPBindResponse_serverSaslCreds(BEROctetString): ++ tag = CLASS_CONTEXT|0x07 + + pass + +@@ -268,9 +288,8 @@ def fromBER(klass, tag, content, berdecoder=None): + assert 3<=len(l)<=4 + + try: +- if isinstance(l[0], LDAPBindResponse_serverSaslCreds): +- serverSaslCreds=l[0] +- del l[0] ++ if isinstance(l[3], LDAPBindResponse_serverSaslCreds): ++ serverSaslCreds=l[3] + else: + serverSaslCreds=None + except IndexError: +@@ -291,15 +310,13 @@ def fromBER(klass, tag, content, berdecoder=None): + fromBER = classmethod(fromBER) + + def __init__(self, resultCode=None, matchedDN=None, errorMessage=None, referral=None, serverSaslCreds=None, tag=None): +- LDAPResult.__init__(self, resultCode=resultCode, matchedDN=matchedDN, errorMessage=errorMessage, referral=referral, tag=None) +- assert self.serverSaslCreds is None #TODO ++ LDAPResult.__init__(self, resultCode=resultCode, matchedDN=matchedDN, errorMessage=errorMessage, ++ referral=referral, serverSaslCreds=serverSaslCreds, tag=None) + + def __str__(self): +- assert self.serverSaslCreds is None #TODO + return LDAPResult.__str__(self) + + def __repr__(self): +- assert self.serverSaslCreds is None #TODO + return LDAPResult.__repr__(self) + + class LDAPUnbindRequest(LDAPProtocolRequest, BERNull): +diff --git a/ldaptor/test/test_pureldap.py b/ldaptor/test/test_pureldap.py +index 16a6843..2065ba1 100644 +--- a/ldaptor/test/test_pureldap.py ++++ b/ldaptor/test/test_pureldap.py +@@ -546,6 +546,15 @@ class KnownValues(unittest.TestCase): + + l('foo')) + ), + ++ (pureldap.LDAPBindRequest, ++ [], ++ {'auth': ('PLAIN', 'test'), ++ 'sasl': True}, ++ pureldap.LDAPBERDecoderContext( ++ fallback=pureldap.LDAPBERDecoderContext(fallback=pureber.BERDecoderContext()), ++ inherit=pureldap.LDAPBERDecoderContext(fallback=pureber.BERDecoderContext())), ++ [ord(x) for x in str(pureldap.LDAPBindRequest(auth=('PLAIN', 'test'), sasl=True))] ++ ) + ) + + def testToLDAP(self): +-- +1.8.5.1 + diff --git a/starttls-fix.patch b/starttls-fix.patch new file mode 100644 index 0000000..9cfa04c --- /dev/null +++ b/starttls-fix.patch @@ -0,0 +1,34 @@ +From 9c6facce573820987f1ce591f5530e37422fff81 Mon Sep 17 00:00:00 2001 +From: Adam Goodman <akgood@garglezomper7.local> +Date: Tue, 21 Jun 2011 16:09:40 -0400 +Subject: [PATCH] fix starttls support + +a small bug in the LDAPExtendedRequest constructor was making the +LDAPStartTLSRequest constructor fail +--- + ldaptor/protocols/pureldap.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/ldaptor/protocols/pureldap.py b/ldaptor/protocols/pureldap.py +index 985fe7f..ee54829 100644 +--- a/ldaptor/protocols/pureldap.py ++++ b/ldaptor/protocols/pureldap.py +@@ -1180,13 +1180,14 @@ def fromBER(klass, tag, content, berdecoder=None): + return r + fromBER = classmethod(fromBER) + +- def __init__(self, requestName, requestValue=None, ++ def __init__(self, requestName=None, requestValue=None, + tag=None): + LDAPProtocolRequest.__init__(self) + BERSequence.__init__(self, [], tag=tag) + assert requestName is not None + assert isinstance(requestName, basestring) ++ assert requestValue is None or isinstance(requestValue, basestring) + self.requestName=requestName + self.requestValue=requestValue + + def __str__(self): +-- +1.8.5.1 + diff --git a/unicode.patch b/unicode.patch new file mode 100644 index 0000000..fefc7d1 --- /dev/null +++ b/unicode.patch @@ -0,0 +1,84 @@ +From f693f61d6b6a6a53044ad3e5f7a7967bfb95d118 Mon Sep 17 00:00:00 2001 +From: davide colombo <dcolombo@davec.(none)> +Date: Fri, 18 Feb 2011 12:10:41 +0100 +Subject: [PATCH] fix unicode problem with add contact + +--- + ldaptor/protocols/ldap/ldapsyntax.py | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/ldaptor/protocols/ldap/ldapsyntax.py b/ldaptor/protocols/ldap/ldapsyntax.py +index 471ffa6..9204d13 100644 +--- a/ldaptor/protocols/ldap/ldapsyntax.py ++++ b/ldaptor/protocols/ldap/ldapsyntax.py +@@ -7,7 +7,7 @@ + from ldaptor.protocols import pureldap, pureber + from ldaptor.samba import smbpassword + from ldaptor import ldapfilter, interfaces, delta, attributeset, entry +- ++import codecs + class PasswordSetAggregateError(Exception): + """Some of the password plugins failed""" + def __init__(self, errors): +@@ -393,9 +393,10 @@ def addChild(self, rdn, attributes): + ldapAttrType = pureldap.LDAPAttributeDescription(attrType) + l = [] + for value in values: ++ if (isinstance(value, unicode)): ++ value = value.encode('utf-8') + l.append(pureldap.LDAPAttributeValue(value)) + ldapValues = pureber.BERSet(l) +- + ldapAttrs.append((ldapAttrType, ldapValues)) + op=pureldap.LDAPAddRequest(entry=str(dn), + attributes=ldapAttrs) +-- +1.8.5.1 + +From 23518aba9f5b3a9cb994511906ba450b3d3f5618 Mon Sep 17 00:00:00 2001 +From: davide colombo <dcolombo@davec.(none)> +Date: Fri, 18 Feb 2011 12:11:03 +0100 +Subject: [PATCH] fix unicode problem with modify contact + +--- + ldaptor/delta.py | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/ldaptor/delta.py b/ldaptor/delta.py +index 025fec6..68e165d 100644 +--- a/ldaptor/delta.py ++++ b/ldaptor/delta.py +@@ -8,7 +8,7 @@ + from ldaptor import attributeset + from ldaptor.protocols import pureldap, pureber + from ldaptor.protocols.ldap import ldif, distinguishedname +- ++import codecs + class Modification(attributeset.LDAPAttributeSet): + def patch(self, entry): + raise NotImplementedError +@@ -19,10 +19,20 @@ def asLDAP(self): + if self._LDAP_OP is None: + raise NotImplementedError("%s.asLDAP not implemented" + % self.__class__.__name__) ++ tmplist = list(self) ++ newlist = [] ++ for x in range(len(tmplist)): ++ if (isinstance(tmplist[x], unicode)): ++ value = tmplist[x].encode('utf-8') ++ newlist.append(value) ++ else: ++ value = tmplist[x] ++ newlist.append(value) ++ + return str(pureber.BERSequence([ + pureber.BEREnumerated(self._LDAP_OP), + pureber.BERSequence([ pureldap.LDAPAttributeDescription(self.key), +- pureber.BERSet(map(pureldap.LDAPString, list(self))), ++ pureber.BERSet(map(pureldap.LDAPString, newlist)), + ]), + ])) + +-- +1.8.5.1 + ================================================================ ---- gitweb: http://git.pld-linux.org/gitweb.cgi/packages/python-ldaptor.git/commitdiff/06f90a4b1226e1bd31208b9958932cf8da25299c _______________________________________________ pld-cvs-commit mailing list pld-cvs-commit@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit