Как использовать startTLS с ldaptor? - PullRequest
4 голосов
/ 09 июля 2011

Я пытаюсь использовать ldaptor для подключения через startTLS к серверу LDAP. Ища в интернете и пробуя себя, я прибыл в этот фрагмент кода:

from ldaptor.protocols.ldap import ldapclient, ldapsyntax, ldapconnector, distinguishedname
[...]
def main(base, serviceLocationOverrides):
    c=ldapconnector.LDAPClientCreator(reactor, ldapclient.LDAPClient)
    d = c.connect(base, serviceLocationOverrides)
    d.addCallbacks(lambda proto: proto.startTLS(), error)
    [...]
    d.addErrback(error)
    d.addBoth(lambda dummy: reactor.stop())
    reactor.run()

но код завершается с ошибкой AssertionError:

[Failure instance: Traceback: <type 'exceptions.AssertionError'>: 
/usr/lib/python2.7/dist-packages/twisted/internet/base.py:1167:mainLoop
/usr/lib/python2.7/dist-packages/twisted/internet/base.py:789:runUntilCurrent
/usr/lib/python2.7/dist-packages/twisted/internet/defer.py:361:callback
/usr/lib/python2.7/dist-packages/twisted/internet/defer.py:455:_startRunCallbacks
--- <exception caught here> ---
/usr/lib/python2.7/dist-packages/twisted/internet/defer.py:542:_runCallbacks
/usr/lib/pymodules/python2.7/ldaptor/protocols/ldap/ldapclient.py:239:_startTLS
/usr/lib/pymodules/python2.7/ldaptor/protocols/pureldap.py:1278:__init__
/usr/lib/pymodules/python2.7/ldaptor/protocols/pureldap.py:1144:__init__
]

Я пытался найти в коде ldaptor инкриминируемое утверждение, но, похоже, все в порядке. Есть ли кто-то, кто преуспел в использовании ldaptorClient startTLS? Фрагмент кода?

Большое спасибо

Bye

Ответы [ 2 ]

2 голосов
/ 30 июля 2014

Использование ldaptor 0.0.54 из https://github.com/twisted/ldaptor, У меня не было проблем с использованием StartTLS.

Вот код:

#! /usr/bin/env python


from twisted.internet import reactor, defer
from ldaptor.protocols.ldap import ldapclient, ldapsyntax, ldapconnector

@defer.inlineCallbacks
def example():
    serverip = 'your.server.name.or.ip'
    basedn = 'o=Organization'
    binddn = 'cn=admin,o=Organization'
    bindpw = 'Sekret'
    query = '(uid=jetsong)'
    c = ldapconnector.LDAPClientCreator(reactor, ldapclient.LDAPClient)
    overrides = {basedn: (serverip, 389)}
    client = yield c.connect(basedn, overrides=overrides)
    client = yield client.startTLS()
    yield client.bind(binddn, bindpw)
    o = ldapsyntax.LDAPEntry(client, basedn)
    results = yield o.search(filterText=query)
    for entry in results:
        print entry

if __name__ == '__main__':
    df = example()
    df.addErrback(lambda err: err.printTraceback())
    df.addCallback(lambda _: reactor.stop())
    reactor.run()
2 голосов
/ 20 июля 2011

Я почти уверен, что ваша проблема - одна, с которой я столкнулся некоторое время назад.В ldaptor / protocol / pureldap.py строка 1144 утверждает, что значение LDVExtendedRequest requestValue должно быть строкой.Но согласно RFC 2251 это значение является необязательным и, в частности, НЕ должно присутствовать в запросах startTLS.

Таким образом, ваш подход верен;это просто серьезная ошибка в ldaptor.Насколько я могу судить, автор тестировал только с помощью простого связывания без TLS.Вы должны закомментировать эту строку в pureldap.py.Если вы развертываете это с ожиданием того, что пользователи загрузят или легко установят ldaptor, то вам нужно будет создать фиксированную копию класса LDAPExtendedRequest в своем собственном коде и добавить его во время выполнения.

Будучи вынужденным поддерживать проект с использованием ldaptor в течение нескольких лет, я настоятельно рекомендую вам переключиться на python-ldap, если это возможно.Поскольку он охватывает библиотеки OpenLDAP, его может быть гораздо сложнее собрать, особенно с полной поддержкой SSL / SASL.Но оно того стоит, потому что у ldaptor гораздо больше проблем, чем с той, с которой вы столкнулись.

...