#1 Accommodate changed pyasn1 behaviour
Merged 6 years ago by cstratak. Opened 6 years ago by cheimes.
rpms/ cheimes/python-ldap pyasn1_fix  into  master

@@ -0,0 +1,168 @@ 

+ From a89bd2361a3971d0dc11908707509bbf5e1fd1ac Mon Sep 17 00:00:00 2001

+ From: Ilya Etingof <etingof@gmail.com>

+ Date: Wed, 11 Oct 2017 20:27:41 +0200

+ Subject: [PATCH] accommodate changed pyasn1 behaviour

+ 

+ pyasn1 versions prior to 0.2.3 indicate absent value by

+ returning `None` object, later pyasn1 versions use

+ the `noValue` sentinel object which is the basis for

+ the `.hasValue()` method call (and .isValue property).

+ 

+ This fix makes the code compatible with both `None` sentinel

+ and the `.hasValue()` test thus making it compatible with all

+ reasonable pyasn1 versions in circulation.

+ ---

+ Index: Lib/ldap/syncrepl.py

+ ===================================================================

+ RCS file: /cvsroot/python-ldap/python-ldap/Lib/ldap/syncrepl.py,v

+ retrieving revision 1.9

+ diff -u -r1.9 syncrepl.py

+ --- Lib/ldap/syncrepl.py	9 Oct 2017 15:09:28 -0000	1.9

+ +++ Lib/ldap/syncrepl.py	7 Nov 2017 13:40:32 -0000

+ @@ -131,11 +131,13 @@

+          d = decoder.decode(encodedControlValue, asn1Spec = syncStateValue())

+          state = d[0].getComponentByName('state')

+          uuid = UUID(bytes=d[0].getComponentByName('entryUUID'))

+ -        self.cookie = d[0].getComponentByName('cookie')

+ +        cookie = d[0].getComponentByName('cookie')

+ +        if cookie is None or not cookie.hasValue():

+ +            self.cookie = None

+ +        else:

+ +            self.cookie = str(self.cookie)

+          self.state = self.__class__.opnames[int(state)]

+          self.entryUUID = str(uuid)

+ -        if self.cookie is not None:

+ -            self.cookie = str(self.cookie)

+  

+  KNOWN_RESPONSE_CONTROLS[SyncStateControl.controlType] = SyncStateControl

+  

+ @@ -165,10 +167,10 @@

+  

+      def decodeControlValue(self, encodedControlValue):

+          d = decoder.decode(encodedControlValue, asn1Spec = syncDoneValue())

+ -        self.cookie = d[0].getComponentByName('cookie')

+ +        cookie = d[0].getComponentByName('cookie')

+ +        if cookie is not None and cookie.hasValue():

+ +            self.cookie = str(cookie)

+          self.refreshDeletes = d[0].getComponentByName('refreshDeletes')

+ -        if self.cookie is not None:

+ -            self.cookie = str(self.cookie)

+          if self.refreshDeletes is not None:

+              self.refreshDeletes = bool(self.refreshDeletes)

+  

+ @@ -263,7 +265,7 @@

+          for attr in [ 'newcookie', 'refreshDelete', 'refreshPresent', 'syncIdSet']:

+              comp = d[0].getComponentByName(attr)

+  

+ -            if comp is not None:

+ +            if comp is not None and comp.hasValue():

+  

+                  if attr == 'newcookie':

+                      self.newcookie = str(comp)

+ @@ -272,7 +274,7 @@

+                  val = dict()

+  

+                  cookie = comp.getComponentByName('cookie')

+ -                if cookie is not None:

+ +                if cookie is not None and cookie.hasValue():

+                      val['cookie'] = str(cookie)

+  

+                  if attr.startswith('refresh'):

+ Index: Lib/ldap/controls/ppolicy.py

+ ===================================================================

+ RCS file: /cvsroot/python-ldap/python-ldap/Lib/ldap/controls/ppolicy.py,v

