首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建"sequence of sequence“ldap.controls.RequestControl对象

创建"sequence of sequence“ldap.controls.RequestControl对象
EN

Stack Overflow用户
提问于 2013-06-28 04:36:38
回答 1查看 721关注 0票数 1

我使用python-ldap搜索ActiveDirectory,就好像它是任何常规的LDAP服务器一样。它的工作,SSL,身份验证和一切。

现在我想使用具有旧1.2.840.113556.1.4.473server side sort request control defined in RFC 2891

Python-ldap不支持开箱即用的控件,所以我必须自己创建它。我这样做了:

代码语言:javascript
复制
server_side_sort = ldap.controls.RequestControl('1.2.840.113556.1.4.473', True) 

但是我不知道如何计算the BER-encoded ASN.1 control valueencodedControlValue参数。

我看到pyasn1有很多部分可以与之相比,比如univ.SequenceOfuniv.Sequenceuniv.Boolean。看着RFC2251 module of pyasn1,我想出了这个:

代码语言:javascript
复制
class LDAPString(univ.OctetString): pass

class AttributeDescription(LDAPString): pass

class MatchingRuleId(LDAPString): pass

class ServerSideSortOnName(univ.Sequence):
    componentType = namedtype.NamedTypes(
        namedtype.NamedType('attributeDesc', AttributeDescription('name')), 
        namedtype.NamedType('reverseOrder', univ.Boolean(False)) )

class ServerSideSortControl(univ.SequenceOf):
     componentType = ServerSideSortOnName()

sss = ServerSideSortControl()

serversidesort = ldap.controls.RequestControl('1.2.840.113556.1.4.473',True,sss)

名字可能没有索引,我知道。我认为它可以帮助调试与base64 value shown on this MSDN snippet相匹配。

但是,当我将这个控件(它甚至可能无效)添加到ldap.search_ext时,我得到错误TypeError: ('expected a string', ServerSideSortControl())

如何使用pyasn1或类似方法在python-ldap ldap.search_ext可以接受的属性name上创建服务器端排序控制值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-04 14:55:42

您必须将univ.Sequence嵌套在univ.SequenceOf中,并实现返回服务器期望的误码率编码控制的encodeControlValue

代码语言:javascript
复制
class SSSRequest(univ.SequenceOf):
    componentType = univ.Sequence()

class SSSRequestSequence(univ.Sequence):
    componentType = namedtype.NamedTypes(
        namedtype.NamedType('attributeType', univ.OctetString()),
    )

class SSS_CONTROL_REQUEST(LDAPControl):
    def __init__(self,controlType,criticality,controlValue=None,encodedControlValue=None):
        LDAPControl.__init__(self,controlType,criticality,controlValue,encodedControlValue)

    def encodeControlValue(self):
        sss = SSSRequest()

        for k in self.controlValue:
            Skey = SSSRequestSequence()
            Skey.setComponentByName('attributeType', k)
            sss.setComponentByPosition(0, Skey)
        return encoder.encode(sss)

    def decodeControlValue(self,encodedValue):
        sssr = decoder.decode(encodedValue)[0]
        rsp = SSSResponse()
        for n, v in enumerate(sssr):
            try:
                rsp.setComponentByPosition(n, int(v))
            except Exception, e:
                print str(e)
        if rsp.success:
            return True
        return rsp.error

if __name__ == '__main__':
    SSSREQUEST_OID = '1.2.840.113556.1.4.473'
    sss = SSS_CONTROL_REQUEST(SSSREQUEST_OID, False, ['cn'])
    srv = ldap.open('localhost')
    srv.simple_bind_s()
    id = srv.search_ext('ou=people,dc=example,dc=com', ldap.SCOPE_SUBTREE, filterstr='(objectClass=user)', serverctrls=[sss])
    print srv.result3(id)

实现逆序排序留作练习;)

代码已经在Windows Server200864位R2上运行的AD-LDS实例上成功测试(但您必须将绑定设置为非匿名)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17352682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档