blob: fb55a95fb94edf26e163fa8b12707c98a40d9879 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.shared.ldap.codec.search;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.directory.junit.tools.Concurrent;
import org.apache.directory.junit.tools.ConcurrentJunitRunner;
import org.apache.directory.shared.asn1.DecoderException;
import org.apache.directory.shared.asn1.EncoderException;
import org.apache.directory.shared.asn1.ber.Asn1Decoder;
import org.apache.directory.shared.asn1.ber.Asn1Container;
import org.apache.directory.shared.asn1.ber.tlv.TLVStateEnum;
import org.apache.directory.shared.ldap.codec.AttributeValueAssertion;
import org.apache.directory.shared.ldap.codec.LdapMessageContainer;
import org.apache.directory.shared.ldap.codec.ResponseCarryingException;
import org.apache.directory.shared.ldap.codec.search.controls.subentries.SubentriesControl;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.filter.SearchScope;
import org.apache.directory.shared.ldap.message.AliasDerefMode;
import org.apache.directory.shared.ldap.codec.message.LdapEncoder;
import org.apache.directory.shared.ldap.message.Message;
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
import org.apache.directory.shared.ldap.message.SearchRequest;
import org.apache.directory.shared.ldap.codec.message.SearchRequestImpl;
import org.apache.directory.shared.ldap.codec.message.SearchResultDoneImpl;
import org.apache.directory.shared.ldap.message.control.Control;
import org.apache.directory.shared.ldap.schema.normalizers.DeepTrimToLowerNormalizer;
import org.apache.directory.shared.ldap.schema.normalizers.OidNormalizer;
import org.apache.directory.shared.util.Strings;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* A test case for SearchRequest messages
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@RunWith(ConcurrentJunitRunner.class)
@Concurrent()
public class SearchRequestTest
{
/** The encoder instance */
LdapEncoder encoder = new org.apache.directory.shared.ldap.codec.message.LdapEncoder();
static Map<String, OidNormalizer> oids = new HashMap<String, OidNormalizer>();
@Before
public void setUp() throws Exception
{
// DC normalizer
OidNormalizer dcOidNormalizer = new OidNormalizer( "dc", new DeepTrimToLowerNormalizer(
SchemaConstants.DOMAIN_COMPONENT_AT_OID ) );
oids.put( "dc", dcOidNormalizer );
oids.put( "domaincomponent", dcOidNormalizer );
oids.put( "0.9.2342.19200300.100.1.25", dcOidNormalizer );
// OU normalizer
OidNormalizer ouOidNormalizer = new OidNormalizer( "ou", new DeepTrimToLowerNormalizer(
SchemaConstants.OU_AT_OID ) );
oids.put( "ou", ouOidNormalizer );
oids.put( "organizationalUnitName", ouOidNormalizer );
oids.put( "2.5.4.11", ouOidNormalizer );
// ObjectClass normalizer
OidNormalizer objectClassOidNormalizer = new OidNormalizer( "objectClass", new DeepTrimToLowerNormalizer(
SchemaConstants.OBJECT_CLASS_AT_OID ) );
oids.put( "objectclass", objectClassOidNormalizer );
oids.put( "2.5.4.0", objectClassOidNormalizer );
}
/**
* Test the decoding of a SearchRequest with no controls. The search filter
* is : (&(|(objectclass=top)(ou=contacts))(!(objectclass=ttt)))
*/
@Test
public void testDecodeSearchRequestGlobalNoControls()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x90 );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81,
( byte ) 0x8D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x87, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 1000, searchRequest.getSizeLimit() );
assertEquals( 1000, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (& (...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
// (& (| (...
assertEquals( 2, andFilters.size() );
OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
assertNotNull( orFilter );
// (& (| (obectclass=top) (...
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "top", assertion.getAssertionValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (...
equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "ou", assertion.getAttributeDesc() );
assertEquals( "contacts", assertion.getAssertionValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (! ...
NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
assertNotNull( notFilter );
// (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
equalityMatch = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "ttt", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x90, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x81 ), decodedPdu.substring( 0, 0x81 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with no controls. Test the various
* types of filter : >=, <=, ~= The search filter is :
* (&(|(objectclass~=top)(ou<=contacts))(!(objectclass>=ttt)))
*/
@Test
public void testDecodeSearchRequestCompareFiltersNoControls()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x90 );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81,
( byte ) 0x8D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x87, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA8, 0x12, // approxMatch [8]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString),
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x04, 0x03, // attributeDesc AttributeDescription (LDAPString),
't', 'o', 'p', ( byte ) 0xA6, 0x0E, // lessOrEqual [3] AttributeValueAssertion,
0x04, 0x02, // AttributeValueAssertion ::= SEQUENCE {
'o', 'u', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x08, // assertionValue AssertionValue (OCTET STRING) }
'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA5, 0x12, // greaterOrEqual [5] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString),
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x04, 0x03, 't', 't', 't', // assertionValue AssertionValue (OCTET STRING) }
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 1000, searchRequest.getSizeLimit() );
assertEquals( 1000, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (& (...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
// (& (| (...
assertEquals( 2, andFilters.size() );
OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
assertNotNull( orFilter );
// (& (| (objectclass~=top) (...
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
AttributeValueAssertionFilter approxMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
assertNotNull( approxMatch );
AttributeValueAssertion assertion = approxMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "top", assertion.getAssertionValue().getString() );
// (& (| (objectclass~=top) (ou<=contacts) ) (...
AttributeValueAssertionFilter lessOrEqual = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
assertNotNull( lessOrEqual );
assertion = lessOrEqual.getAssertion();
assertNotNull( assertion );
assertEquals( "ou", assertion.getAttributeDesc() );
assertEquals( "contacts", assertion.getAssertionValue().getString() );
// (& (| (objectclass~=top) (ou<=contacts) ) (! ...
NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
assertNotNull( notFilter );
// (& (| (objectclass~=top) (ou<=contacts) ) (! (objectclass>=ttt) ) )
AttributeValueAssertionFilter greaterOrEqual = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
assertNotNull( greaterOrEqual );
assertion = greaterOrEqual.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "ttt", assertion.getAssertionValue().getString() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x0090, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x81 ), decodedPdu.substring( 0, 0x81 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with no controls. Test the present
* filter : =* The search filter is :
* (&(|(objectclass=*)(ou=*))(!(objectclass>=ttt)))
*/
@Test
public void testDecodeSearchRequestPresentNoControls()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x7B );
stream.put( new byte[]
{ 0x30,
0x79, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
0x74, // CHOICE { ..., searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
// ENUMERATED
// {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
// sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8,
// timeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
// BOOLEAN,
// (TRUE)
// filter Filter,
( byte ) 0xA0, 0x29, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x11, // or [1] SET of Filter,
( byte ) 0x87, 0x0B, // present [7] AttributeDescription,
// AttributeDescription ::= LDAPString
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
( byte ) 0x87, 0x02, 'o', 'u', // present [7]
// AttributeDescription,
// AttributeDescription ::= LDAPString
( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA5, 0x12, // greaterOrEqual [5]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
// ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
// ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
// LDAPString
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 1000, searchRequest.getSizeLimit() );
assertEquals( 1000, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (& (...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
// (& (| (...
assertEquals( 2, andFilters.size() );
OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
assertNotNull( orFilter );
// (& (| (objectclass=*) (...
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
PresentFilter presentFilter = ( PresentFilter ) orFilters.get( 0 );
assertNotNull( presentFilter );
assertEquals( "objectclass", presentFilter.getAttributeDescription() );
// (& (| (objectclass=*) (ou=*) ) (...
presentFilter = ( PresentFilter ) orFilters.get( 1 );
assertNotNull( presentFilter );
assertEquals( "ou", presentFilter.getAttributeDescription() );
// (& (| (objectclass=*) (ou=*) ) (! ...
NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
assertNotNull( notFilter );
// (& (| (objectclass=*) (ou=*) ) (! (objectclass>=ttt) ) )
AttributeValueAssertionFilter greaterOrEqual = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
assertNotNull( greaterOrEqual );
AttributeValueAssertion assertion = greaterOrEqual.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "ttt", assertion.getAssertionValue().getString() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x7B, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x6C ), decodedPdu.substring( 0, 0x6C ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with no attributes. The search
* filter is : (objectclass=*)
*/
@Test
public void testDecodeSearchRequestNoAttributes()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x40 );
stream.put( new byte[]
{ 0x30,
0x37, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x03, // messageID MessageID
0x63,
0x32, // CHOICE { ..., searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x12, // baseObject LDAPDN,
'o', 'u', '=', 'u', 's', 'e', 'r', 's', ',', 'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm', 0x0A, 0x01,
0x00, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
// sizeLimit INTEGER (0 .. maxInt), (infinite)
0x02, 0x01, 0x00,
// timeLimit INTEGER (0 .. maxInt), (infinite)
0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0x00, // typesOnly
// BOOLEAN,
// (FALSE)
// filter Filter,
// Filter ::= CHOICE {
( byte ) 0x87, 0x0B, // present [7] AttributeDescription,
'o', 'b', 'j', 'e', 'c', 't', 'C', 'l', 'a', 's', 's',
// attributes AttributeDescriptionList }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x00, 0x00, // Some trailing 00, useless.
0x00, 0x00, 0x00, 0x00 } );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 3, searchRequest.getMessageId() );
assertEquals( "ou=users,ou=system", searchRequest.getBase().toString() );
assertEquals( SearchScope.OBJECT, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
// (objectClass = *)
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
PresentFilter presentFilter = ( PresentFilter ) filter;
assertNotNull( presentFilter );
assertEquals( "objectClass", presentFilter.getAttributeDescription() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x39, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu, decodedPdu.substring( 0, decodedPdu.length() - 35 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with an empty attribute. The search
* filter is : (objectclass=*)
*/
@Test
public void testDecodeSearchRequestOneEmptyAttribute()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x3F );
stream.put( new byte[]
{ 0x30,
0x3D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x03, // messageID MessageID
0x63,
0x38, // CHOICE { ..., searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x12, // baseObject LDAPDN,
'o', 'u', '=', 'u', 's', 'e', 'r', 's', ',', 'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm', 0x0A, 0x01,
0x00, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
// sizeLimit INTEGER (0 .. maxInt), (infinite)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (infinite)
0x02, 0x01, 0x00, 0x01, 0x01, 0x00, // typesOnly
// BOOLEAN,
// (FALSE)
// filter Filter,
// Filter ::= CHOICE {
( byte ) 0x87, 0x0B, // present [7] AttributeDescription,
'o', 'b', 'j', 'e', 'c', 't', 'C', 'l', 'a', 's', 's',
// attributes AttributeDescriptionList }
0x30, 0x06, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x02, // Request for sn
's', 'n', 0x04, 0x00 // Empty attribute
} );
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 3, searchRequest.getMessageId() );
assertEquals( "ou=users,ou=system", searchRequest.getBase().toString() );
assertEquals( SearchScope.OBJECT, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
// (objectClass = *)
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
PresentFilter presentFilter = ( PresentFilter ) filter;
assertNotNull( presentFilter );
assertEquals( "objectClass", presentFilter.getAttributeDescription() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
assertEquals( 1, attributes.size() );
}
/**
* Test the decoding of a SearchRequest with a star and an attribute. The search
* filter is : (objectclass=*)
*/
@Test
public void testDecodeSearchRequestWithStarAndAttr()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x40 );
stream.put( new byte[]
{ 0x30,
0x3E, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x03, // messageID MessageID
0x63,
0x39, // CHOICE { ..., searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x12, // baseObject LDAPDN,
'o', 'u', '=', 'u', 's', 'e', 'r', 's', ',', 'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm', 0x0A, 0x01,
0x00, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
// sizeLimit INTEGER (0 .. maxInt), (infinite)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (infinite)
0x02, 0x01, 0x00, 0x01, 0x01, 0x00, // typesOnly
// BOOLEAN,
// (FALSE)
// filter Filter,
// Filter ::= CHOICE {
( byte ) 0x87, 0x0B, // present [7] AttributeDescription,
'o', 'b', 'j', 'e', 'c', 't', 'C', 'l', 'a', 's', 's',
// attributes AttributeDescriptionList }
0x30, 0x07, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x02, // Request for sn
's', 'n', 0x04, 0x01, '*' // * attribute
} );
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 3, searchRequest.getMessageId() );
assertEquals( "ou=users,ou=system", searchRequest.getBase().toString() );
assertEquals( SearchScope.OBJECT, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
// (objectClass = *)
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
PresentFilter presentFilter = ( PresentFilter ) filter;
assertNotNull( presentFilter );
assertEquals( "objectClass", presentFilter.getAttributeDescription() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
assertEquals( 2, attributes.size() );
Set<String> expectedAttrs = new HashSet<String>();
expectedAttrs.add( "sn" );
expectedAttrs.add( "*" );
for ( String attribute : attributes )
{
assertTrue( expectedAttrs.contains( attribute ) );
expectedAttrs.remove( attribute );
}
assertEquals( 0, expectedAttrs.size() );
}
/**
* Tests an search request decode with a simple equality match filter.
*/
@Test
public void testDecodeSearchRequestOrFilters()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x96 );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81, ( byte ) 0x93, 0x02, 0x01,
0x21,
0x63,
( byte ) 0x81,
( byte ) 0x8D, // "dc=example,dc=com"
0x04, 0x11, 'd', 'c', '=', 'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A,
0x01, 0x00, 0x0A, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03, 0x01, 0x01,
( byte ) 0xFF,
( byte ) 0xA1,
0x52, // ( |
( byte ) 0xA3,
0x10, // ( uid=akarasulu )
0x04, 0x03, 'u', 'i', 'd', 0x04, 0x09, 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u',
( byte ) 0xA3,
0x09, // ( cn=aok )
0x04, 0x02, 'c', 'n', 0x04, 0x03, 'a', 'o', 'k', ( byte ) 0xA3,
0x15, // ( ou=Human Resources )
0x04, 0x02, 'o', 'u', 0x04, 0x0F, 'H', 'u', 'm', 'a', 'n', ' ', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
's', ( byte ) 0xA3, 0x10, 0x04, 0x01, 'l', // (l=Santa Clara )
0x04, 0x0B, 'S', 'a', 'n', 't', 'a', ' ', 'C', 'l', 'a', 'r', 'a', ( byte ) 0xA3, 0x0A, // ( cn=abok ))
0x04, 0x02, 'c', 'n', 0x04, 0x04, 'a', 'b', 'o', 'k', 0x30, 0x15, // Attributes
0x04, 0x05, 'a', 't', 't', 'r', '0', // attr0
0x04, 0x05, 'a', 't', 't', 'r', '1', // attr1
0x04, 0x05, 'a', 't', 't', 'r', '2' // attr2
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 33, searchRequest.getMessageId() );
assertEquals( "dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.OBJECT, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_FINDING_BASE_OBJ, searchRequest.getDerefAliases() );
assertEquals( 2, searchRequest.getSizeLimit() );
assertEquals( 3, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (objectclass=t*)
OrFilter orFilter = ( OrFilter ) ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
assertNotNull( orFilter );
assertEquals( 5, orFilter.getFilterSet().size() );
// uid=akarasulu
AttributeValueAssertion assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 0 ) )
.getAssertion();
assertEquals( "uid", assertion.getAttributeDesc() );
assertEquals( "akarasulu", assertion.getAssertionValue().getString() );
// cn=aok
assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 1 ) ).getAssertion();
assertEquals( "cn", assertion.getAttributeDesc() );
assertEquals( "aok", assertion.getAssertionValue().getString() );
// ou = Human Resources
assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 2 ) ).getAssertion();
assertEquals( "ou", assertion.getAttributeDesc() );
assertEquals( "Human Resources", assertion.getAssertionValue().getString() );
// l=Santa Clara
assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 3 ) ).getAssertion();
assertEquals( "l", assertion.getAttributeDesc() );
assertEquals( "Santa Clara", assertion.getAssertionValue().getString() );
// cn=abok
assertion = ( ( AttributeValueAssertionFilter ) orFilter.getOrFilter().get( 4 ) ).getAssertion();
assertEquals( "cn", assertion.getAttributeDesc() );
assertEquals( "abok", assertion.getAssertionValue().getString() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x0096, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x87 ), decodedPdu.substring( 0, 0x87 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with controls.
*/
@Ignore("failing when ran using maven")
@Test
public void testDecodeSearchRequestWithControls()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x7f,
0x02,
0x01,
0x04, // messageID
0x63,
0x33,
0x04,
0x13, // baseObject
'd', 'c', '=', 'm', 'y', '-', 'd', 'o', 'm', 'a', 'i', 'n', ',', 'd', 'c', '=', 'c', 'o', 'm',
0x0a,
0x01,
0x02, // scope: subtree
0x0a,
0x01,
0x03, // derefAliases: derefAlways
0x02,
0x01,
0x00, // sizeLimit: 0
0x02,
0x01,
0x00, // timeLimit: 0
0x01,
0x01,
0x00, // typesOnly: false
( byte ) 0x87,
0x0b, // Present filter: (objectClass=*)
'o', 'b', 'j', 'e', 'c', 't', 'C', 'l', 'a', 's', 's',
0x30,
0x00, // Attributes = '*'
( byte ) 0xa0,
0x45, // controls
0x30, 0x28,
0x04,
0x16, // control
'1', '.', '2', '.', '8', '4', '0', '.', '1', '1', '3', '5', '5', '6', '.', '1', '.', '4', '.', '3',
'1', '9', 0x01, 0x01,
( byte ) 0xff, // criticality: false
0x04, 0x0b, 0x30, 0x09, 0x02, 0x01, 0x02, 0x04, 0x04, 0x47, 0x00, 0x00,
0x00, // value: pageSize=2
0x30, 0x19, 0x04,
0x17, // control
'2', '.', '1', '6', '.', '8', '4', '0', '.', '1', '.', '1', '1', '3', '7', '3', '0', '.', '3', '.',
'4', '.', '2', };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 4, searchRequest.getMessageId() );
assertEquals( 2, searchRequest.getControls().size() );
// this is a constant in Java 5 API
String pagedResultsControlOID = "1.2.840.113556.1.4.319";
Control pagedResultsControl = searchRequest.getControl( pagedResultsControlOID );
assertEquals( pagedResultsControlOID, pagedResultsControl.getOid() );
assertTrue( pagedResultsControl.isCritical() );
// this is a constant in Java 5 API
String manageReferralControlOID = "2.16.840.1.113730.3.4.2";
Control manageReferralControl = searchRequest.getControl( manageReferralControlOID );
assertEquals( manageReferralControlOID, manageReferralControl.getOid() );
assertEquals( "dc=my-domain,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.SUBTREE, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
assertTrue( filter instanceof PresentFilter );
assertEquals( "objectClass", ( ( PresentFilter ) filter ).getAttributeDescription() );
// Check the encoding
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x81, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( decodedPdu, encodedPdu );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with no controls but with oid
* attributes. The search filter is :
* (&(|(objectclass=top)(2.5.4.11=contacts))(!(organizationalUnitName=ttt)))
*/
@Test
public void testDecodeSearchRequestGlobalNoControlsOidAndAlias()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0xA1 );
stream.put( new byte[]
{
0x30,
( byte ) 0x81,
( byte ) 0x9E, // LDAPMessage ::=SEQUENCE {
0x02,
0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x98, // CHOICE { ...,
// searchRequest
// SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd',
'c',
'=',
'c',
'o',
'm',
0x0A,
0x01,
0x01, // scope
// ENUMERATED
// {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A,
0x01,
0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
// sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8,
// timeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03,
( byte ) 0xE8,
0x01,
0x01,
( byte ) 0xFF, // typesOnly
// BOOLEAN,
// (TRUE)
// filter Filter,
( byte ) 0xA0,
0x4D, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1,
0x2A, // or [1] SET of Filter,
( byte ) 0xA3,
0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o',
'p',
( byte ) 0xA3,
0x14, // equalityMatch
// [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x08, '2', '.', '5', '.', '4',
'.',
'1',
'1', // attributeDesc
// AttributeDescription
// (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c',
't',
's',
( byte ) 0xA2,
0x1F, // not
// [2]
// Filter,
( byte ) 0xA3,
0x1D, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x16, 'o', 'r', 'g', 'a', 'n', 'i', 'z', 'a', 't', 'i', 'o', 'n', 'a', 'l', 'U', 'n', 'i', 't',
'N', 'a', 'm', 'e',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
// ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
// ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
// LDAPString
} );
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 1000, searchRequest.getSizeLimit() );
assertEquals( 1000, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (& (...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
// (& (| (...
assertEquals( 2, andFilters.size() );
OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
assertNotNull( orFilter );
// (& (| (obectclass=top) (...
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "top", assertion.getAssertionValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (...
equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "2.5.4.11", assertion.getAttributeDesc() );
assertEquals( "contacts", assertion.getAssertionValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (! ...
NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
assertNotNull( notFilter );
// (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
equalityMatch = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "organizationalUnitName", assertion.getAttributeDesc() );
assertEquals( "ttt", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// We won't check the encoding, as it has changed because of
// attributes transformations
}
/**
* Test the decoding of a SearchRequest with SubEntry control.
*/
@Test
public void testDecodeSearchRequestSubEntryControl()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x5D, 0x02,
0x01,
0x04, // messageID
0x63, 0x33,
0x04,
0x13, // baseObject: dc=my-domain,dc=com
'd', 'c', '=', 'm', 'y', '-', 'd', 'o', 'm', 'a', 'i', 'n', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0a,
0x01,
0x02, // scope: subtree
0x0a, 0x01,
0x03, // derefAliases: derefAlways
0x02, 0x01,
0x00, // sizeLimit: 0
0x02, 0x01,
0x00, // timeLimit: 0
0x01, 0x01,
0x00, // typesOnly: false
( byte ) 0x87,
0x0b, // filter: (objectClass=*)
'o', 'b', 'j', 'e', 'c', 't', 'C', 'l', 'a', 's', 's', 0x30, 0x00, ( byte ) 0xa0,
0x23, // controls
0x30, 0x21, 0x04, 0x17, '1', '.', '3', '.', '6', '.', '1', '.', '4', '.', '1', '.', '4', '2', '0', '3',
'.', '1', '.', '1', '0', '.', '1', // SubEntry OID
0x01, 0x01, ( byte ) 0xFF, // criticality: true
0x04, 0x03, 0x01, 0x01, ( byte ) 0xFF // SubEntry visibility
};
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 4, searchRequest.getMessageId() );
assertEquals( 1, searchRequest.getControls().size() );
// SubEntry Control
String subEntryControlOID = "1.3.6.1.4.1.4203.1.10.1";
Control subEntryControl = searchRequest.getControl( subEntryControlOID );
assertEquals( subEntryControlOID, subEntryControl.getOid() );
assertTrue( subEntryControl.isCritical() );
assertTrue( subEntryControl instanceof SubentriesControl );
assertTrue( ( ( SubentriesControl ) subEntryControl ).isVisible() );
assertEquals( "dc=my-domain,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.SUBTREE, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
assertTrue( filter instanceof PresentFilter );
assertEquals( "objectClass", ( ( PresentFilter ) filter ).getAttributeDescription() );
// Check the encoding
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x5F, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( decodedPdu, encodedPdu );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
// Defensive tests
/**
* Test the decoding of a SearchRequest with an empty body
*/
@Test
public void testDecodeSearchRequestEmptyBody()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x05, 0x02, 0x01, 0x04, // messageID
0x63, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty baseDN and nothing more
*/
@Test
public void testDecodeSearchRequestBaseDnOnly()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x07, 0x02, 0x01, 0x04, // messageID
0x63, 0x02, 0x04, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with no controls. The search filter
* is : (&(|(objectclass=top)(ou=contacts))(!(objectclass=ttt)))
*/
@Test
public void testDecodeSearchRequestEmptyBaseDnNoControls()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x6F );
stream.put( new byte[]
{ 0x30, 0x6D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x68, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x00, // baseObject LDAPDN,
0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 1000, searchRequest.getSizeLimit() );
assertEquals( 1000, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (& (...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
// (& (| (...
assertEquals( 2, andFilters.size() );
OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
assertNotNull( orFilter );
// (& (| (obectclass=top) (...
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "top", assertion.getAssertionValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (...
equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "ou", assertion.getAttributeDesc() );
assertEquals( "contacts", assertion.getAssertionValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (! ...
NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
assertNotNull( notFilter );
// (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
equalityMatch = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "objectclass", assertion.getAttributeDesc() );
assertEquals( "ttt", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x6F, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x6F ), decodedPdu.substring( 0, 0x6F ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with a bad objectBase
*/
@Test
public void testDecodeSearchRequestGlobalBadObjectBase()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x90 );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81,
( byte ) 0x8D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x87, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', ':', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( de instanceof ResponseCarryingException );
Message response = ( ( ResponseCarryingException ) de ).getResponse();
assertTrue( response instanceof SearchResultDoneImpl );
assertEquals( ResultCodeEnum.INVALID_DN_SYNTAX, ( ( SearchResultDoneImpl ) response ).getLdapResult()
.getResultCode() );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty scope
*/
@Test
public void testDecodeSearchRequestEmptyScope()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x28, 0x02, 0x01,
0x04, // messageID
0x63, 0x23, 0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a bad scope
*/
@Test
public void testDecodeSearchRequestGlobalBadScope()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x90 );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81,
( byte ) 0x8D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x87, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', ':', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x03, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty derefAlias
*/
@Test
public void testDecodeSearchRequestEmptyDerefAlias()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x2B, 0x02, 0x01,
0x04, // messageID
0x63, 0x26, 0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a bad derefAlias
*/
@Test
public void testDecodeSearchRequestGlobalBadDerefAlias()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x90 );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81,
( byte ) 0x8D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x87, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', ':', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x04, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty size limit
*/
@Test
public void testDecodeSearchRequestEmptySizeLimit()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x2E, 0x02, 0x01,
0x04, // messageID
0x63, 0x29, 0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a bad sizeLimit
*/
@Test
public void testDecodeSearchRequestGlobalBadSizeLimit()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x8F );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81,
( byte ) 0x8C, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x86, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', ':', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, ( byte ) 0xFF, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty time limit
*/
@Test
public void testDecodeSearchRequestEmptyTimeLimit()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x31, 0x02,
0x01,
0x04, // messageID
0x63, 0x2C,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a bad timeLimit
*/
@Test
public void testDecodeSearchRequestGlobalBadTimeLimit()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x8F );
stream.put( new byte[]
{ 0x30, ( byte ) 0x81,
( byte ) 0x8C, // LDAPMessage ::=SEQUENCE {
0x02, 0x01,
0x01, // messageID MessageID
0x63,
( byte ) 0x81,
( byte ) 0x86, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', ':', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
0x02, 0x01, ( byte ) 0xFF, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x3C, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x24, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 'o', 'p', ( byte ) 0xA3, 0x0E, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x02, 'o', 'u', // attributeDesc AttributeDescription (LDAPString),
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x08, 'c', 'o', 'n', 't', 'a', 'c', 't', 's', ( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B, 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
// assertionValue AssertionValue (OCTET STRING) }
0x04, 0x03, 't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
} );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty filter
*/
@Test
public void testDecodeSearchRequestEmptyTypeOnly()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x34, 0x02,
0x01,
0x04, // messageID
0x63, 0x2F,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty filter
*/
@Test
public void testDecodeSearchRequestEmptyFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x37, 0x02,
0x01,
0x04, // messageID
0x63, 0x32,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA0, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty Present filter
*/
@Test
public void testDecodeSearchRequestEmptyPresentFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x37, 0x02,
0x01,
0x04, // messageID
0x63, 0x32,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0x87, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty equalityMatch filter
*/
@Test
public void testDecodeSearchRequestEmptyEqualityMatchFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x37, 0x02,
0x01,
0x04, // messageID
0x63, 0x32,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA3, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty greaterOrEqual filter
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x37, 0x02,
0x01,
0x04, // messageID
0x63, 0x32,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA5, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty lessOrEqual filter
*/
@Test
public void testDecodeSearchRequestEmptyLessOrEqualFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x37, 0x02,
0x01,
0x04, // messageID
0x63, 0x32,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA6, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an approxMatch filter
*/
@Test
public void testDecodeSearchRequestEmptyApproxMatchFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x37, 0x02,
0x01,
0x04, // messageID
0x63, 0x32,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA8, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeDesc
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrDesc()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x39, 0x02,
0x01,
0x04, // messageID
0x63, 0x34,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA5, 0x02, 0x04, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an empty attribute List
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrValue()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x41,
0x02,
0x01,
0x04, // messageID
0x63,
0x3C,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA5, 0x08, 0x04, 0x04, 't', 'e', 's', 't',
0x04, 0x00, 0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE
// OF AttributeDescription
};
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 4, searchRequest.getMessageId() );
assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// >=
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AttributeValueAssertionFilter greaterThanFilter = ( AttributeValueAssertionFilter ) filter;
assertNotNull( greaterThanFilter );
AttributeValueAssertion assertion = greaterThanFilter.getAssertion();
assertEquals( "test", assertion.getAttributeDesc() );
assertEquals( "", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x43, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu, decodedPdu );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an '*' attribute List
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrValueStar()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x44,
0x02,
0x01,
0x04, // messageID
0x63,
0x3F,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA5, 0x08, 0x04, 0x04, 't', 'e', 's', 't',
0x04, 0x00, 0x30, 0x03, // AttributeDescriptionList ::= SEQUENCE
// OF AttributeDescription
0x04, 0x01, '*' };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 4, searchRequest.getMessageId() );
assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// >=
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
AttributeValueAssertionFilter greaterThanFilter = ( AttributeValueAssertionFilter ) filter;
assertNotNull( greaterThanFilter );
AttributeValueAssertion assertion = greaterThanFilter.getAssertion();
assertEquals( "test", assertion.getAttributeDesc() );
assertEquals( "", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 1, attributes.size() );
assertEquals( "*", attributes.get( 0 ) );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x46, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu, decodedPdu );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an empty attribute List
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrValueEmpty()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x43,
0x02,
0x01,
0x04, // messageID
0x63,
0x3E,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA5, 0x08, 0x04, 0x04, 't', 'e', 's', 't',
0x04, 0x00, 0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE
// OF AttributeDescription
0x04, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 4, searchRequest.getMessageId() );
assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// >=
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
AttributeValueAssertionFilter greaterThanFilter = ( AttributeValueAssertionFilter ) filter;
assertNotNull( greaterThanFilter );
AttributeValueAssertion assertion = greaterThanFilter.getAssertion();
assertEquals( "test", assertion.getAttributeDesc() );
assertEquals( "", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
}
/**
* Test the decoding of a SearchRequest with an empty And filter
*/
@Test
public void testDecodeSearchRequestEmptyAndFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x3B, 0x02,
0x01,
0x04, // messageID
0x63, 0x36,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA0, 0x00, 0x30, 0x02, // AttributeDescriptionList
// ::=
// SEQUENCE
// OF
// AttributeDescription
0x04, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty Or filter
*/
@Test
public void testDecodeSearchRequestEmptyOrFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x3B, 0x02,
0x01,
0x04, // messageID
0x63, 0x36,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA1, 0x00, 0x30, 0x02, // AttributeDescriptionList
// ::=
// SEQUENCE
// OF
// AttributeDescription
0x04, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with an empty Not filter
*/
@Test
public void testDecodeSearchRequestEmptyNotFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x3B, 0x02,
0x01,
0x04, // messageID
0x63, 0x36,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA2, 0x00, 0x30, 0x02, // AttributeDescriptionList
// ::=
// SEQUENCE
// OF
// AttributeDescription
0x04, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a Not filter and an empty And
* filter
*/
@Test
public void testDecodeSearchRequestNotFilterEmptyAndFilter()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x3D,
0x02,
0x01,
0x04, // messageID
0x63,
0x38,
0x04,
0x1F, // baseObject LDAPDN,
'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA2, 0x02, ( byte ) 0xA0, 0x00, 0x30,
0x02, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
assertTrue( true );
return;
}
fail( "We should not reach this point" );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an '*' attribute List
*/
@Test
public void testDecodeSearchRequestDIRSERVER_651()
{
byte[] asn1BER = new byte[]
{ 0x30, 0x60, 0x02, 0x01, 0x02, 0x63, 0x5b, 0x04, 0x0a, 'd', 'c', '=', 'p', 'g', 'p', 'k', 'e', 'y', 's',
0x0a, 01, 02, 0x0a, 01, 00, 0x02, 01, 00, 0x02, 01, 00, 0x01, 01, 00, ( byte ) 0xa0, 0x3c,
( byte ) 0xa4, 0x28, 0x04, 0x09, 'p', 'g', 'p', 'u', 's', 'e', 'r', 'i', 'd', 0x30, 0x1b,
( byte ) 0x80, 0x19, 'v', 'g', 'j', 'o', 'k', 'j', 'e', 'v', '@', 'n', 'e', 't', 'c', 'e', 't', 'e',
'r', 'a', '.', 'c', 'o', 'm', '.', 'm', 'k', ( byte ) 0xa3, 0x10, 0x04, 0x0b, 'p', 'g', 'p', 'd', 'i',
's', 'a', 'b', 'l', 'e', 'd', 0x04, 0x01, '0', 0x30, 0x00 };
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a LdapMessage Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
// Decode a SearchRequest message
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 2, searchRequest.getMessageId() );
assertEquals( "dc=pgpkeys", searchRequest.getBase().toString() );
assertEquals( SearchScope.SUBTREE, searchRequest.getScope() );
assertEquals( AliasDerefMode.NEVER_DEREF_ALIASES, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
// And
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
SubstringFilter substringFilter = ( SubstringFilter ) andFilters.get( 0 );
assertNotNull( substringFilter );
assertEquals( "pgpuserid", substringFilter.getType() );
assertEquals( "vgjokjev@netcetera.com.mk", substringFilter.getInitialSubstrings() );
assertEquals( 0, substringFilter.getAnySubstrings().size() );
assertEquals( null, substringFilter.getFinalSubstrings() );
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "pgpdisabled", assertion.getAttributeDesc() );
assertEquals( "0", assertion.getAssertionValue().getString() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x62, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu, decodedPdu );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (a=b)
*/
@Test
public void testDecodeSearchRequestEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x25 );
stream.put( new byte[]
{ 0x30, 0x23, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x1E, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA3, 0x06, // Filter ::= CHOICE {
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
// attributes AttributeDescriptionList }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (a=b)
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) filter;
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x25, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x25 ), decodedPdu.substring( 0, 0x25 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(a=b))
*/
@Test
public void testDecodeSearchRequestAndEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x27 );
stream.put( new byte[]
{ 0x30, 0x25, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x20, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x08, // Filter ::= CHOICE {
( byte ) 0xA3, 0x06,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
// attributes AttributeDescriptionList }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 1, andFilters.size() );
// (&(a=b))
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x27, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x27 ), decodedPdu.substring( 0, 0x27 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(a=b)(c=d))
*/
@Test
public void testDecodeSearchRequestAndEqEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x2F );
stream.put( new byte[]
{ 0x30, 0x2D, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x28, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x10, // Filter ::= CHOICE {
( byte ) 0xA3, 0x06,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'd', // assertionValue AssertionValue (OCTET STRING) }
// attributes AttributeDescriptionList }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(a=b)...
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
// (&(a=b)(c=d))
equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "c", assertion.getAttributeDesc() );
assertEquals( "d", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x2F, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x2F ), decodedPdu.substring( 0, 0x2F ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b))
*/
@Test
public void testDecodeSearchRequestAndAndEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x29 );
stream.put( new byte[]
{ 0x30, 0x27, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x22, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x0A, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 1, andFilters.size() );
// (&(&(..
AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
assertNotNull( andFilter2 );
List<Filter> andFilters2 = andFilter2.getAndFilter();
assertEquals( 1, andFilters2.size() );
// (&(&(a=b)))
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x29, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x29 ), decodedPdu.substring( 0, 0x29 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b)(c=d))
*/
@Test
public void testDecodeSearchRequestAndAndEqEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x31 );
stream.put( new byte[]
{ 0x30, 0x2F, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x2A, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x12, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA0, 0x10, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'd', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 1, andFilters.size() );
// (&(&(..
AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
assertNotNull( andFilter2 );
List<Filter> andFilters2 = andFilter2.getAndFilter();
assertEquals( 2, andFilters2.size() );
// (&(&(a=b)...
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
// (&(&(a=b)(c=d)
equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "c", assertion.getAttributeDesc() );
assertEquals( "d", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x31, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x31 ), decodedPdu.substring( 0, 0x31 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b))(c=d))
*/
@Test
public void testDecodeSearchRequestAnd_AndEq_Eq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x31 );
stream.put( new byte[]
{ 0x30, 0x2F, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x2A, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x12, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06, // equalityMatch [3] AttributeValueAssertion,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'd', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(&(..
AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
assertNotNull( andFilter2 );
List<Filter> andFilters2 = andFilter2.getAndFilter();
assertEquals( 1, andFilters2.size() );
// (&(&(a=b))...
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
// (&(&(a=b))(c=d))
equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "c", assertion.getAttributeDesc() );
assertEquals( "d", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x31, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x31 ), decodedPdu.substring( 0, 0x31 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b)(c=d))(e=f))
*/
@Test
public void testDecodeSearchRequestAnd_AndEqEq_Eq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x39 );
stream.put( new byte[]
{ 0x30, 0x37, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x32, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x1A, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA0, 0x10, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'd', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06, // equalityMatch [3] AttributeValueAssertion,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(&(..
AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
assertNotNull( andFilter2 );
List<Filter> andFilters2 = andFilter2.getAndFilter();
assertEquals( 2, andFilters2.size() );
// (&(&(a=b)...
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
// (&(&(a=b)(c=d)...
equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "c", assertion.getAttributeDesc() );
assertEquals( "d", assertion.getAssertionValue().getString() );
// (&(&(a=b)(c=d))(e=f))
equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "e", assertion.getAttributeDesc() );
assertEquals( "f", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x39, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x39 ), decodedPdu.substring( 0, 0x39 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(a=b)(|(a=b)(c=d)))
*/
@Test
public void testDecodeSearchRequestAndEq_OrEqEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x39 );
stream.put( new byte[]
{ 0x30, 0x37, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x32, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x1A, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06, // equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA1, 0x10, // Filter ::= CHOICE { or [1] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'd', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(a=b)..
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
// (&(a=b)(|(...
OrFilter orFilter = ( OrFilter ) andFilters.get( 1 );
assertNotNull( orFilter );
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
// (&(a=b)(|(c=d)...
equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 0 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "c", assertion.getAttributeDesc() );
assertEquals( "d", assertion.getAssertionValue().getString() );
// (&(a=b)(|(c=d)(e=f)))
equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "e", assertion.getAttributeDesc() );
assertEquals( "f", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x39, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x39 ), decodedPdu.substring( 0, 0x39 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b))(&(c=d)))
*/
@Test
public void testDecodeSearchRequestAnd_AndEq_AndEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x33 );
stream.put( new byte[]
{ 0x30, 0x31, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x2C, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x14, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'd', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(&(..
AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
assertNotNull( andFilter2 );
List<Filter> andFilters2 = andFilter2.getAndFilter();
assertEquals( 1, andFilters2.size() );
// (&(&(a=b)...
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
// (&(&(a=b))(&...
andFilter2 = ( AndFilter ) andFilters.get( 1 );
assertNotNull( andFilter2 );
andFilters2 = andFilter2.getAndFilter();
assertEquals( 1, andFilters2.size() );
// (&(&(a=b))(&(c=d)))
equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "c", assertion.getAttributeDesc() );
assertEquals( "d", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x33, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x33 ), decodedPdu.substring( 0, 0x33 ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b)(c=d))(&(e=f)))
*/
@Test
public void testDecodeSearchRequestAnd_AndEqEq_AndEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x3B );
stream.put( new byte[]
{ 0x30, 0x39, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x34, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x1C, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA0, 0x10, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'd', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA0, 0x08, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06,// equalityMatch [3] AttributeValueAssertion,
// equalityMatch [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(&(..
AndFilter andFilter2 = ( AndFilter ) andFilters.get( 0 );
assertNotNull( andFilter2 );
List<Filter> andFilters2 = andFilter2.getAndFilter();
assertEquals( 2, andFilters2.size() );
// (&(&(a=b)...
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "a", assertion.getAttributeDesc() );
assertEquals( "b", assertion.getAssertionValue().getString() );
// (&(&(a=b)(c=d))...
equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "c", assertion.getAttributeDesc() );
assertEquals( "d", assertion.getAssertionValue().getString() );
// (&(&(a=b)(c=d))(&...
andFilter2 = ( AndFilter ) andFilters.get( 1 );
assertNotNull( andFilter2 );
andFilters2 = andFilter2.getAndFilter();
assertEquals( 1, andFilters2.size() );
// (&(&(a=b)(c=d))(&(e=f)))
equalityMatch = ( AttributeValueAssertionFilter ) andFilters2.get( 0 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "e", assertion.getAttributeDesc() );
assertEquals( "f", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x3B, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x3B ), decodedPdu.substring( 0, 0x3B ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* (&(|(abcdef=*)(ghijkl=*))(!(e>=f)))
*/
@Test
public void testDecodeSearchRequestAnd_OrPrPr_NotGEq()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x3B );
stream.put( new byte[]
{ 0x30, 0x39, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x01, // messageID MessageID
0x63, 0x34, // CHOICE { ...,
// searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x03, // baseObject LDAPDN,
'a', '=', 'b', 0x0A, 0x01, 0x01, // scope ENUMERATED {
// baseObject (0),
// singleLevel (1),
// wholeSubtree (2) },
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
// neverDerefAliases (0),
// derefInSearching (1),
// derefFindingBaseObj (2),
// derefAlways (3) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (1000)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x1C, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA1, 0x10, // Filter ::= CHOICE { or [0] SET OF Filter,
( byte ) 0x87, 0x06,// present [7] AttributeDescription,
'a', 'b', 'c', // AttributeDescription ::= LDAPString
'd', 'e', 'f', ( byte ) 0x87, 0x06,// present [7] AttributeDescription,
'g', 'h', 'i', // AttributeDescription ::= LDAPString
'j', 'k', 'l', ( byte ) 0xA2, 0x08, // Filter ::= CHOICE { not Filter,
( byte ) 0xA5, 0x06,// greaterOrEqual [3] AttributeValueAssertion,
// AttributeValueAssertion ::= SEQUENCE {
0x04, 0x01, 'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01, 'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
String decodedPdu = Strings.dumpBytes(stream.array());
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "a=b", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(|(..
OrFilter orFilter = ( OrFilter ) andFilters.get( 0 );
assertNotNull( orFilter );
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
// (&(&(abcdef=*)...
PresentFilter presentFilter = ( PresentFilter ) orFilters.get( 0 );
assertNotNull( presentFilter );
assertEquals( "abcdef", presentFilter.getAttributeDescription() );
// (&(&(abcdef=*)(ghijkl=*))...
presentFilter = ( PresentFilter ) orFilters.get( 1 );
assertNotNull( presentFilter );
assertEquals( "ghijkl", presentFilter.getAttributeDescription() );
// (&(&(abcdef=*)(ghijkl=*))(&...
NotFilter notFilter = ( NotFilter ) andFilters.get( 1 );
assertNotNull( notFilter );
// (&(&(abcdef=*)(ghijkl=*))(&(e=f)))
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) notFilter.getNotFilter();
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "e", assertion.getAttributeDesc() );
assertEquals( "f", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
// We won't check the whole PDU, as it may differs because
// attributes may have been reordered
try
{
ByteBuffer bb = encoder.encodeMessage( searchRequest );
// Check the length
assertEquals( 0x3B, bb.limit() );
String encodedPdu = Strings.dumpBytes(bb.array());
assertEquals( encodedPdu.substring( 0, 0x3B ), decodedPdu.substring( 0, 0x3B ) );
}
catch ( EncoderException ee )
{
ee.printStackTrace();
fail( ee.getMessage() );
}
}
/**
* Test the decoding of a SearchRequest
* for rootDSE
*/
@Test
public void testDecodeSearchRequestRootDSE()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x33 );
stream.put( new byte[]
{ 0x30, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x2D, 0x02, 0x01, 0x01, 0x63, ( byte ) 0x84, 0x00, 0x00, 0x00,
0x24, 0x04, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01,
0x00, ( byte ) 0x87, 0x0B, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x30,
( byte ) 0x84, 0x00, 0x00, 0x00, 0x00 } );
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 1, searchRequest.getMessageId() );
assertEquals( "", searchRequest.getBase().toString() );
assertEquals( SearchScope.OBJECT, searchRequest.getScope() );
assertEquals( AliasDerefMode.NEVER_DEREF_ALIASES, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
PresentFilter presentFilter = ( PresentFilter ) filter;
assertNotNull( presentFilter );
assertEquals( "objectClass", presentFilter.getAttributeDescription() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
}
/**
* Test the decoding of a SearchRequest with special length (long form)
* for rootDSE
*/
@Test
public void testDecodeSearchRequestDIRSERVER_810()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x6B );
stream.put( new byte[]
{ 0x30, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x65, 0x02, 0x01, 0x03, 0x63, ( byte ) 0x84, 0x00, 0x00, 0x00,
0x5c, 0x04, 0x12, 0x6f, 0x75, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2c, 0x6f, 0x75, 0x3d, 0x73, 0x79,
0x73,
0x74,
0x65,
0x6d, // 'ou=users,ou=system'
0x0a, 0x01, 0x01, 0x0a, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x1e, 0x01, 0x01, ( byte ) 0xff,
( byte ) 0xa0, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x2d, ( byte ) 0xa3, ( byte ) 0x84, 0x00, 0x00, 0x00,
0x0e, 0x04, 0x03, 0x75, 0x69, 0x64, 0x04, 0x07, 0x62, 0x75, 0x73, 0x74, 0x65, 0x72,
0x20, // 'buster ' (with a space at the end)
( byte ) 0xa3, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x13, 0x04, 0x0b, 0x73, 0x62, 0x41, 0x74, 0x74, 0x72,
0x69, 0x62, 0x75, 0x74, 0x65, // sbAttribute
0x04, 0x04, 0x42, 0x75, 0x79, 0x20, // 'Buy ' (with a space at the end)
0x30, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x00 } );
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 3, searchRequest.getMessageId() );
assertEquals( "ou=users,ou=system", searchRequest.getBase().toString() );
assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
assertEquals( AliasDerefMode.NEVER_DEREF_ALIASES, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 30, searchRequest.getTimeLimit() );
assertEquals( true, searchRequest.getTypesOnly() );
Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(uid=buster)...
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "uid", assertion.getAttributeDesc() );
assertEquals( "buster ", assertion.getAssertionValue().getString() );
// (&(uid=buster)(sbAttribute=Buy))
equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "sbAttribute", assertion.getAttributeDesc() );
assertEquals( "Buy ", assertion.getAssertionValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
}
/**
* Test the decoding of a SearchRequest with a complex filter :
* (&(objectClass=person)(|(cn=Tori*)(sn=Jagger)))
*/
@Test
public void testDecodeSearchRequestComplexFilter()
{
Asn1Decoder ldapDecoder = new Asn1Decoder();
ByteBuffer stream = ByteBuffer.allocate( 0x77 );
stream.put( new byte[]
{ 0x30,
0x75, // LdapMessage
0x02, 0x01,
0x06, // message Id = 6
0x63,
0x53, // SearchRequest
0x04,
0x09, // BasDN 'ou=system'
0x6F, 0x75, 0x3D, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x0A, 0x01,
0x02, // scope = SUBTREE
0x0A, 0x01,
0x03, // derefAlias = 3
0x02, 0x01,
0x00, // sizeLimit = none
0x02, 0x01,
0x00, // timeLimit = none
0x01, 0x01,
0x00, // types only = false
( byte ) 0xA0,
0x35, // AND
( byte ) 0xA3,
0x15, // equals
0x04,
0x0B, // 'objectclass'
0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x04,
0x06, // 'person'
0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, ( byte ) 0xA1,
0x1C, // OR
( byte ) 0xA4,
0x0C, // substrings : 'cn=Tori*'
0x04,
0x02, // 'cn'
0x63, 0x6E, 0x30,
0x06, // initial = 'Tori'
( byte ) 0x80, 0x04, 0x54, 0x6F, 0x72, 0x69, ( byte ) 0xA3,
0x0C, // equals
0x04,
0x02, // 'sn'
0x73, 0x6E, 0x04,
0x06, // 'Jagger'
0x4A, 0x61, 0x67, 0x67, 0x65, 0x72, 0x30,
0x00, // Control
( byte ) 0xA0, 0x1B, 0x30, 0x19, 0x04, 0x17, '2', '.', '1', '6', '.', '8', '4', '0', '.', '1', '.',
'1', '1', '3', '7', '3', '0', '.', '3', '.', '4', '.', '2' } );
stream.flip();
// Allocate a BindRequest Container
Asn1Container ldapMessageContainer = new LdapMessageContainer();
try
{
ldapDecoder.decode( stream, ldapMessageContainer );
}
catch ( DecoderException de )
{
de.printStackTrace();
fail( de.getMessage() );
}
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
assertEquals( 6, searchRequest.getMessageId() );
assertEquals( "ou=system", searchRequest.getBase().toString() );
assertEquals( SearchScope.SUBTREE, searchRequest.getScope() );
assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
assertEquals( 0, searchRequest.getSizeLimit() );
assertEquals( 0, searchRequest.getTimeLimit() );
assertEquals( false, searchRequest.getTypesOnly() );
// (&(...
Filter filter = ( (org.apache.directory.shared.ldap.codec.message.SearchRequestImpl) searchRequest ).getCurrentFilter();
AndFilter andFilter = ( AndFilter ) filter;
assertNotNull( andFilter );
List<Filter> andFilters = andFilter.getAndFilter();
assertEquals( 2, andFilters.size() );
// (&(objectClass=person)..
AttributeValueAssertionFilter equalityMatch = ( AttributeValueAssertionFilter ) andFilters.get( 0 );
assertNotNull( equalityMatch );
AttributeValueAssertion assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "objectClass", assertion.getAttributeDesc() );
assertEquals( "person", assertion.getAssertionValue().getString() );
// (&(a=b)(|
OrFilter orFilter = ( OrFilter ) andFilters.get( 1 );
assertNotNull( orFilter );
List<Filter> orFilters = orFilter.getOrFilter();
assertEquals( 2, orFilters.size() );
// (&(a=b)(|(cn=Tori*
SubstringFilter substringFilter = ( SubstringFilter ) orFilters.get( 0 );
assertNotNull( substringFilter );
assertEquals( "cn", substringFilter.getType() );
assertEquals( "Tori", substringFilter.getInitialSubstrings() );
assertEquals( 0, substringFilter.getAnySubstrings().size() );
assertEquals( null, substringFilter.getFinalSubstrings() );
// (&(a=b)(|(cn=Tori*)(sn=Jagger)))
equalityMatch = ( AttributeValueAssertionFilter ) orFilters.get( 1 );
assertNotNull( equalityMatch );
assertion = equalityMatch.getAssertion();
assertNotNull( assertion );
assertEquals( "sn", assertion.getAttributeDesc() );
assertEquals( "Jagger", assertion.getAssertionValue().getString() );
}
}