+ retrieving revision 1.6

+ diff -u -r1.6 ppolicy.py

+ --- Lib/ldap/controls/ppolicy.py	9 Oct 2017 15:09:28 -0000	1.6

+ +++ Lib/ldap/controls/ppolicy.py	7 Nov 2017 13:40:32 -0000

+ @@ -71,7 +71,7 @@

+    def decodeControlValue(self,encodedControlValue):

+      ppolicyValue,_ = decoder.decode(encodedControlValue,asn1Spec=PasswordPolicyResponseValue())

+      warning = ppolicyValue.getComponentByName('warning')

+ -    if warning is None:

+ +    if warning is None or not warning.hasValue():

+        self.timeBeforeExpiration,self.graceAuthNsRemaining = None,None

+      else:

+        timeBeforeExpiration = warning.getComponentByName('timeBeforeExpiration')

+ @@ -85,7 +85,7 @@

+        else:

+          self.graceAuthNsRemaining = None

+      error = ppolicyValue.getComponentByName('error')

+ -    if error is None:

+ +    if error is None or not error.hasValue():

+        self.error = None

+      else:

+        self.error = int(error)

+ Index: Lib/ldap/controls/psearch.py

+ ===================================================================

+ RCS file: /cvsroot/python-ldap/python-ldap/Lib/ldap/controls/psearch.py,v

+ retrieving revision 1.6

+ diff -u -r1.6 psearch.py

+ --- Lib/ldap/controls/psearch.py	9 Oct 2017 15:09:28 -0000	1.6

+ +++ Lib/ldap/controls/psearch.py	7 Nov 2017 13:40:32 -0000

+ @@ -115,18 +115,16 @@

+    def decodeControlValue(self,encodedControlValue):

+      ecncValue,_ = decoder.decode(encodedControlValue,asn1Spec=EntryChangeNotificationValue())

+      self.changeType = int(ecncValue.getComponentByName('changeType'))

+ -    if len(ecncValue)==3:

+ -      self.previousDN = str(ecncValue.getComponentByName('previousDN'))

+ -      self.changeNumber = int(ecncValue.getComponentByName('changeNumber'))

+ -    elif len(ecncValue)==2:

+ -      if self.changeType==8:

+ -        self.previousDN = str(ecncValue.getComponentByName('previousDN'))

+ -        self.changeNumber = None

+ -      else:

+ -        self.previousDN = None

+ -        self.changeNumber = int(ecncValue.getComponentByName('changeNumber'))

+ +    previousDN = ecncValue.getComponentByName('previousDN')

+ +    if previousDN is None or not previousDN.hasValue():

+ +      self.previousDN = None

+      else:

+ -      self.previousDN,self.changeNumber = None,None

+ +      self.previousDN = str(previousDN)

+ +    changeNumber = ecncValue.getComponentByName('changeNumber')

+ +    if changeNumber is None or not changeNumber.hasValue():

+ +      self.changeNumber = None

+ +    else:

+ +      self.changeNumber = int(changeNumber)

+      return (self.changeType,self.previousDN,self.changeNumber)

+  

+  KNOWN_RESPONSE_CONTROLS[EntryChangeNotificationControl.controlType] = EntryChangeNotificationControl

+ Index: Lib/ldap/controls/sss.py

+ ===================================================================

+ RCS file: /cvsroot/python-ldap/python-ldap/Lib/ldap/controls/sss.py,v

+ retrieving revision 1.5

+ diff -u -r1.5 sss.py

+ --- Lib/ldap/controls/sss.py	9 Oct 2017 15:09:28 -0000	1.5

+ +++ Lib/ldap/controls/sss.py	7 Nov 2017 13:40:32 -0000

+ @@ -121,7 +121,9 @@

+          assert not rest, 'all data could not be decoded'

+          self.result = int(p.getComponentByName('sortResult'))

+          self.result_code = p.getComponentByName('sortResult').prettyOut(self.result)

