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 2006/01/27 02:17:33 UTC

svn commit: r372687 - in /directory/trunks/common/ldap/src: main/java/org/apache/ldap/common/codec/ main/java/org/apache/ldap/common/codec/add/ test/java/org/apache/ldap/common/codec/add/

Author: elecharny
Date: Thu Jan 26 17:17:20 2006
New Revision: 372687

URL: http://svn.apache.org/viewcvs?rev=372687&view=rev
Log:
- Fixed a bad case when we had a control after a request which contains a bad PDU

Modified:
    directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/LdapResultGrammar.java
    directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddRequestGrammar.java
    directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddResponseGrammar.java
    directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddRequestTest.java
    directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddResponseTest.java

Modified: directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/LdapResultGrammar.java
URL: http://svn.apache.org/viewcvs/directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/LdapResultGrammar.java?rev=372687&r1=372686&r2=372687&view=diff
==============================================================================
--- directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/LdapResultGrammar.java (original)
+++ directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/LdapResultGrammar.java Thu Jan 26 17:17:20 2006
@@ -357,7 +357,7 @@
                             log.debug( "The error message is : " + ldapResult.getErrorMessage() );
                         }
 
-                        // We cazn pop this grammar
+                        // We can pop this grammar
                         container.grammarPopAllowed( true );
                         
                         return;
@@ -487,7 +487,14 @@
         super.transitions[LdapStatesEnum.LDAP_RESULT_REFERRAL_LOOP_TAG][UniversalTag.OCTET_STRING_TAG] =
             new GrammarTransition(
                 LdapStatesEnum.LDAP_RESULT_REFERRAL_LOOP_TAG,
-                LdapStatesEnum.LDAP_RESULT_REFERRAL_VALUE, null );
+                LdapStatesEnum.LDAP_RESULT_REFERRAL_VALUE, 
+                new GrammarAction( "Allows pop" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+                        container.grammarPopAllowed( true );
+                    }
+                });
 
     }
 

Modified: directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddRequestGrammar.java
URL: http://svn.apache.org/viewcvs/directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddRequestGrammar.java?rev=372687&r1=372686&r2=372687&view=diff
==============================================================================
--- directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddRequestGrammar.java (original)
+++ directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddRequestGrammar.java Thu Jan 26 17:17:20 2006
@@ -385,6 +385,9 @@
 
                         // We can have an END transition
                         ldapMessageContainer.grammarEndAllowed( true );
+
+                        // We can have an POP transition
+                        ldapMessageContainer.grammarPopAllowed( true );
                     }
                 } );
 

Modified: directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddResponseGrammar.java
URL: http://svn.apache.org/viewcvs/directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddResponseGrammar.java?rev=372687&r1=372686&r2=372687&view=diff
==============================================================================
--- directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddResponseGrammar.java (original)
+++ directory/trunks/common/ldap/src/main/java/org/apache/ldap/common/codec/add/AddResponseGrammar.java Thu Jan 26 17:17:20 2006
@@ -116,7 +116,15 @@
         // AddResponse ::= [APPLICATION 9] LDAPResult (Value)
         // Ok, we have a LDAPResult Tag (0x0A). So we have to switch the grammar.
         super.transitions[LdapStatesEnum.ADD_RESPONSE_LDAP_RESULT][UniversalTag.ENUMERATED_TAG] = new GrammarTransition(
-                LdapStatesEnum.ADD_RESPONSE_LDAP_RESULT, LdapStatesEnum.LDAP_RESULT_GRAMMAR_SWITCH, null );
+                LdapStatesEnum.ADD_RESPONSE_LDAP_RESULT, LdapStatesEnum.LDAP_RESULT_GRAMMAR_SWITCH, 
+                new GrammarAction( "Store Ldap Result referral" )
+                {
+                    public void action( IAsn1Container container ) throws DecoderException
+                    {
+                        container.grammarPopAllowed( true );
+                    }
+                    
+                });
     }
 
     //~ Methods ------------------------------------------------------------------------------------

Modified: directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddRequestTest.java
URL: http://svn.apache.org/viewcvs/directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddRequestTest.java?rev=372687&r1=372686&r2=372687&view=diff
==============================================================================
--- directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddRequestTest.java (original)
+++ directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddRequestTest.java Thu Jan 26 17:17:20 2006
@@ -19,6 +19,7 @@
 import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
