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 2008/06/03 15:19:43 UTC

svn commit: r662782 - in /directory/shared/trunk/ldap/src: main/java/org/apache/directory/shared/ldap/name/RdnParser.java main/java/org/apache/directory/shared/ldap/util/DNUtils.java test/java/org/apache/directory/shared/ldap/name/RdnTest.java

Author: elecharny
Date: Tue Jun  3 06:19:42 2008
New Revision: 662782

URL: http://svn.apache.org/viewvc?rev=662782&view=rev
Log:
Fix for DIRSERVER-1183

Modified:
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/RdnParser.java
    directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java
    directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/RdnParser.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/RdnParser.java?rev=662782&r1=662781&r2=662782&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/RdnParser.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/RdnParser.java Tue Jun  3 06:19:42 2008
@@ -420,6 +420,7 @@
             pos.length = 0;
             pos.end = pos.start;
             int nbBytes = 0;
+            int length = 0;
 
             // <attributeValue> ::= '"' <quotechar-or-pair> '"'
             // <quotechar-or-pairs> ::= <quotechar> <quotechar-or-pairs> | '\'
@@ -431,22 +432,40 @@
                     pos.end++;
                     int nbChars = 0;
 
-                    if ( ( nbChars = DNUtils.countPairChar( bytes, pos.start ) ) != DNUtils.PARSING_ERROR )
+                    if ( ( nbChars = DNUtils.countPairChar( bytes, pos.end ) ) == DNUtils.PARSING_ERROR )
                     {
-                        pos.end += nbChars;
+                        return null;
                     }
                     else
                     {
-                        return null;
+                        if ( nbChars == 1 )
+                        {
+                            buffer[currPos++] = bytes[pos.end];
+                        }
+                        else
+                        {
+                            byte b = StringTools.getHexValue( bytes[pos.end], bytes[pos.end + 1] );
+
+                            buffer[currPos++] = b;
+                        }
+                        
+                        pos.end += nbChars;
+                        length += nbChars;
                     }
                 }
                 else if ( ( nbBytes = DNUtils.isQuoteChar( bytes, pos.end ) ) != DNUtils.PARSING_ERROR )
                 {
+                    for ( int i = 0; i < nbBytes; i++ )
+                    {
+                        buffer[currPos++] = bytes[pos.end + i];
+                    }
+                    
                     pos.end += nbBytes;
+                    length += nbBytes;
                 }
                 else
                 {
-                    pos.length = pos.end - pos.start;
+                    //pos.length = pos.end - pos.start;
                     break;
                 }
             }