+ -        self.attribute_type_error = p.getComponentByName('attributeType')

+ +        attribute_type_error = p.getComponentByName('attributeType')

+ +        if attribute_type_error is not None and attribute_type_error.hasValue():

+ +            self.attribute_type_error = attribute_type_error

+  

+  

+  KNOWN_RESPONSE_CONTROLS[SSSRequestControl.controlType] = SSSRequestControl

+ Index: Lib/ldap/controls/vlv.py

+ ===================================================================

+ RCS file: /cvsroot/python-ldap/python-ldap/Lib/ldap/controls/vlv.py,v

+ retrieving revision 1.5

+ diff -u -r1.5 vlv.py

+ --- Lib/ldap/controls/vlv.py	9 Oct 2017 15:09:28 -0000	1.5

+ +++ Lib/ldap/controls/vlv.py	7 Nov 2017 13:40:32 -0000

+ @@ -130,8 +130,9 @@

+          self.result = int(p.getComponentByName('virtualListViewResult'))

+          self.result_code = p.getComponentByName('virtualListViewResult') \

+                  .prettyOut(self.result)

+ -        self.context_id = p.getComponentByName('contextID')

+ -        if self.context_id:

+ -            self.context_id = str(self.context_id)

+ +        context_id = p.getComponentByName('contextID')

+ +        if context_id is not None and context_id.hasValue():

+ +            self.context_id = str(context_id)

+ +

+  

+  KNOWN_RESPONSE_CONTROLS[VLVResponseControl.controlType] = VLVResponseControl

file modified
+8 -1
@@ -2,7 +2,7 @@ 

  

  Name: python-ldap

  Version: 2.4.25

- Release: 7%{?dist}

+ Release: 8%{?dist}

  Epoch: 0

  License: Python

  Group: System Environment/Libraries
@@ -13,6 +13,9 @@ 

  ### Patches ###

  # Fedora specific patch

  Patch0: python-ldap-2.4.16-dirs.patch

+ # Fix for pyasn1 >= 0.3

+ # https://github.com/pyldap/pyldap/pull/126

+ Patch1: accommodate-changed-pyasn1-behaviour.patch

  

  ### Dependencies ###

  # LDAP controls, extop, syncrepl require pyasn1
@@ -48,6 +51,7 @@ 

  %prep

  %setup -q -n python-ldap-%{version}

  %patch0 -p1 -b .dirs

+ %patch1 -p0 -b accommodate-changed-pyasn1-behaviour.patch

  

  # clean up cvs hidden files

  rm -rf Demo/Lib/ldap/.cvsignore Demo/.cvsignore Demo/Lib/ldif/.cvsignore Demo/Lib/ldap/async/.cvsignore \
@@ -74,6 +78,9 @@ 

  %{python_sitearch}/python_ldap-%{version}-*.egg-info

  

  %changelog

+ * Tue Nov 07 2017 Christian Heimes <cheimes@redhat.com> - 0:2.4.25-8

+ - Apply fix for pyasn1 >= 0.3

+ 

  * Sat Aug 19 2017 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 0:2.4.25-7

  - Python 2 binary package renamed to python2-ldap

    See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3

pyasn1 versions prior to 0.2.3 indicate absent value by returning None object, later pyasn1 versions use
the noValue sentinel object which is the basis for the .hasValue() method call (and .isValue property).

This fix makes the code compatible with both None sentinel and the .hasValue() test call thus making it
compatible with all reasonable pyasn1 versions in circulation.

Fixes RHBZ#1489184
Original patch by Ilya Etingof etingof@gmail.com

Signed-off-by: Christian Heimes cheimes@redhat.com

Issue is blocking FreeIPA on F27. Upstream fix in WIP. Please add this patch to F27, too. You may also add the previous patch, which corrects package name to python2-ldap.

See https://src.fedoraproject.org/rpms/python-pyldap/pull-request/1 for more details

Pull-Request has been merged by cstratak

6 years ago