2014-04-09 2 views
0

Необходимо отправить запрос поиска LDAP с идентификатором сообщения, установленным на 0 (как часть проверки проверки RFC). Попробовал следующий модифицированный код апача примеры каталога API раздела:Отправка запроса LDAP с идентификатором сообщения

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()); 
} 
} 
} 

Приведенный выше код может отправить запрос, но идентификатор сообщения по-прежнему отправляется как не ноль, даже если сделано следующее:

searchRequest.setMessageId(0); 
+0

Почему? Требуется быть ненулевым по [RFC 4511] (http://tools.ietf.org/html/rfc4511#section-4.1.1.1). Десять секунд в Google, чтобы обнаружить это. – EJP

+0

Потому что я выполняю проверку RFC здесь :) – user3308983

+0

Итак, вы обнаружили, что это неверно, и что используемая вами клиентская библиотека знает об этом. У вас есть успех проверки RFC. – EJP

ответ

0

Вам явно придется использовать другую библиотеку или изменить ее или перейти на более низкий уровень. Неудивительно, что эта библиотека не позволяет вам стрелять в ногу.

+0

Изменен вопрос :). Есть ли библиотека, которая может быть использована для отправки такого запроса? – user3308983

+0

Не знаю. Люди высоко ценят SDK UnboundID, но я никогда не использовал его, и я был бы удивлен, если бы это разрешило вам сделать это в любом случае. Существует также библиотека Netscape, теперь размещенная где-то в Mozilla, и нет сомнений, что другие снова. Вам действительно нужно проверить это на поисковые запросы? – EJP

+0

Спасибо EJP. Будет проверять unboundID sdk. Мне действительно нужно проверить все запросы. Начинал с поискового запроса, потому что на сайте Apache был какой-то код :) – user3308983

0

Было какое-то решение в pyasn1-модулях python. Кажется, что работа хорошо работает:

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 :)