Issue Details (XML | Word | Printable)

Key: DIRSERVER-334
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Blocker Blocker
Assignee: Alex Karasulu
Reporter: Emmanuel Lecharny
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Directory ApacheDS

Pb with case sensitivity for attributes

Created: 13/Aug/05 07:11 AM   Updated: 24/Jun/06 08:41 PM
Return to search
Component/s: None
Affects Version/s: None
Fix Version/s: None

Time Tracking:
Not Specified

Resolution Date: 13/Aug/05 04:38 PM


 Description  « Hide
There is a huge problem with attributes. They are supposed to be case insensitive (RFC 2251, par. 2.5.1: "... they must be IA5 (ASCII) strings, and they are case insensitive (e.g. "foo@bar.com" will match "FOO@BAR.COM")")

If we use the BasicAttribute class (javax.naming.directory.BasicAttribute) without lowercasing the attribute's name, there is no way to guarantee that we could do a attributes.get( <name>.toLowerCase() ) with a correct response.

This usage is spreaded all over the code and need to be fixed.

As an example, here is a snapshot of a working code :

        /*
         * create objectClass=top, objectClass=organizationalUnit
         */
        Attributes attributes = new BasicAttributes();
        Attribute attribute = new BasicAttribute( "objectClass".toLowerCase() ); // we MUST lowercase the attribute's name
        attribute.add( "top" );
        attribute.add( "organizationalUnit" );
        attributes.put( attribute );
        
        Attribute attr = attributes.get("objectclass".toLowerCase());
        Attribute attr2 = attributes.get("objectClass".toLowerCase());
        Assert.assertTrue( attr == attr2 ); // no problem, they are equal.

        /*
         * The same piece of code, without the lowerCase()
         */
        Attributes attributes = new BasicAttributes();
        Attribute attribute = new BasicAttribute( "objectClass");
        attribute.add( "top" );
        attribute.add( "organizationalUnit" );
        attributes.put( attribute );
        
        Attribute attr = attributes.get("objectclass");
        Attribute attr2 = attributes.get("objectClass");
        Assert.assertTrue( attr == attr2 ); // they are different, as attr is null.




 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Emmanuel Lecharny added a comment - 13/Aug/05 07:20 AM
I have found 177 reference to BasicAttribute through the code, but many of them ar imports.

org.apache.dns.store.DnsRecordStateFactory.getStateToBind(),
org.apache.kerberos.store.operations.ChangePassword.execute()
org.apache.kerberos.store.operations.GetPrincipal.execute()
org.apache.ldap.common.ldif.LdifEntry.addModificationItem()
org.apache.ldap.server.exception.ExceptionServiceTest.testFailAddOnAlias()
...

Emmanuel Lecharny added a comment - 13/Aug/05 02:11 PM
The fact is that when creating a BasicAttribute and adding it to a BasicAttributes, the latter MUST have been created using the constructor that declares it as case insensitive :
        /*
         * create objectClass=top, objectClass=organizationalUnit
         */
        boolean IGNORE_CASE = true;
        Attributes attributes = new BasicAttributes( IGNORE_CASE ); // Declares the BasicAttributes as case insensitive
        
        Attribute attribute = new BasicAttribute( "objectClass" );
        attribute.add( "top" );
        attribute.add( "organizationalUnit" );
        attributes.put( attribute );
        
        Attribute attr = attributes.get("objectclass");
        Attribute attr2 = attributes.get("objectClass");
        Assert.assertTrue( attr == attr2 ); // They now are equal

There are places in the code where this is done, othere where it's not :
org.apache.ldap.server.configuration.ContextPartitionConfiguration :
     private Attributes contextEntry = new BasicAttributes(); // Should be new BasicAttributes( true );



Alex Karasulu added a comment - 13/Aug/05 04:38 PM
Committed changes that correct all misuses of BasicAttributes here:

http://svn.apache.org/viewcvs?rev=232433&view=rev

Now all BasicAttriubtes are case insensitive for attribute Ids. This is consistent across the board.

Emmanuel Lecharny added a comment - 24/Jun/06 08:41 PM
done