@@ -29,6 +30,7 @@
 import org.apache.asn1.codec.EncoderException;
 import org.apache.asn1.ber.Asn1Decoder;
 import org.apache.asn1.ber.IAsn1Container;
+import org.apache.ldap.common.codec.Control;
 import org.apache.ldap.common.codec.LdapDecoder;
 import org.apache.ldap.common.codec.LdapMessage;
 import org.apache.ldap.common.codec.LdapMessageContainer;
@@ -180,12 +182,12 @@
     {
         Asn1Decoder ldapDecoder = new LdapDecoder();
 
-        ByteBuffer  stream      = ByteBuffer.allocate( 0x39 );
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x07 );
         
         stream.put(
             new byte[]
             {
-                0x30, 0x37, 		// LDAPMessage ::= SEQUENCE {
+                0x30, 0x05, 		// LDAPMessage ::= SEQUENCE {
 				  0x02, 0x01, 0x01, 	//     messageID MessageID
 				  0x68, 0x00 		//     CHOICE { ..., addRequest   AddRequest, ...
             } );
@@ -552,6 +554,107 @@
         // Check the length
         assertEquals(0x34, message.computeLength());
 	    
+        // Check the encoding
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringTools.dumpBytes( bb.array() ); 
+            
+            assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            fail( ee.getMessage() );
+        }
+    }
+
+    /**
+     * Test the decoding of a AddRequest with a empty attributeList and a control
+     */
+    public void testDecodeAddRequestEmptyAttributeValueWithControl() throws NamingException
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x51 );
+        
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x4F,                // LDAPMessage ::= SEQUENCE {
+                  0x02, 0x01, 0x01,        //     messageID MessageID
+                  0x68, 0x2D,              //     CHOICE { ..., addRequest   AddRequest, ...
+                                           // AddRequest ::= [APPLICATION 8] SEQUENCE {
+                                           //     entry           LDAPDN,
+                    0x04, 0x20, 'c', 'n', '=', 't', 'e', 's', 't', 'M', 'o', 'd', 'i', 'f', 'y', ',', 'o', 'u', '=', 'u', 's', 'e', 'r', 's', ',', 'o', 'u', '=', 's', 'y', 's', 't', 'e', 'm',
+                                           //     attributes      AttributeList }
+                    0x30, 0x09,            // AttributeList ::= SEQUENCE OF SEQUENCE {
+                      0x30, 0x07,          // attribute 1
+                        0x04, 0x01, 'l',   //     type    AttributeDescription,
+                        0x31, 0x02,
+                          0x04, 0x00,
+                  (byte)0xA0, 0x1B,     // A control 
+                    0x30, 0x19, 
+                      0x04, 0x17, 
+                        0x32, 0x2E, 0x31, 0x36, 0x2E, 0x38, 0x34, 0x30, 
+                        0x2E, 0x31, 0x2E, 0x31, 0x31, 0x33, 0x37, 0x33, 
+                        0x30, 0x2E, 0x33, 0x2E, 0x34, 0x2E, 0x32
+            } );
+
+        String decodedPdu = StringTools.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode a AddRequest message
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            fail( de.getMessage() );
+        }
+        
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        AddRequest addRequest      = message.getAddRequest();
+
+        // Check the decoded message
+        assertEquals( 1, message.getMessageId() );
+        assertEquals( "cn=testModify,ou=users,ou=system", addRequest.getEntry() );
+
+        Attributes attributes = addRequest.getAttributes();
+        
+        assertEquals( 1, attributes.size() );
+        
+        BasicAttribute attributeValue = (BasicAttribute)attributes.get( "l" );
+            
+        assertEquals( "l", attributeValue.getID().toLowerCase() );
+            
+        NamingEnumeration values = attributeValue.getAll();
+        
+        while ( values.hasMore() )
+        {
+            Object value = values.next();
+            
+            assertEquals( "", value.toString() );
+        }
+
+        // Check the length
+        assertEquals(0x51, message.computeLength());
+        
+        // Check the Control
+        List controls = message.getControls();
+        
+        assertEquals( 1, controls.size() );
+        
+        Control control = message.getControls( 0 );
+        assertEquals( "2.16.840.1.113730.3.4.2", control.getControlType() );
+        assertEquals( "", StringTools.dumpBytes( (byte[])control.getControlValue() ) );
+        
         // Check the encoding
         try
         {

Modified: directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddResponseTest.java
URL: http://svn.apache.org/viewcvs/directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddResponseTest.java?rev=372687&r1=372686&r2=372687&view=diff
==============================================================================
--- directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddResponseTest.java (original)
+++ directory/trunks/common/ldap/src/test/java/org/apache/ldap/common/codec/add/AddResponseTest.java Thu Jan 26 17:17:20 2006
@@ -17,11 +17,13 @@
 package org.apache.ldap.common.codec.add;
 
 import java.nio.ByteBuffer;
+import java.util.List;
 
 import org.apache.asn1.codec.DecoderException;
 import org.apache.asn1.codec.EncoderException;
 import org.apache.asn1.ber.Asn1Decoder;
 import org.apache.asn1.ber.IAsn1Container;
+import org.apache.ldap.common.codec.Control;
 import org.apache.ldap.common.codec.LdapDecoder;
 import org.apache.ldap.common.codec.LdapMessage;
 import org.apache.ldap.common.codec.LdapMessageContainer;
@@ -139,5 +141,90 @@
         }
     	
         fail( "We should not reach this point" );
