0

メッセージ ID を 0 値に設定して LDAP 検索要求を送信する必要があります (RFC 検証テストの一環として)。Apache ディレクトリ API の例のセクションから次の変更されたコードを試しました。

import java.io.IOException;
import org.apache.directory.api.ldap.model.entry.DefaultEntry;
import org.apache.directory.api.ldap.model.entry.ModificationOperation;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.ldap.client.api.LdapConnection;
import org.apache.directory.ldap.client.api.LdapNetworkConnection;
import org.apache.directory.api.ldap.model.message.SearchRequest;
import org.apache.directory.api.ldap.model.message.SearchRequestImpl;
import org.apache.directory.api.ldap.model.cursor.SearchCursor;
import org.apache.directory.api.ldap.model.exception.LdapNoPermissionException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;

public class ManageLDAPConnection {

private static Dn getSafeSearchBaseDn(String dn) throws LdapInvalidDnException{
     Dn searchBaseDn = null;
     if (dn != null && !dn.isEmpty()){
         searchBaseDn = new Dn(dn);
    }else{
         searchBaseDn = Dn.ROOT_DSE;
    }
    return searchBaseDn;
 }

public static void main (String[] args) {

int messageId = 0;
int port = 389;
String username = "<Admin CN>";
String password = "<Password>";
String hostname = "<IP>";
SearchCursor searchResult = null;
String dn = "<DN>";
String filterExpr = "(objectclass=*)";

org.apache.directory.api.ldap.model.message.SearchScope searchScopeValue = org.apache.directory.api.ldap.model.message.SearchScope.OBJECT;

LdapConnection connection = new LdapNetworkConnection(hostname, port);

try {
    connection.bind(username, password);       
    System.out.println("Connected successfully");
} catch (LdapException e) {
    System.out.println("Unable to bind");
}

try {
    SearchRequest searchRequest = new SearchRequestImpl();
    System.out.println(searchRequest.getMessageId());
    searchRequest.setMessageId(0);
    System.out.println(searchRequest.getMessageId());
        searchRequest.setBase(getSafeSearchBaseDn(dn));
        searchRequest.setFilter(filterExpr);
        searchRequest.setScope(searchScopeValue);
    searchResult = connection.search(searchRequest);
} catch (LdapNoPermissionException e){
    System.out.println("No permission exception");
} catch (LdapException e){
    System.out.println("LDAP Exception: " + e.getMessage());
}
}
}

上記のコードはリクエストを送信できますが、メッセージ ID は次のように実行されてもゼロ以外として送信されます。

searchRequest.setMessageId(0);
4

2 に答える 2

0

明らかに、別のライブラリを使用するか、これを変更するか、より低いレベルに移動する必要があります。このライブラリが自分の足を撃たないようにするのは、まったく驚くべきことではありません。

于 2014-04-09T05:39:34.197 に答える
0

Pythonのpyasn1-modulesにいくつかの解決策がありました。以下はうまくいくようです:

from pyasn1.type import univ, namedval, namedtype, tag
from pyasn1.codec.ber import encoder
                                                                                           import socket
from pyasn1_modules.rfc2251 import *

ldap_bind_request = BindRequest()
ldap_bind_request.setComponentByName('version', 3)
ldap_bind_request.setComponentByName('name', 'cn=admin,o=org')

ldap_auth = AuthenticationChoice()
ldap_auth.setComponentByName('simple', 'mypwd')

ldap_bind_request.setComponentByName('authentication', ldap_auth)

ldap_message = LDAPMessage()

ldap_message.setComponentByName('messageID', 0)
ldap_message.setComponentByName('protocolOp', ldap_bind_request)

print(ldap_bind_request.prettyPrint())

print(dir(ldap_bind_request))

encoded_request = encoder.encode(ldap_message)
print(encoded_request)

asock = socket.socket()

asock.connect(('127.0.0.1', 389))
asock.send(encoded_request)

JAVA ASN.1 Compiler (JAC) という名前のものがあります。Javaで一般的なオブジェクト指向の複雑さを抑えて、似たようなものを提供するかどうかを確認しようとしています:)

于 2014-04-13T03:44:41.510 に答える