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 2024/11/12 08:16:45 UTC

(directory-ldap-api) branch master updated: Fix for DIRAPI-414

This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git


The following commit(s) were added to refs/heads/master by this push:
     new 8af641877 Fix for DIRAPI-414
8af641877 is described below

commit 8af6418771a6a14e0753fded8d06727bf6f66e1f
Author: emmanuel lecharny <el...@apache.org>
AuthorDate: Tue Nov 12 09:16:36 2024 +0100

    Fix for DIRAPI-414
---
 .../directory/api/ldap/codec/api/LdapEncoder.java  |  2 +-
 .../api/ldap/codec/factory/Messagefactory.java     |  3 +-
 .../ldap/codec/factory/ModifyDnRequestFactory.java | 24 +++++++++++++--
 .../directory/api/ldap/codec/LdapDecoderTest.java  | 35 ++++++++++++++++++++++
 4 files changed, 59 insertions(+), 5 deletions(-)

diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java
index 23af57f64..95be8f319 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/api/LdapEncoder.java
@@ -152,7 +152,7 @@ public final class LdapEncoder
      * @param codec The LdapApiService instance
      * @param message The message to encode
      */
-    private static void encodeProtocolOp( Asn1Buffer buffer, LdapApiService codec, Message message )
+    private static void encodeProtocolOp( Asn1Buffer buffer, LdapApiService codec, Message message ) throws EncoderException
     {
         switch ( message.getType() )
         {
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/Messagefactory.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/Messagefactory.java
index 807ee4e05..8c5fa5304 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/Messagefactory.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/Messagefactory.java
@@ -19,6 +19,7 @@
  */
 package org.apache.directory.api.ldap.codec.factory;
 
+import org.apache.directory.api.asn1.EncoderException;
 import org.apache.directory.api.asn1.util.Asn1Buffer;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.model.message.Message;
@@ -38,5 +39,5 @@ public interface Messagefactory
      * @param buffer The buffer where to put the PDU
      * @param message The message to encode
      */
-    void encodeReverse( LdapApiService codec, Asn1Buffer buffer, Message message );
+    void encodeReverse( LdapApiService codec, Asn1Buffer buffer, Message message ) throws EncoderException;
 }
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/ModifyDnRequestFactory.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/ModifyDnRequestFactory.java
index 4332ed2b6..8069e4961 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/ModifyDnRequestFactory.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/factory/ModifyDnRequestFactory.java
@@ -19,12 +19,16 @@
  */
 package org.apache.directory.api.ldap.codec.factory;
 
+import org.apache.directory.api.asn1.EncoderException;
 import org.apache.directory.api.asn1.ber.tlv.BerValue;
 import org.apache.directory.api.asn1.util.Asn1Buffer;
+import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.codec.api.LdapCodecConstants;
 import org.apache.directory.api.ldap.model.message.Message;
 import org.apache.directory.api.ldap.model.message.ModifyDnRequest;
+import org.apache.directory.api.ldap.model.name.Dn;
+import org.apache.directory.api.ldap.model.name.Rdn;
 import org.apache.directory.api.util.Strings;
 
 /**
@@ -60,7 +64,7 @@ public final class ModifyDnRequestFactory implements Messagefactory
      * @param message the ModifyRequest to encode
      */
     @Override
-    public void encodeReverse( LdapApiService codec, Asn1Buffer buffer, Message message )
+    public void encodeReverse( LdapApiService codec, Asn1Buffer buffer, Message message ) throws EncoderException
     {
         int start = buffer.getPos();
         ModifyDnRequest modifyDnRequest = ( ModifyDnRequest ) message;
@@ -77,10 +81,24 @@ public final class ModifyDnRequestFactory implements Messagefactory
         BerValue.encodeBoolean( buffer, modifyDnRequest.getDeleteOldRdn() );
 
         // The new RDN
-        BerValue.encodeOctetString( buffer, modifyDnRequest.getNewRdn().getName() );
+        Rdn newRdn = modifyDnRequest.getNewRdn();
+        
+        if ( newRdn == null )
+        {
+            throw new EncoderException( I18n.err( I18n.ERR_03023_NEW_RDN_ATTRIBUTE_REQUESTED ) );
+        }
+        
+        BerValue.encodeOctetString( buffer, newRdn.getName() );
 
         // The entry DN
-        BerValue.encodeOctetString( buffer, modifyDnRequest.getName().getName() );
+        Dn name = modifyDnRequest.getName();
+        
+        if ( name == null )
+        {
+            throw new EncoderException( I18n.err( I18n.ERR_03022_NULL_REQUEST_NAME ) );
+        }
+            
+        BerValue.encodeOctetString( buffer, name.getName() );
 
         // The ModifyDnRequest tag
         BerValue.encodeSequence( buffer, LdapCodecConstants.MODIFY_DN_REQUEST_TAG, start );
diff --git a/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/LdapDecoderTest.java b/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/LdapDecoderTest.java
index cf030c9b3..0dfbed1b7 100644
--- a/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/LdapDecoderTest.java
+++ b/ldap/codec/core/src/test/java/org/apache/directory/api/ldap/codec/LdapDecoderTest.java
@@ -35,11 +35,13 @@ 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.LdapApiService;
 import org.apache.directory.api.ldap.codec.api.LdapDecoder;
 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.codec.osgi.DefaultLdapCodecService;
 import org.apache.directory.api.ldap.model.exception.ResponseCarryingMessageException;
 import org.apache.directory.api.ldap.model.message.BindRequest;
 import org.apache.directory.api.ldap.model.message.Message;
@@ -538,4 +540,37 @@ public class LdapDecoderTest extends AbstractCodecServiceTest
         // Decode a PDU which is going to be bigger than the MAX PDU size: should throw an exception
         assertThrows( DecoderException.class, () -> { Asn1Decoder.decode( stream, container ); } );
     }
+    
+    
+    @Test
+    public void testNullRdnModifyDnRequest() throws DecoderException, EncoderException
+    {
+        String base64Bytes = "MHoCAwAxSmxKSixKShISbmRyb2lkEkpKPQIsAEpKEhJuZHJvaWQSSko9AiwASiFKLA==";
+        
+        byte[] input = java.util.Base64.getDecoder().decode(base64Bytes);
+        ByteBuffer stream = ByteBuffer.allocate(input.length);
+        stream.put(input);
+        stream.flip();
+
+        LdapApiService codec = new DefaultLdapCodecService();
+        LdapMessageContainer<Message> container = new LdapMessageContainer<>(codec);
+
+        try {
+            Asn1Decoder.decode(stream, container);
+        } catch (DecoderException de) {
+            // we expect DecoderException
+            return;
+        }
+
+        Asn1Buffer buffer = new Asn1Buffer();
+
+        Message message = container.getMessage();
+        if (message == null) {
+            return;
+        }
+
+        assertThrows( EncoderException.class, () -> { LdapEncoder.encodeMessage(buffer, codec, message ); } );
+
+        buffer.clear();
+    }
 }