+    }
+
+    /**
+     * Test the decoding of a AddResponse with a control
+     */
+    public void testDecodeAddResponseSuccessWithControl()
+    {
+        Asn1Decoder ldapDecoder = new LdapDecoder();
+
+        ByteBuffer  stream      = ByteBuffer.allocate( 0x2B );
+        
+        stream.put(
+            new byte[]
+            {
+                0x30, 0x29,          // LDAPMessage ::=SEQUENCE {
+                  0x02, 0x01, 0x01,  //         messageID MessageID
+                  0x69, 0x07,        //        CHOICE { ..., addResponse AddResponse, ...
+                                     // AddResponse ::= [APPLICATION 9] LDAPResult
+                    0x0A, 0x01, 0x00,//   LDAPResult ::= SEQUENCE {
+                                     //      resultCode ENUMERATED {
+                                     //          success (0), ...
+                                     //      },
+                    0x04, 0x00,      //      matchedDN    LDAPDN,
+                    0x04, 0x00,      //      errorMessage LDAPString,
+                                     //      referral     [3] Referral OPTIONAL }
+                                     // }
+                  (byte)0xA0, 0x1B,  // A control 
+                    0x30, 0x19, 
+                      0x04, 0x17, 
+                        0x32, 0x2E, 0x31, 0x36, 0x2E, 0x38, 0x34, 0x30, 
+                        0x2E, 0x31, 0x2E, 0x31, 0x31, 0x33, 0x37, 0x33, 
+                        0x30, 0x2E, 0x33, 0x2E, 0x34, 0x2E, 0x32
+            } );
+
+        String decodedPdu = StringTools.dumpBytes( stream.array() );
+        stream.flip();
+
+        // Allocate a LdapMessage Container
+        IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+        // Decode the AddResponse PDU
+        try
+        {
+            ldapDecoder.decode( stream, ldapMessageContainer );
+        }
+        catch ( DecoderException de )
+        {
+            de.printStackTrace();
+            fail( de.getMessage() );
+        }
+        
+        // Check the decoded AddResponse
+        LdapMessage message = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+        AddResponse addResponse      = message.getAddResponse();
+        
+        assertEquals( 1, message.getMessageId() );
+        assertEquals( 0, addResponse.getLdapResult().getResultCode() );
+        assertEquals( "", addResponse.getLdapResult().getMatchedDN() );
+        assertEquals( "", addResponse.getLdapResult().getErrorMessage() );
+
+        // Check the length
+        assertEquals(0x2B, message.computeLength());
+        
+        // Check the Control
+        List controls = message.getControls();
+        
+        assertEquals( 1, controls.size() );
+        
+        Control control = message.getControls( 0 );
+        assertEquals( "2.16.840.1.113730.3.4.2", control.getControlType() );
+        assertEquals( "", StringTools.dumpBytes( (byte[])control.getControlValue() ) );
+
+        try
+        {
+            ByteBuffer bb = message.encode( null );
+            
+            String encodedPdu = StringTools.dumpBytes( bb.array() ); 
+            
+            assertEquals(encodedPdu, decodedPdu );
+        }
+        catch ( EncoderException ee )
+        {
+            ee.printStackTrace();
+            fail( ee.getMessage() );
+        }
     }
 }