@@ -454,7 +473,8 @@
             if ( StringTools.isCharASCII( bytes, pos.end, '"' ) )
             {
                 pos.end++;
-                return StringTools.utf8ToString( bytes, pos.start, pos.length );
+                return StringTools.utf8ToString( buffer, length );
+                //return StringTools.utf8ToString( bytes, pos.start, pos.length );
             }
             else
             {
@@ -464,7 +484,6 @@
         else
         {
             int escapedSpace = -1;
-            boolean hasPairChar = false;
 
             while ( true )
             {
@@ -474,6 +493,7 @@
                     pos.end++;
 
                     int nbChars = 0;
+                    
                     if ( ( nbChars = DNUtils.countPairChar( bytes, pos.end ) ) == DNUtils.PARSING_ERROR )
                     {
                         return null;
@@ -486,11 +506,6 @@
                         }
                         else
                         {
-                            if ( !hasPairChar )
-                            {
-                                hasPairChar = true;
-                            }
-
                             byte b = StringTools.getHexValue( bytes[pos.end], bytes[pos.end + 1] );
 
                             buffer[currPos++] = b;
@@ -647,7 +662,7 @@
                     pos.end++;
                     int nbChars = 0;
 
-                    if ( ( nbChars = DNUtils.countPairChar( bytes, pos.start ) ) != DNUtils.PARSING_ERROR )
+                    if ( ( nbChars = DNUtils.countPairChar( bytes, pos.end ) ) != DNUtils.PARSING_ERROR )
                     {
                         pos.end += nbChars;
                     }

Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java?rev=662782&r1=662781&r2=662782&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/DNUtils.java Tue Jun  3 06:19:42 2008
@@ -19,14 +19,12 @@
  */
 package org.apache.directory.shared.ldap.util;
 
-import org.apache.directory.shared.ldap.util.Position;
-import org.apache.directory.shared.ldap.util.StringTools;
-
 
 /**
  * Utility class used by the LdapDN Parser.
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
  */
 public class DNUtils
 {
@@ -123,28 +121,52 @@
         };
 
     /**
-     * ' ' | '"' | '#' | '+' | ',' | [0-9] | ';' | '<' | '=' | '>' | [A-F] | '\' |
-     * [a-f] 0x22 | 0x23 | 0x2B | 0x2C | [0x30-0x39] | 0x3B | 0x3C | 0x3D | 0x3E |
+     * ' ' | '"' | '#' | '+' | ',' | [0-9] | ';' | '<' | '=' | '>' | [A-F] | '\' | [a-f]
+     * 0x22 | 0x23 | 0x2B | 0x2C | [0x30-0x39] | 0x3B | 0x3C | 0x3D | 0x3E |
      * [0x41-0x46] | 0x5C | [0x61-0x66]
      */
     private static final boolean[] PAIR_CHAR =
         { 
-            false, false, false, false, false, false, false, false, 
-            false, false, false, false, false, false, false, false, 
-            false, false, false, false, false, false, false, false, 
-            false, false, false, false, false, false, false, false, 
-            true,  false, true,  true,  false, false, false, false, 
-            false, false, false, true,  true,  false, false, false, 
-            true,  true,  true,  true,  true,  true,  true,  true, 
-            true,  true,  false, true,  true,  true,  true,  false, 
-            false, true,  true,  true,  true,  true,  true,  false, 
-            false, false, false, false, false, false, false, false, 
-            false, false, false, false, false, false, false, false, 
-            false, false, false, false, true,  false, false, false, 
-            false, true,  true,  true,  true,  true,  true,  false, 
-            false, false, false, false, false, false, false, false, 
-            false, false, false, false, false, false, false, false, 
-            false, false, false, false, false, false, false, false 
+            false, false, false, false, false, false, false, false, // 00 -> 07
+            false, false, false, false, false, false, false, false, // 08 -> 0F
+            false, false, false, false, false, false, false, false, // 10 -> 17
+            false, false, false, false, false, false, false, false, // 18 -> 1F
+            true,  false, true,  true,  false, false, false, false, // 20 -> 27 ( ' ', '"', '#' )
+            false, false, false, true,  true,  false, false, false, // 28 -> 2F ( '+', ',' )
+            true,  true,  true,  true,  true,  true,  true,  true,  // 30 -> 37 ( '0'..'7' )
+            true,  true,  false, true,  true,  true,  true,  false, // 38 -> 3F ( '8', '9', ';', '<', '=', '>' ) 
+            false, true,  true,  true,  true,  true,  true,  false, // 40 -> 47 ( 'A', 'B', 'C', 'D', 'E', 'F' )
+            false, false, false, false, false, false, false, false, // 48 -> 4F
+            false, false, false, false, false, false, false, false, // 50 -> 57
+            false, false, false, false, true,  false, false, false, // 58 -> 5F ( '\' )
+            false, true,  true,  true,  true,  true,  true,  false, // 60 -> 67 ( 'a', 'b', 'c', 'd', 'e', 'f' )
+            false, false, false, false, false, false, false, false, // 68 -> 6F
+            false, false, false, false, false, false, false, false, // 70 -> 77
+            false, false, false, false, false, false, false, false  // 78 -> 7F
+        };
+
+    /**
+     * ' ' | '"' | '#' | '+' | ',' | ';' | '<' | '=' | '>' | '\' |
+     * 0x22 | 0x23 | 0x2B | 0x2C | 0x3B | 0x3C | 0x3D | 0x3E | 0x5C
+     */
+    private static final boolean[] PAIR_CHAR_ONLY =
+        { 
+            false, false, false, false, false, false, false, false, // 00 -> 07
+            false, false, false, false, false, false, false, false, // 08 -> 0F
+            false, false, false, false, false, false, false, false, // 10 -> 17
+            false, false, false, false, false, false, false, false, // 18 -> 1F
+            true,  false, true,  true,  false, false, false, false, // 20 -> 27 ( ' ', '"', '#' )
+            false, false, false, true,  true,  false, false, false, // 28 -> 2F ( '+', ',' )
+            false, false, false, false, false, false, false, false, // 30 -> 37
+            false, false, false, true,  true,  true,  true,  false, // 38 -> 3F ( ';', '<', '=', '>' ) 
+            false, false, false, false, false, false, false, false, // 40 -> 47
+            false, false, false, false, false, false, false, false, // 48 -> 4F
+            false, false, false, false, false, false, false, false, // 50 -> 57
+            false, false, false, false, true,  false, false, false, // 58 -> 5F ( '\' )
+            false, false, false, false, false, false, false, false, // 60 -> 67
+            false, false, false, false, false, false, false, false, // 68 -> 6F
+            false, false, false, false, false, false, false, false, // 70 -> 77
+            false, false, false, false, false, false, false, false  // 78 -> 7F
         };
 
     /**
@@ -202,7 +224,7 @@
         {
             byte c = bytes[index];
 
-            if ( ( ( c | 0x7F ) != 0x7F ) || ( SAFE_INIT_CHAR[c] == false ) )
+            if ( ( ( c | 0x7F ) != 0x7F ) || ( !SAFE_INIT_CHAR[c] ) )
             {
                 return -1;
             }
@@ -213,7 +235,7 @@
             {
                 c = bytes[index];
 
-                if ( ( ( c | 0x7F ) != 0x7F ) || ( SAFE_CHAR[c] == false ) )
+                if ( ( ( c | 0x7F ) != 0x7F ) || ( !SAFE_CHAR[c] ) )
                 {
                     break;
                 }
@@ -244,13 +266,13 @@
         {
             byte b = bytes[index++];
 
-            if ( StringTools.isAlpha( b ) == false )
+            if ( StringTools.isAlpha( b ) )
             {
-                return -1;
+                return index-1;
             }
             else
             {
-                return index;
+                return -1;
             }
         }
     }
@@ -274,19 +296,23 @@
         {
             byte c = bytes[index];
 
-            if ( ( ( c | 0x7F ) != 0x7F )  || ( PAIR_CHAR[c] == false ) )
+            if ( ( ( c | 0x7F ) != 0x7F )  || ( !PAIR_CHAR[c] ) )
             {
                 return false;
             }
             else
             {
-                if ( StringTools.isHex( bytes, index++ ) )
+                if ( PAIR_CHAR_ONLY[c] )
+                {
+                    return true;
+                }
+                else if ( StringTools.isHex( bytes, index++ ) )
                 {
                     return StringTools.isHex( bytes, index );
                 }
                 else
                 {
-                    return true;
+                    return false;
                 }
             }
         }
@@ -320,19 +346,23 @@
         {
             byte c = bytes[index];
 
-            if ( ( ( c | 0x7F ) != 0x7F )  || ( PAIR_CHAR[c] == false ) )
+            if ( ( ( c | 0x7F ) != 0x7F )  || ( !PAIR_CHAR[c] ) )
             {
                 return PARSING_ERROR;
             }
             else
             {
-                if ( StringTools.isHex( bytes, index++ ) )
+                if ( PAIR_CHAR_ONLY[c] )
+                {
+                    return 1;
+                }
+                else if ( StringTools.isHex( bytes, index++ ) )
                 {
                     return StringTools.isHex( bytes, index ) ? 2 : PARSING_ERROR;
                 }
                 else
                 {
-                    return 1;
+                    return PARSING_ERROR;
                 }
             }
         }
@@ -532,7 +562,7 @@
         {
             byte c = bytes[index];
 
-            if ( ( ( c | 0x7F ) != 0x7F )  || ( BASE64_CHAR[c] == false ) )
+            if ( ( ( c | 0x7F ) != 0x7F )  || ( !BASE64_CHAR[c] ) )
             {
                 return -1;
             }
@@ -543,7 +573,7 @@
             {
                 c = bytes[index];
 
-                if ( ( ( c | 0x7F ) != 0x7F )  || ( BASE64_CHAR[c] == false ) )
+                if ( ( ( c | 0x7F ) != 0x7F )  || ( !BASE64_CHAR[c] ) )
                 {
                     break;
                 }

Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java?rev=662782&r1=662781&r2=662782&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java Tue Jun  3 06:19:42 2008
@@ -1257,4 +1257,22 @@
         assertEquals( "a=", new Rdn( "a=" ).toString() );
     }
 
+    /**
+     * test an RDN with escaped comma
+     */
+    @Test
+    public void testRdnWithEscapedComa() throws InvalidNameException
+    {
+        assertTrue( RdnParser.isValid( "a=b\\,c" ) );
+        assertEquals( "a=b\\,c", new Rdn( "a=b\\,c" ).toString() );
+
+        assertTrue( RdnParser.isValid( "a=\"b,c\"" ) );
+        assertEquals( "a=b\\,c", new Rdn( "a=\"b,c\"" ).toString() );
+        assertEquals( "a=\"b,c\"", new Rdn( "a=\"b,c\"" ).getUpName() );
+
+        assertTrue( RdnParser.isValid( "a=\"b\\,c\"" ) );
+        Rdn rdn = new Rdn( "a=\"b\\,c\"" );
+        assertEquals( "a=\"b\\,c\"", new Rdn( "a=\"b\\,c\"" ).getUpName() );
+        assertEquals( "a=b\\,c", new Rdn( "a=\"b\\,c\"" ).toString() );
+    }
 }