You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2010/12/11 14:03:46 UTC
svn commit: r1044646 - in /directory/shared/trunk/ldap/src:
main/java/org/apache/directory/shared/ldap/codec/LdapDecoder.java
test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java
Author: elecharny
Date: Sat Dec 11 13:03:46 2010
New Revision: 1044646
URL: http://svn.apache.org/viewvc?rev=1044646&view=rev
Log:
Fixed DIRSERVER-1533, added a test for it (but logs must be set to DEBUG in order to have the test generating the logs)
Modified:
directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/LdapDecoder.java
directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java
Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/LdapDecoder.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/LdapDecoder.java?rev=1044646&r1=1044645&r2=1044646&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/LdapDecoder.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/codec/LdapDecoder.java Sat Dec 11 13:03:46 2010
@@ -202,7 +202,6 @@ public class LdapDecoder implements Prot
public void decode( IoSession session, IoBuffer in, ProtocolDecoderOutput out ) throws Exception
{
ByteBuffer buf = in.buf();
- int position = 0;
LdapMessageContainer messageContainer = ( LdapMessageContainer ) session
.getAttribute( "messageContainer" );
@@ -213,6 +212,8 @@ public class LdapDecoder implements Prot
messageContainer.setMaxPDUSize( maxPDUSize );
}
+ buf.mark();
+
while ( buf.hasRemaining() )
{
try
@@ -224,16 +225,15 @@ public class LdapDecoder implements Prot
LOG.debug( "Decoding the PDU : " );
int size = buf.position();
- buf.flip();
+ buf.reset();
+ int position = buf.position();
+ int pduLength = size - position;
- byte[] array = new byte[size - position];
+ byte[] array = new byte[pduLength];
- for ( int i = position; i < size; i++ )
- {
- array[i] = buf.get();
- }
+ System.arraycopy(buf.array(), position, array, 0, pduLength);
- position = size;
+ buf.position( size );
if ( array.length == 0 )
{
@@ -245,12 +245,13 @@ public class LdapDecoder implements Prot
}
}
+ buf.mark();
+
if ( messageContainer.getState() == TLVStateEnum.PDU_DECODED )
{
if ( IS_DEBUG )
{
LOG.debug( "Decoded LdapMessage : " + messageContainer.getMessage() );
- buf.mark();
}
out.write( messageContainer.getMessage() );
Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java?rev=1044646&r1=1044645&r2=1044646&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java Sat Dec 11 13:03:46 2010
@@ -24,7 +24,10 @@ import static org.junit.Assert.assertEqu
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
import java.nio.ByteBuffer;
+import java.util.Queue;
import org.apache.directory.junit.tools.Concurrent;
import org.apache.directory.junit.tools.ConcurrentJunitRunner;
@@ -34,6 +37,12 @@ import org.apache.directory.shared.asn1.
import org.apache.directory.shared.asn1.codec.DecoderException;
import org.apache.directory.shared.ldap.message.BindRequest;
import org.apache.directory.shared.ldap.util.StringTools;
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.filterchain.IoFilter.NextFilter;
+import org.apache.mina.core.session.DummySession;
+import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.codec.AbstractProtocolDecoderOutput;
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -47,47 +56,147 @@ import org.junit.runner.RunWith;
@Concurrent()
public class LdapDecoderTest
{
- // ~ Methods
- // ------------------------------------------------------------------------------------
+ private static class LdapProtocolDecoderOutput extends AbstractProtocolDecoderOutput
+ {
+ public LdapProtocolDecoderOutput()
+ {
+ // Do nothing
+ }
+
+ public void flush( NextFilter nextFilter, IoSession session )
+ {
+ // Do nothing
+ Queue<Object> messageQueue = getMessageQueue();
+
+ while ( !messageQueue.isEmpty() )
+ {
+ nextFilter.messageReceived( session, messageQueue.poll()) ;
+ }
+ }
+
+ public Object getMessage()
+ {
+ Queue<Object> messageQueue = getMessageQueue();
+
+ if ( !messageQueue.isEmpty() )
+ {
+ return messageQueue.poll();
+ }
+ else
+ {
+ return null;
+ }
+ }
+ }
+
/**
* Test the decoding of a full PDU
*/
@Test
public void testDecodeFull()
{
-
- Asn1Decoder ldapDecoder = new Asn1Decoder();
+ LdapDecoder ldapDecoder = new LdapDecoder();
+ Asn1Container ldapMessageContainer = new LdapMessageContainer();
+ ldapDecoder.setLdapMessageContainer( (LdapMessageContainer)ldapMessageContainer );
ByteBuffer stream = ByteBuffer.allocate( 0x35 );
stream.put( new byte[]
- { 0x30,
- 0x33, // LDAPMessage ::=SEQUENCE {
- 0x02, 0x01,
- 0x01, // messageID MessageID
- 0x60,
- 0x2E, // CHOICE { ..., bindRequest BindRequest, ...
- // BindRequest ::= APPLICATION[0] SEQUENCE {
- 0x02, 0x01,
- 0x03, // version INTEGER (1..127),
- 0x04,
- 0x1F, // name 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', ( byte ) 0x80, 0x08, // authentication
- // AuthenticationChoice
- // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING,
- // ...
- 'p', 'a', 's', 's', 'w', 'o', 'r', 'd' } );
+ {
+ 0x30, 0x33, // LDAPMessage ::=SEQUENCE {
+ 0x02, 0x01, 0x01, // messageID MessageID
+ 0x60, 0x2E, // CHOICE { ..., bindRequest BindRequest, ...
+ // BindRequest ::= APPLICATION[0] SEQUENCE {
+ 0x02, 0x01, 0x03, // version INTEGER (1..127),
+ 0x04, 0x1F, // name 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',
+ ( byte ) 0x80, 0x08, // authentication
+ // AuthenticationChoice
+ // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING,
+ // ...
+ 'p', 'a', 's', 's', 'w', 'o', 'r', 'd'
+ } );
stream.flip();
- // Allocate a LdapMessage Container
+ InputStream is = new ByteArrayInputStream(stream.array());
+ Object result = null;
+
+ // Decode a BindRequest PDU
+ try
+ {
+ result = ldapDecoder.decode(null, is);
+ }
+ catch ( DecoderException de )
+ {
+ de.printStackTrace();
+ fail( de.getMessage() );
+ }
+
+ // Check the decoded PDU
+ BindRequest bindRequest = (BindRequest) result;
+
+ assertEquals( 1, bindRequest.getMessageId() );
+ assertTrue( bindRequest.isVersion3() );
+ assertEquals( "uid=akarasulu,dc=example,dc=com", bindRequest.getName().toString() );
+ assertTrue( bindRequest.isSimple() );
+ assertEquals( "password", StringTools.utf8ToString( bindRequest.getCredentials() ) );
+ }
+
+
+ /**
+ * Test the decoding of two messages in a PDU
+ */
+ @Test
+ public void testDecode2Messages() throws Exception
+ {
+ LdapDecoder ldapDecoder = new LdapDecoder();
Asn1Container ldapMessageContainer = new LdapMessageContainer();
+ ldapDecoder.setLdapMessageContainer( (LdapMessageContainer)ldapMessageContainer );
+
+ IoSession dummySession = new DummySession();
+ dummySession.setAttribute( "messageContainer", ldapMessageContainer );
+
+ IoBuffer stream = IoBuffer.allocate( 0x6A );
+ stream.put( new byte[]
+ {
+ 0x30, 0x33, // LDAPMessage ::=SEQUENCE {
+ 0x02, 0x01, 0x01, // messageID MessageID
+ 0x60, 0x2E, // CHOICE { ..., bindRequest BindRequest, ...
+ // BindRequest ::= APPLICATION[0] SEQUENCE {
+ 0x02, 0x01, 0x03, // version INTEGER (1..127),
+ 0x04, 0x1F, // name 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',
+ ( byte ) 0x80, 0x08, // authentication
+ // AuthenticationChoice
+ // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING,
+ // ...
+ 'p', 'a', 's', 's', 'w', 'o', 'r', 'd',
+ 0x30, 0x33, // LDAPMessage ::=SEQUENCE {
+ 0x02, 0x01, 0x02, // messageID MessageID
+ 0x60, 0x2E, // CHOICE { ..., bindRequest BindRequest, ...
+ // BindRequest ::= APPLICATION[0] SEQUENCE {
+ 0x02, 0x01, 0x03, // version INTEGER (1..127),
+ 0x04, 0x1F, // name 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',
+ ( byte ) 0x80, 0x08, // authentication
+ // AuthenticationChoice
+ // AuthenticationChoice ::= CHOICE { simple [0] OCTET STRING,
+ // ...
+ 'p', 'a', 's', 's', 'w', 'o', 'r', 'd'
+ } );
+
+ stream.flip();
+
+ ProtocolDecoderOutput result = new LdapProtocolDecoderOutput();
// Decode a BindRequest PDU
try
{
- ldapDecoder.decode( stream, ldapMessageContainer );
+ ldapDecoder.decode( dummySession, stream, result );
}
catch ( DecoderException de )
{
@@ -96,13 +205,22 @@ public class LdapDecoderTest
}
// Check the decoded PDU
- BindRequest bindRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getBindRequest();
+ BindRequest bindRequest = ( BindRequest ) ( ( LdapProtocolDecoderOutput ) result ).getMessage();
assertEquals( 1, bindRequest.getMessageId() );
assertTrue( bindRequest.isVersion3() );
assertEquals( "uid=akarasulu,dc=example,dc=com", bindRequest.getName().toString() );
assertTrue( bindRequest.isSimple() );
assertEquals( "password", StringTools.utf8ToString( bindRequest.getCredentials() ) );
+
+ // The second message
+ bindRequest = ( BindRequest ) ( ( LdapProtocolDecoderOutput ) result ).getMessage();
+
+ assertEquals( 2, bindRequest.getMessageId() );
+ assertTrue( bindRequest.isVersion3() );
+ assertEquals( "uid=akarasulu,dc=example,dc=com", bindRequest.getName().toString() );
+ assertTrue( bindRequest.isSimple() );
+ assertEquals( "password", StringTools.utf8ToString( bindRequest.getCredentials() ) );
}