2011-07-09 5 views
4

私はldaptorを使用してstartTLS経由でLDAPサーバーに接続しようとしています。インターネット上で検索し、自分自身をしようと、私はこのコードのスニペットに到着しました:ldaptorでstartTLSを使用するには?

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がで終了します。私はincriminatedアサーションのためldaptorコードで見てみましたが、思われている

[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__ 
] 

大丈夫。 ldaptorClient startTLSを使用して成功した人はいますか? コードスニペット?

ありがとうございました

さようなら

答えて

2

私はあなたの問題は、私はしばらく前に走った一つであることをかなり確信しています。 ldaptor/protocols/pureldap.pyで、行1144は、LDAPExtendedRequest requestValueが文字列でなければならないと主張します。しかし、RFC 2251によると、その値はオプションであり、特にstartTLS要求には存在してはいけません。

あなたのアプローチは正しいです。これはldaptorの大きなバグです。私が知る限り、著者はTLSなしで単純なバインドを使ってテストしました。 pureldap.pyでその行をコメントアウトする必要があります。ユーザーがldaptorをダウンロードまたは簡単にインストールすることを期待してこれをデプロイする場合は、LDAPExtendedRequestクラスの固定コピーを独自のコードで作成し、実行時にそのコードをサブテーブルに追加する必要があります。

ldaptorを使って数年間プロジェクトを維持しなければならなかったので、可能ならばpython-ldapに切り替えるよう強くお勧めします。 OpenLDAPライブラリをラップするので、特にSSL/SASLを完全にサポートして構築するのがはるかに難しくなります。しかし、それは十分な価値がある、なぜなら、ldaptorには、あなたが遭遇したものだけでなく、さらに多くの問題があるからです。

+0

ご回答いただきありがとうございます。私は既にツイストベースのプロジェクトでpython-ldapを使用しており、ldaptorとの高集積化を望んでいました。私はdeferToThreadをldapの呼び出しごとに好きではなく、原子炉ループ内のpython-ldap呼び出しの非同期バージョンを扱うのは混乱している(私が見つけた唯一の方法は、ldap.callLaterを使用してldapサーバーの結果をポーリングすることでした今では) とにかく、あなたの役に立つ答えをありがとう。 – Ettore

+0

これは2011年にも当てはまるかもしれませんが、2014年にはldaptorにStartTLSを使用することに問題はありませんでした。下の私の答えを見てください。 – Carl

2

https://github.com/twisted/ldaptorからldaptor 0.0.54を使用しても、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() 
関連する問題