blob: 683477a1f2bfe396ff9677f092c681d3848f76a0 [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
*
* https://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.api.ldap.codec.search;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
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.api.asn1.DecoderException;
import org.apache.directory.api.asn1.EncoderException;
import org.apache.directory.api.asn1.ber.Asn1Decoder;
import org.apache.directory.api.asn1.ber.tlv.TLVStateEnum;
import org.apache.directory.api.asn1.util.Asn1Buffer;
import org.apache.directory.api.ldap.codec.api.LdapEncoder;
import org.apache.directory.api.ldap.codec.api.LdapMessageContainer;
import org.apache.directory.api.ldap.codec.api.ResponseCarryingException;
import org.apache.directory.api.ldap.codec.osgi.AbstractCodecServiceTest;
import org.apache.directory.api.ldap.model.constants.SchemaConstants;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.filter.AndNode;
import org.apache.directory.api.ldap.model.filter.ApproximateNode;
import org.apache.directory.api.ldap.model.filter.EqualityNode;
import org.apache.directory.api.ldap.model.filter.ExprNode;
import org.apache.directory.api.ldap.model.filter.GreaterEqNode;
import org.apache.directory.api.ldap.model.filter.LessEqNode;
import org.apache.directory.api.ldap.model.filter.NotNode;
import org.apache.directory.api.ldap.model.filter.OrNode;
import org.apache.directory.api.ldap.model.filter.PresenceNode;
import org.apache.directory.api.ldap.model.filter.SubstringNode;
import org.apache.directory.api.ldap.model.message.AliasDerefMode;
import org.apache.directory.api.ldap.model.message.Control;
import org.apache.directory.api.ldap.model.message.Message;
import org.apache.directory.api.ldap.model.message.ResultCodeEnum;
import org.apache.directory.api.ldap.model.message.SearchRequest;
import org.apache.directory.api.ldap.model.message.SearchResultDoneImpl;
import org.apache.directory.api.ldap.model.message.SearchScope;
import org.apache.directory.api.ldap.model.message.controls.Subentries;
import org.apache.directory.api.ldap.model.schema.normalizers.DeepTrimToLowerNormalizer;
import org.apache.directory.api.ldap.model.schema.normalizers.OidNormalizer;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
/**
* A test case for SearchRequest messages
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@Execution( ExecutionMode.CONCURRENT)
public class SearchRequestTest extends AbstractCodecServiceTest
{
/** An oid normalizer map */
static Map<String, OidNormalizer> oids = new HashMap<String, OidNormalizer>();
@BeforeEach
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() throws DecoderException, EncoderException, LdapException
{
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]
// Assertion,
// Assertion ::= 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] Assertion,
// Assertion ::= 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] Assertion,
// Assertion ::= 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
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
LdapMessageContainer<SearchRequest> ldapMessageContainer = new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (& (...
ExprNode node = searchRequest.getFilter();
AndNode andNode = ( AndNode ) node;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
// (& (| (...
assertEquals( 2, andNodes.size() );
OrNode orFilter = ( OrNode ) andNodes.get( 0 );
assertNotNull( orFilter );
// (& (| (obectclass=top) (...
List<ExprNode> orNodes = orFilter.getChildren();
assertEquals( 2, orNodes.size() );
EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "objectclass", equalityNode.getAttribute() );
assertEquals( "top", equalityNode.getValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (...
equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "ou", equalityNode.getAttribute() );
assertEquals( "contacts", equalityNode.getValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (! ...
NotNode notNode = ( NotNode ) andNodes.get( 1 );
assertNotNull( notNode );
// (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
equalityNode = ( EqualityNode<?> ) notNode.getFirstChild();
assertNotNull( equalityNode );
assertEquals( "objectclass", equalityNode.getAttribute() );
assertEquals( "ttt", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* 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()
throws DecoderException, EncoderException, LdapException
{
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]
// Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x0B,
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x03,
't', 'o', 'p',
( byte ) 0xA6, 0x0E, // lessOrEqual [3] Assertion,
0x04, 0x02,
'o', 'u', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x08,
'c', 'o', 'n', 't', 'a', 'c', 't', 's',
( byte ) 0xA2, 0x14, // not [2] Filter,
( byte ) 0xA5, 0x12, // greaterOrEqual [5] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x0B,
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
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
LdapMessageContainer<SearchRequest> ldapMessageContainer = new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (& (...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
// (& (| (...
assertEquals( 2, andNodes.size() );
OrNode orFilter = ( OrNode ) andNodes.get( 0 );
assertNotNull( orFilter );
// (& (| (objectclass~=top) (...
List<ExprNode> orNodes = orFilter.getChildren();
assertEquals( 2, orNodes.size() );
ApproximateNode<?> approxNode = ( ApproximateNode<?> ) orNodes.get( 0 );
assertNotNull( approxNode );
assertEquals( "objectclass", approxNode.getAttribute() );
assertEquals( "top", approxNode.getValue().getString() );
// (& (| (objectclass~=top) (ou<=contacts) ) (...
LessEqNode<?> lessOrEqualNode = ( LessEqNode<?> ) orNodes.get( 1 );
assertNotNull( lessOrEqualNode );
assertEquals( "ou", lessOrEqualNode.getAttribute() );
assertEquals( "contacts", lessOrEqualNode.getValue().getString() );
// (& (| (objectclass~=top) (ou<=contacts) ) (! ...
NotNode notNode = ( NotNode ) andNodes.get( 1 );
assertNotNull( notNode );
// (& (| (objectclass~=top) (ou<=contacts) ) (! (objectclass>=ttt) ) )
GreaterEqNode<?> greaterOrEqual = ( GreaterEqNode<?> ) notNode.getFirstChild();
assertNotNull( greaterOrEqual );
assertEquals( "objectclass", greaterOrEqual.getAttribute() );
assertEquals( "ttt", greaterOrEqual.getValue().getString() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* 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() throws DecoderException, EncoderException, LdapException
{
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) },
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, 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]
// Assertion,
// Assertion ::= 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
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
LdapMessageContainer<SearchRequest> ldapMessageContainer = new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (& (...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
// (& (| (...
assertEquals( 2, andNodes.size() );
OrNode orFilter = ( OrNode ) andNodes.get( 0 );
assertNotNull( orFilter );
// (& (| (objectclass=*) (...
List<ExprNode> orNodes = orFilter.getChildren();
assertEquals( 2, orNodes.size() );
PresenceNode presenceNode = ( PresenceNode ) orNodes.get( 0 );
assertNotNull( presenceNode );
assertEquals( "objectclass", presenceNode.getAttribute() );
// (& (| (objectclass=*) (ou=*) ) (...
presenceNode = ( PresenceNode ) orNodes.get( 1 );
assertNotNull( presenceNode );
assertEquals( "ou", presenceNode.getAttribute() );
// (& (| (objectclass=*) (ou=*) ) (! ...
NotNode notNode = ( NotNode ) andNodes.get( 1 );
assertNotNull( notNode );
// (& (| (objectclass=*) (ou=*) ) (! (objectclass>=ttt) ) )
GreaterEqNode<?> greaterOrEqual = ( GreaterEqNode<?> ) notNode.getFirstChild();
assertNotNull( greaterOrEqual );
assertEquals( "objectclass", greaterOrEqual.getAttribute() );
assertEquals( "ttt", greaterOrEqual.getValue().getString() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with no attributes. The search
* filter is : (objectclass=*)
*/
@Test
public void testDecodeSearchRequestNoAttributes() throws DecoderException, EncoderException
{
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, // 'ou=users,ou=system'
'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) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
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, 0x00, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x00, 0x00, // Some trailing 00, useless.
0x00, 0x00, 0x00, 0x00
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer = new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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 = *)
ExprNode filter = searchRequest.getFilter();
PresenceNode presenceNode = ( PresenceNode ) filter;
assertNotNull( presenceNode );
assertEquals( "objectClass", presenceNode.getAttribute() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check the encoding
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( new byte[]
{
0x30, 0x37, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x03, // messageID MessageID
0x63, 0x32, // CHOICE { ..., searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x12, // 'ou=users,ou=system'
'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) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
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, 0x00 // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
}, buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with an empty attribute. The search
* filter is : (objectclass=*)
*/
@Test
public void testDecodeSearchRequestOneEmptyAttribute()
throws DecoderException, EncoderException, LdapException
{
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, // 'ou=users,ou=system'
'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, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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 = *)
ExprNode filter = searchRequest.getFilter();
PresenceNode presenceNode = ( PresenceNode ) filter;
assertNotNull( presenceNode );
assertEquals( "objectClass", presenceNode.getAttribute() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
assertEquals( 1, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( new byte[]
{
0x30, 0x3B, // LDAPMessage ::=SEQUENCE {
0x02, 0x01, 0x03, // messageID MessageID
0x63, 0x36, // CHOICE { ..., searchRequest SearchRequest, ...
// SearchRequest ::= APPLICATION[3] SEQUENCE {
0x04, 0x12, // 'ou=users,ou=system'
'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, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
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, 0x04, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x02, // Request for sn
's', 'n',
}, buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with a star and an attribute. The search
* filter is : (objectclass=*)
*/
@Test
public void testDecodeSearchRequestWithStarAndAttr() throws DecoderException, EncoderException, LdapException
{
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, // 'ou=users,ou=system'
'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) },
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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 = *)
ExprNode filter = searchRequest.getFilter();
PresenceNode presenceNode = ( PresenceNode ) filter;
assertNotNull( presenceNode );
assertEquals( "objectClass", presenceNode.getAttribute() );
// 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() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Tests an search request decode with a simple equality match filter:
* (|(uid=akarasulu)(cn=aok)(ou=Human Resources)(l=Santa Clara)(cn=abok))
*/
@Test
public void testDecodeSearchRequestOrFilters() throws DecoderException, EncoderException, LdapException
{
ByteBuffer stream = ByteBuffer.allocate( 0x96 );
stream.put( new byte[]
{
0x30, ( byte ) 0x81, ( byte ) 0x93,
0x02, 0x01, 0x21, // messageID MessageID
0x63, ( byte ) 0x81, ( byte ) 0x8D,
0x04, 0x11, // "dc=example,dc=com"
'd', 'c', '=', 'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm',
0x0A, 0x01, 0x00, // scope ENUMERATED {
0x0A, 0x01, 0x02, // derefAliases ENUMERATED {
0x02, 0x01, 0x02, // sizeLimit INTEGER (0 .. maxInt), (2)
0x02, 0x01, 0x03, // timeLimit INTEGER (0 .. maxInt), (3)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( 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', // 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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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*)
OrNode orNode = ( OrNode ) searchRequest.getFilter();
assertNotNull( orNode );
assertEquals( 5, orNode.getChildren().size() );
// uid=akarasulu
EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 0 );
assertEquals( "uid", equalityNode.getAttribute() );
assertEquals( "akarasulu", equalityNode.getValue().getString() );
// cn=aok
equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 1 );
assertEquals( "cn", equalityNode.getAttribute() );
assertEquals( "aok", equalityNode.getValue().getString() );
// ou = Human Resources
equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 2 );
assertEquals( "ou", equalityNode.getAttribute() );
assertEquals( "Human Resources", equalityNode.getValue().getString() );
// l=Santa Clara
equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 3 );
assertEquals( "l", equalityNode.getAttribute() );
assertEquals( "Santa Clara", equalityNode.getValue().getString() );
// cn=abok
equalityNode = ( EqualityNode<?> ) orNode.getChildren().get( 4 );
assertEquals( "cn", equalityNode.getAttribute() );
assertEquals( "abok", equalityNode.getValue().getString() );
// The attributes
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with controls.
*/
@Test
public void testDecodeSearchRequestWithControls() throws DecoderException, EncoderException
{
byte[] asn1BERJava5 = new byte[]
{
0x30, 0x7f,
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 ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, 0x00, // typesOnly BOOLEAN, (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',
};
byte[] asn1BERJava6 = 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, 0x19,
0x04, 0x17, // control
'2', '.', '1', '6', '.', '8', '4', '0', '.', '1', '.',
'1', '1', '3', '7', '3', '0', '.', '3', '.', '4', '.', '2',
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
};
// For Java6
ByteBuffer streamJava6 = ByteBuffer.allocate( asn1BERJava6.length );
streamJava6.put( asn1BERJava6 );
streamJava6.flip();
// For Java5
ByteBuffer streamJava5 = ByteBuffer.allocate( asn1BERJava5.length );
streamJava5.put( asn1BERJava5 );
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( streamJava6, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
ExprNode filter = searchRequest.getFilter();
assertTrue( filter instanceof PresenceNode );
assertEquals( "objectClass", ( ( PresenceNode ) filter ).getAttribute() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( asn1BERJava6, buffer.getBytes().array() );
}
/**
* 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()
throws DecoderException, EncoderException, LdapException
{
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 {
// 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, 0x4D, // Filter ::= CHOICE {
// and [0] SET OF Filter,
( byte ) 0xA1, 0x2A, // or [1] SET of Filter,
( byte ) 0xA3, 0x12, // equalityMatch [3]
// Assertion,
// Assertion ::= 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]
// Assertion,
// Assertion ::= 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]
// Assertion,
// Assertion ::= 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',
0x04, 0x03, // assertionValue AssertionValue (OCTET STRING) }
't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (& (...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
// (& (| (...
assertEquals( 2, andNodes.size() );
OrNode orFilter = ( OrNode ) andNodes.get( 0 );
assertNotNull( orFilter );
// (& (| (obectclass=top) (...
List<ExprNode> orNodes = orFilter.getChildren();
assertEquals( 2, orNodes.size() );
EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "objectclass", equalityNode.getAttribute() );
assertEquals( "top", equalityNode.getValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (...
equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "2.5.4.11", equalityNode.getAttribute() );
assertEquals( "contacts", equalityNode.getValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (! ...
NotNode notNode = ( NotNode ) andNodes.get( 1 );
assertNotNull( notNode );
// (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
equalityNode = ( EqualityNode<?> ) notNode.getFirstChild();
assertNotNull( equalityNode );
assertEquals( "organizationalUnitName", equalityNode.getAttribute() );
assertEquals( "ttt", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with SubEntry control.
*/
@Test
public void testDecodeSearchRequestSubEntryControl() throws DecoderException, EncoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x5D,
0x02, 0x01, 0x04, // messageID 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 ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, 0x00, // typesOnly BOOLEAN, (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
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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 Subentries );
assertTrue( ( ( Subentries ) 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() );
ExprNode filter = searchRequest.getFilter();
assertTrue( filter instanceof PresenceNode );
assertEquals( "objectClass", ( ( PresenceNode ) filter ).getAttribute() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
// Defensive tests
/**
* Test the decoding of a SearchRequest with an empty body
*/
@Test
public void testDecodeSearchRequestEmptyBody() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x05,
0x02, 0x01, 0x04, // messageID MessageID
0x63, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty baseDN and nothing more
*/
@Test
public void testDecodeSearchRequestBaseDnOnly() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x07,
0x02, 0x01, 0x04, // messageID MessageID
0x63, 0x02,
0x04, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with no controls. The search filter
* is : (&(|(objectclass=top)(ou=contacts))(!(objectclass=ttt)))
*/
@Test
public void testDecodeSearchRequestEmptyBaseDnNoControls() throws DecoderException, EncoderException, LdapException
{
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]
// Assertion,
// Assertion ::= 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] Assertion,
// Assertion ::= 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] Assertion,
// Assertion ::= 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 SearchRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (& (...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
// (& (| (...
assertEquals( 2, andNodes.size() );
OrNode orFilter = ( OrNode ) andNodes.get( 0 );
assertNotNull( orFilter );
// (& (| (obectclass=top) (...
List<ExprNode> orNodes = orFilter.getChildren();
assertEquals( 2, orNodes.size() );
EqualityNode<?> equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "objectclass", equalityNode.getAttribute() );
assertEquals( "top", equalityNode.getValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (...
equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "ou", equalityNode.getAttribute() );
assertEquals( "contacts", equalityNode.getValue().getString() );
// (& (| (objectclass=top) (ou=contacts) ) (! ...
NotNode notNode = ( NotNode ) andNodes.get( 1 );
assertNotNull( notNode );
// (& (| (objectclass=top) (ou=contacts) ) (! (objectclass=ttt) ) )
equalityNode = ( EqualityNode<?> ) notNode.getFirstChild();
assertNotNull( equalityNode );
assertEquals( "objectclass", equalityNode.getAttribute() );
assertEquals( "ttt", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
for ( String attribute : attributes )
{
assertNotNull( attribute );
}
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with a bad objectBase
*/
@Test
public void testDecodeSearchRequestGlobalBadObjectBase() throws DecoderException
{
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]
// Assertion,
// Assertion ::= 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] Assertion,
// Assertion ::= 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] Assertion,
// Assertion ::= 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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
assertThrows( DecoderException.class, ( ) ->
{
try
{
Asn1Decoder.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() );
throw de;
}
} );
}
/**
* Test the decoding of a SearchRequest with an empty scope
*/
@Test
public void testDecodeSearchRequestEmptyScope() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x28,
0x02, 0x01, 0x04, // messageID 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
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a bad scope
*/
@Test
public void testDecodeSearchRequestGlobalBadScope() throws DecoderException
{
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]
// Assertion,
// Assertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B,
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x03, // assertionValue AssertionValue (OCTET STRING) }
't', 'o', 'p',
( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x02,
'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 ) 0xA3, 0x12, // equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString),
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x03, // assertionValue AssertionValue (OCTET STRING) }
'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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty derefAlias
*/
@Test
public void testDecodeSearchRequestEmptyDerefAlias() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x2B,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a bad derefAlias
*/
@Test
public void testDecodeSearchRequestGlobalBadDerefAlias() throws DecoderException
{
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]
// Assertion,
// Assertion ::= SEQUENCE {
// attributeDesc AttributeDescription (LDAPString),
0x04, 0x0B,
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x03, // assertionValue AssertionValue (OCTET STRING) }
't', 'o', 'p',
( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x02,
'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 ) 0xA3, 0x12, // equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString),
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x03, // assertionValue AssertionValue (OCTET STRING) }
'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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty size limit
*/
@Test
public void testDecodeSearchRequestEmptySizeLimit() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x2E,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a bad sizeLimit
*/
@Test
public void testDecodeSearchRequestGlobalBadSizeLimit() throws DecoderException
{
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]
// Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString),
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x03, // assertionValue AssertionValue (OCTET STRING) }
't', 'o', 'p',
( byte ) 0xA3, 0x0E, // equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x02,
'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 ) 0xA3, 0x12, // equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x0B, // attributeDesc AttributeDescription (LDAPString),
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x03, // assertionValue AssertionValue (OCTET STRING) }
't', 't', 't',
// attributes AttributeDescriptionList }
0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
0x04, 0x05, // AttributeDescription
'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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty time limit
*/
@Test
public void testDecodeSearchRequestEmptyTimeLimit() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x31,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a bad timeLimit
*/
@Test
public void testDecodeSearchRequestGlobalBadTimeLimit() throws DecoderException
{
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]
// Assertion,
// Assertion ::= 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] Assertion,
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] Assertion,
// Assertion ::= 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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty filter
*/
@Test
public void testDecodeSearchRequestEmptyTypeOnly() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x34,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty filter
*/
@Test
public void testDecodeSearchRequestEmptyFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x37,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA0, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty Present filter
*/
@Test
public void testDecodeSearchRequestEmptyPresentFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x37,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0x87, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty equalityMatch filter
*/
@Test
public void testDecodeSearchRequestEmptyEqualityMatchFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x37,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA3, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty greaterOrEqual filter
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x37,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA5, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty lessOrEqual filter
*/
@Test
public void testDecodeSearchRequestEmptyLessOrEqualFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x37,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA6, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an approxMatch filter
*/
@Test
public void testDecodeSearchRequestEmptyApproxMatchFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x37,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA8, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeDesc
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrDesc()
throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x39,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA5, 0x02,
0x04, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an empty attribute List
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrValue()
throws DecoderException, EncoderException, LdapException
{
byte[] asn1BER = new byte[]
{
0x30, 0x41,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA5, 0x08,
0x04, 0x04,
't', 'e', 's', 't',
0x04, 0x00,
0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// >=
GreaterEqNode<?> greaterOrEqual = ( GreaterEqNode<?> ) searchRequest.getFilter();
assertNotNull( greaterOrEqual );
assertEquals( "test", greaterOrEqual.getAttribute() );
assertEquals( "", greaterOrEqual.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an '*' attribute List
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrValueStar()
throws DecoderException, EncoderException, LdapException
{
byte[] asn1BER = new byte[]
{
0x30, 0x44,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
( byte ) 0xA5, 0x08,
0x04, 0x04,
't', 'e', 's', 't',
0x04, 0x00,
0x30, 0x03, // AttributeDescriptionList ::= SEQUENCE
// OF AttributeDescription
0x04, 0x01, '*'
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// >=
GreaterEqNode<?> greaterOrEqual = ( GreaterEqNode<?> ) searchRequest.getFilter();
assertNotNull( greaterOrEqual );
assertEquals( "test", greaterOrEqual.getAttribute() );
assertEquals( "", greaterOrEqual.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 1, attributes.size() );
assertEquals( "*", attributes.get( 0 ) );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an empty attribute List
*/
@Test
public void testDecodeSearchRequestEmptyGreaterOrEqualEmptyAttrValueEmpty() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x43,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA5, 0x08,
0x04, 0x04,
't', 'e', 's', 't',
0x04, 0x00,
0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
0x04, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// >=
GreaterEqNode<?> greaterOrEqual = ( GreaterEqNode<?> ) searchRequest.getFilter();
assertNotNull( greaterOrEqual );
assertEquals( "test", greaterOrEqual.getAttribute() );
assertEquals( "", greaterOrEqual.getValue().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() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x3B,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF,// typesOnly BOOLEAN, (TRUE)
( byte ) 0xA0, 0x00,
0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
0x04, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty Or filter
*/
@Test
public void testDecodeSearchRequestEmptyOrFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x3B,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA1, 0x00,
0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
0x04, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with an empty Not filter
*/
@Test
public void testDecodeSearchRequestEmptyNotFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x3B,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA2, 0x00,
0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
0x04, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a Not filter and an empty And
* filter
*/
@Test
public void testDecodeSearchRequestNotFilterEmptyAndFilter() throws DecoderException
{
byte[] asn1BER = new byte[]
{
0x30, 0x3D,
0x02, 0x01, 0x04, // messageID 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, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xA2, 0x02,
( byte ) 0xA0, 0x00,
0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF
// AttributeDescription
0x04, 0x00
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
assertThrows( DecoderException.class, ( ) ->
{
Asn1Decoder.decode( stream, ldapMessageContainer );
} );
}
/**
* Test the decoding of a SearchRequest with a greaterOrEqual filter and an
* empty attributeValue, and an '*' attribute List
*/
@Test
public void testDecodeSearchRequestDIRSERVER_651() throws DecoderException, EncoderException, LdapException
{
byte[] asn1BER = new byte[]
{
0x30, 0x60,
0x02, 0x01, 0x02, // messageID MessageID
0x63, 0x5b,
0x04, 0x0a,
'd', 'c', '=', 'p', 'g', 'p', 'k', 'e', 'y', 's',
0x0A, 0x01, 0x02, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, 0x00, // typesOnly BOOLEAN, (FALSE)
( 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
};
ByteBuffer stream = ByteBuffer.allocate( asn1BER.length );
stream.put( asn1BER );
stream.flip();
// Allocate a LdapMessage Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
// Decode a SearchRequest message
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
SubstringNode substringNode = ( SubstringNode ) andNodes.get( 0 );
assertNotNull( substringNode );
assertEquals( "pgpuserid", substringNode.getAttribute() );
assertEquals( "vgjokjev@netcetera.com.mk", substringNode.getInitial() );
assertEquals( 0, substringNode.getAny().size() );
assertEquals( null, substringNode.getFinal() );
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "pgpdisabled", equalityNode.getAttribute() );
assertEquals( "0", equalityNode.getValue().getString() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (a=b)
*/
@Test
public void testDecodeSearchRequestEq() throws DecoderException, EncoderException, LdapException
{
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), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA3, 0x06, // Filter ::= CHOICE {
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
// attributes AttributeDescriptionList }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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)
EqualityNode<?> equalityNode = ( EqualityNode<?> ) searchRequest.getFilter();
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(a=b))
*/
@Test
public void testDecodeSearchRequestAndEq() throws DecoderException, EncoderException, LdapException
{
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), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x08, // Filter ::= CHOICE {
( byte ) 0xA3, 0x06,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
// attributes AttributeDescriptionList }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 1, andNodes.size() );
// (&(a=b))
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(a=b)(c=d))
*/
@Test
public void testDecodeSearchRequestAndEqEq() throws DecoderException, EncoderException, LdapException
{
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), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x10, // Filter ::= CHOICE {
( byte ) 0xA3, 0x06,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'd', // assertionValue AssertionValue (OCTET STRING) }
// attributes AttributeDescriptionList }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(a=b)...
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
// (&(a=b)(c=d))
equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "c", equalityNode.getAttribute() );
assertEquals( "d", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b))
*/
@Test
public void testDecodeSearchRequestAndAndEq() throws DecoderException, EncoderException, LdapException
{
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] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 1, andNodes.size() );
// (&(&(..
AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
assertNotNull( andNode2 );
List<ExprNode> andNodes2 = andNode2.getChildren();
assertEquals( 1, andNodes2.size() );
// (&(&(a=b)))
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b)(c=d))
*/
@Test
public void testDecodeSearchRequestAndAndEqEq() throws DecoderException, EncoderException, LdapException
{
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), (0)
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] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'd', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 1, andNodes.size() );
// (&(&(..
AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
assertNotNull( andNode2 );
List<ExprNode> andNodes2 = andNode2.getChildren();
assertEquals( 2, andNodes2.size() );
// (&(&(a=b)...
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
// (&(&(a=b)(c=d)
equalityNode = ( EqualityNode<?> ) andNodes2.get( 1 );
assertNotNull( equalityNode );
assertEquals( "c", equalityNode.getAttribute() );
assertEquals( "d", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b))(c=d))
* @throws LdapException
*/
@Test
public void testDecodeSearchRequestAnd_AndEq_Eq() throws DecoderException, EncoderException, LdapException
{
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), (0)
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] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06, // equalityMatch [3] Assertion,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'd', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(&(..
AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
assertNotNull( andNode2 );
List<ExprNode> andNodes2 = andNode2.getChildren();
assertEquals( 1, andNodes2.size() );
// (&(&(a=b))...
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
// (&(&(a=b))(c=d))
equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "c", equalityNode.getAttribute() );
assertEquals( "d", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b)(c=d))(e=f))
*/
@Test
public void testDecodeSearchRequestAnd_AndEqEq_Eq() throws DecoderException, EncoderException, LdapException
{
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), (0)
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] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06, // equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'd', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06, // equalityMatch [3] Assertion,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(&(..
AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
assertNotNull( andNode2 );
List<ExprNode> andNodes2 = andNode2.getChildren();
assertEquals( 2, andNodes2.size() );
// (&(&(a=b)...
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
// (&(&(a=b)(c=d)...
equalityNode = ( EqualityNode<?> ) andNodes2.get( 1 );
assertNotNull( equalityNode );
assertEquals( "c", equalityNode.getAttribute() );
assertEquals( "d", equalityNode.getValue().getString() );
// (&(&(a=b)(c=d))(e=f))
equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "e", equalityNode.getAttribute() );
assertEquals( "f", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(a=b)(|(a=b)(c=d)))
*/
@Test
public void testDecodeSearchRequestAndEq_OrEqEq() throws DecoderException, EncoderException, LdapException
{
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), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
// filter Filter,
( byte ) 0xA0, 0x1A, // Filter ::= CHOICE { and [0] SET OF Filter,
( byte ) 0xA3, 0x06, // equalityMatch [3] Assertion,
// Assertion ::= 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] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'd', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06, // equalityMatch [3] Assertion,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode exprNode = searchRequest.getFilter();
AndNode andNode = ( AndNode ) exprNode;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(a=b)..
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
// (&(a=b)(|(...
OrNode orNode = ( OrNode ) andNodes.get( 1 );
assertNotNull( orNode );
List<ExprNode> orNodes = orNode.getChildren();
assertEquals( 2, orNodes.size() );
// (&(a=b)(|(c=d)...
equalityNode = ( EqualityNode<?> ) orNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "c", equalityNode.getAttribute() );
assertEquals( "d", equalityNode.getValue().getString() );
// (&(a=b)(|(c=d)(e=f)))
equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "e", equalityNode.getAttribute() );
assertEquals( "f", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b))(&(c=d)))
*/
@Test
public void testDecodeSearchRequestAnd_AndEq_AndEq()
throws DecoderException, EncoderException, LdapException
{
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), (0)
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] Assertion,
// Assertion ::= 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] Assertion,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'c', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'd', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(&(..
AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
assertNotNull( andNode2 );
List<ExprNode> andNodes2 = andNode2.getChildren();
assertEquals( 1, andNodes2.size() );
// (&(&(a=b)...
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
// (&(&(a=b))(&...
andNode2 = ( AndNode ) andNodes.get( 1 );
assertNotNull( andNode2 );
andNodes2 = andNode2.getChildren();
assertEquals( 1, andNodes2.size() );
// (&(&(a=b))(&(c=d)))
equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "c", equalityNode.getAttribute() );
assertEquals( "d", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(&(a=b)(c=d))(&(e=f)))
*/
@Test
public void testDecodeSearchRequestAnd_AndEqEq_AndEq() throws DecoderException, EncoderException, LdapException
{
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), (0)
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] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'a', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'b', // assertionValue AssertionValue (OCTET STRING) }
( byte ) 0xA3, 0x06, // equalityMatch [3] Assertion,
// Assertion ::= 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] Assertion,
// equalityMatch [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(&(..
AndNode andNode2 = ( AndNode ) andNodes.get( 0 );
assertNotNull( andNode2 );
List<ExprNode> andNodes2 = andNode2.getChildren();
assertEquals( 2, andNodes2.size() );
// (&(&(a=b)...
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "a", equalityNode.getAttribute() );
assertEquals( "b", equalityNode.getValue().getString() );
// (&(&(a=b)(c=d))...
equalityNode = ( EqualityNode<?> ) andNodes2.get( 1 );
assertNotNull( equalityNode );
assertEquals( "c", equalityNode.getAttribute() );
assertEquals( "d", equalityNode.getValue().getString() );
// (&(&(a=b)(c=d))(&...
andNode2 = ( AndNode ) andNodes.get( 1 );
assertNotNull( andNode2 );
andNodes2 = andNode2.getChildren();
assertEquals( 1, andNodes2.size() );
// (&(&(a=b)(c=d))(&(e=f)))
equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "e", equalityNode.getAttribute() );
assertEquals( "f", equalityNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* (&(|(abcdef=*)(ghijkl=*))(!(e>=f)))
*/
@Test
public void testDecodeSearchRequestAnd_OrPrPr_NotGEq() throws DecoderException, EncoderException, LdapException
{
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), (0)
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', 'd', 'e', 'f', // AttributeDescription ::= LDAPString
( byte ) 0x87, 0x06, // present [7] AttributeDescription,
'g', 'h', 'i', 'j', 'k', 'l', // AttributeDescription ::= LDAPString
( byte ) 0xA2, 0x08, // Filter ::= CHOICE { not Filter,
( byte ) 0xA5, 0x06, // greaterOrEqual [3] Assertion,
// Assertion ::= SEQUENCE {
0x04, 0x01,
'e', // attributeDesc AttributeDescription (LDAPString),
0x04, 0x01,
'f', // assertionValue AssertionValue (OCTET STRING) }
0x30, 0x00 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(|(..
OrNode orFilter = ( OrNode ) andNodes.get( 0 );
assertNotNull( orFilter );
List<ExprNode> orNodes = orFilter.getChildren();
assertEquals( 2, orNodes.size() );
// (&(&(abcdef=*)...
PresenceNode presenceNode = ( PresenceNode ) orNodes.get( 0 );
assertNotNull( presenceNode );
assertEquals( "abcdef", presenceNode.getAttribute() );
// (&(&(abcdef=*)(ghijkl=*))...
presenceNode = ( PresenceNode ) orNodes.get( 1 );
assertNotNull( presenceNode );
assertEquals( "ghijkl", presenceNode.getAttribute() );
// (&(&(abcdef=*)(ghijkl=*))(&...
NotNode notNode = ( NotNode ) andNodes.get( 1 );
assertNotNull( notNode );
// (&(&(abcdef=*)(ghijkl=*))(&(e>=f)))
GreaterEqNode<?> greaterEqNode = ( GreaterEqNode<?> ) notNode.getFirstChild();
assertNotNull( greaterEqNode );
assertEquals( "e", greaterEqNode.getAttribute() );
assertEquals( "f", greaterEqNode.getValue().getString() );
List<String> attributes = searchRequest.getAttributes();
assertEquals( 0, attributes.size() );
// Check encode reverse
Asn1Buffer buffer = new Asn1Buffer();
LdapEncoder.encodeMessage( buffer, codec, searchRequest );
assertArrayEquals( stream.array(), buffer.getBytes().array() );
}
/**
* Test the decoding of a SearchRequest
* for rootDSE
*/
@Test
public void testDecodeSearchRequestRootDse() throws DecoderException
{
ByteBuffer stream = ByteBuffer.allocate( 0x33 );
stream.put( new byte[]
{
0x30, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x2D,
0x02, 0x01, 0x01, // messageID MessageID
0x63, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x24,
0x04, 0x00,
0x0A, 0x01, 0x00, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, 0x00,
( byte ) 0x87, 0x0B,
'o', 'b', 'j', 'e', 'c', 't', 'C', 'l', 'a', 's', 's',
0x30, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x00
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
ExprNode filter = searchRequest.getFilter();
PresenceNode presenceNode = ( PresenceNode ) filter;
assertNotNull( presenceNode );
assertEquals( "objectClass", presenceNode.getAttribute() );
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() throws DecoderException
{
ByteBuffer stream = ByteBuffer.allocate( 0x6B );
stream.put( new byte[]
{
0x30, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x65,
0x02, 0x01, 0x03, // messageID MessageID
0x63, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x5c,
0x04, 0x12, // 'ou=users,ou=system'
'o', 'u', '=', 'u', 's', 'e', 'r', 's', ',',
'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm',
0x0A, 0x01, 0x01, // scope ENUMERATED {
0x0A, 0x01, 0x00, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x1E, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
( byte ) 0xa0, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x2d,
( byte ) 0xa3, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x0e,
0x04, 0x03,
'u', 'i', 'd',
0x04, 0x07,
'b', 'u', 's', 't', 'e', 'r', ' ', // 'buster ' (with a space at the end)
( byte ) 0xa3, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x13,
0x04, 0x0b,
's', 'b', 'A', 't', 't', 'r', 'i', 'b', 'u', 't', 'e', // sbAttribute
0x04, 0x04,
'B', 'u', 'y', ' ', // 'Buy ' (with a space at the end)
0x30, ( byte ) 0x84, 0x00, 0x00, 0x00, 0x00
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(uid=buster)...
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "uid", equalityNode.getAttribute() );
assertEquals( "buster ", equalityNode.getValue().getString() );
// (&(uid=buster)(sbAttribute=Buy))
equalityNode = ( EqualityNode<?> ) andNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "sbAttribute", equalityNode.getAttribute() );
assertEquals( "Buy ", equalityNode.getValue().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 testDecodeSearchRequestComplexFilterWithControl() throws DecoderException
{
ByteBuffer stream = ByteBuffer.allocate( 0x77 );
stream.put( new byte[]
{
0x30, 0x75, // LdapMessage
0x02, 0x01, 0x06, // messageID MessageID
0x63, 0x53, // SearchRequest
0x04, 0x09, // BaseDN 'ou=system'
'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm',
0x0A, 0x01, 0x02, // scope ENUMERATED {
0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
0x02, 0x01, 0x00, // sizeLimit INTEGER (0 .. maxInt), (0)
0x02, 0x01, 0x00, // timeLimit INTEGER (0 .. maxInt), (0)
0x01, 0x01, 0x00, // typesOnly BOOLEAN, (FALSE)
( byte ) 0xA0, 0x35, // AND
( byte ) 0xA3, 0x15, // equals
0x04, 0x0B,
'o', 'b', 'j', 'e', 'c', 't', 'C', 'l', 'a', 's', 's',
0x04, 0x06, // 'person'
'p', 'e', 'r', 's', 'o', 'n',
( byte ) 0xA1, 0x1C, // OR
( byte ) 0xA4, 0x0C, // substrings : 'cn=Tori*'
0x04, 0x02, // 'cn'
'c', 'n',
0x30, 0x06, // initial = 'Tori'
( byte ) 0x80, 0x04,
'T', 'o', 'r', 'i',
( byte ) 0xA3, 0x0C, // equals
0x04, 0x02, // 'sn'
's', 'n',
0x04, 0x06, // 'Jagger'
'J', 'a', 'g', 'g', 'e', 'r',
0x30, 0x00,
( byte ) 0xA0, 0x1B, // Control
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
LdapMessageContainer<SearchRequest> ldapMessageContainer =
new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
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() );
// (&(...
ExprNode filter = searchRequest.getFilter();
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(objectClass=person)..
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes.get( 0 );
assertNotNull( equalityNode );
assertEquals( "objectClass", equalityNode.getAttribute() );
assertEquals( "person", equalityNode.getValue().getString() );
// (&(a=b)(|
OrNode orNode = ( OrNode ) andNodes.get( 1 );
assertNotNull( orNode );
List<ExprNode> orNodes = orNode.getChildren();
assertEquals( 2, orNodes.size() );
// (&(a=b)(|(cn=Tori*
SubstringNode substringNode = ( SubstringNode ) orNodes.get( 0 );
assertNotNull( substringNode );
assertEquals( "cn", substringNode.getAttribute() );
assertEquals( "Tori", substringNode.getInitial() );
assertEquals( 0, substringNode.getAny().size() );
assertEquals( null, substringNode.getFinal() );
// (&(a=b)(|(cn=Tori*)(sn=Jagger)))
equalityNode = ( EqualityNode<?> ) orNodes.get( 1 );
assertNotNull( equalityNode );
assertEquals( "sn", equalityNode.getAttribute() );
assertEquals( "Jagger", equalityNode.getValue().getString() );
}
@Test
public void decodeComplexFilter() throws DecoderException
{
ByteBuffer stream = ByteBuffer.allocate( 0x77 );
stream.put( new byte[]
{
0x30, 0x53,
0x02, 0x01, 0x02,
0x63, 0x4E,
0x04, 0x11,
'd', 'c', '=', 'e', 'x', 'a', 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm',
0x0A, 0x01, 0x02,
0x0A, 0x01, 0x00,
0x02, 0x01, 0x00,
0x02, 0x01, 0x00,
0x01, 0x01, 0x00,
( byte ) 0xA0, 0x28,
( byte ) 0xA1, 0x1F,
( byte ) 0xA0, 0x1D,
( byte ) 0xA3, 0x1B,
0x04, 0x0B,
'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's',
0x04, 0x0C,
'g', 'r', 'o', 'u', 'p', 'o', 'f', 'n', 'a', 'm', 'e', 's',
( byte ) 0x87, 0x05,
'o', 'w', 'n', 'e', 'r',
0x30, 0x00
} );
stream.flip();
// Allocate a BindRequest Container
LdapMessageContainer<SearchRequest> ldapMessageContainer = new LdapMessageContainer<>( codec );
Asn1Decoder.decode( stream, ldapMessageContainer );
assertEquals( TLVStateEnum.PDU_DECODED, ldapMessageContainer.getState() );
SearchRequest searchRequest = ldapMessageContainer.getMessage();
assertEquals( 2, searchRequest.getMessageId() );
assertEquals( "dc=example,dc=com", 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() );
ExprNode filter = searchRequest.getFilter();
// (&(...
AndNode andNode = ( AndNode ) filter;
assertNotNull( andNode );
List<ExprNode> andNodes = andNode.getChildren();
assertEquals( 2, andNodes.size() );
// (&(|(...
filter = searchRequest.getFilter();
OrNode orNode = ( OrNode ) andNodes.get( 0 );
assertNotNull( orNode );
List<ExprNode> orNodes = orNode.getChildren();
assertEquals( 1, orNodes.size() );
// (&(|(&...
AndNode andNode2 = ( AndNode ) orNodes.get( 0 );
assertNotNull( andNode2 );
List<ExprNode> andNodes2 = andNode2.getChildren();
assertEquals( 1, andNodes2.size() );
// (&(|(&(objectClass=groupOfNames)
EqualityNode<?> equalityNode = ( EqualityNode<?> ) andNodes2.get( 0 );
assertNotNull( equalityNode );
assertEquals( "objectclass", equalityNode.getAttribute() );
assertEquals( "groupofnames", equalityNode.getValue().getString() );
// (&(|(&(objectClass=groupOfNames)))(owner=*))
PresenceNode presenceNode = ( PresenceNode ) andNodes.get( 1 );
assertNotNull( presenceNode );
assertEquals( "owner", presenceNode.getAttribute() );
}
}