Uploaded image for project: 'Directory Client API'
  1. Directory Client API
  2. DIRAPI-283

We don't need to parse the DN when storing a name in the LDAP requests

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.0.0-M33
    • Fix Version/s: 1.0.0-RC2
    • Labels:
      None

      Description

      When we store a name in a LDAP request, we usually parse it to see if it's a valid DN. For instance, in the BindRequestImpl class :

          /**
           * {@inheritDoc}
           */
          public BindRequest setName( String name )
          {
              this.name = name;
      
              try
              {
                  this.dn = new Dn( name );
              }
              catch ( LdapInvalidDnException e )
              {
                  // This might still be a valid DN (Windows AD binding for instance)
                  LOG.debug( "Unable to convert the name to a DN." );
                  this.dn = null;
              }
      
              return this;
          }
      

      which get called in the StoreName method :

          /**
           * {@inheritDoc}
           */
          public void action( LdapMessageContainer<BindRequestDecorator> container ) throws DecoderException
          {
              BindRequest bindRequestMessage = container.getMessage();
      
              // Get the Value and store it in the BindRequest
              TLV tlv = container.getCurrentTLV();
      
              // We have to handle the special case of a 0 length name
              if ( tlv.getLength() == 0 )
              {
                  bindRequestMessage.setName( "" );
              }
              else
              {
                  byte[] nameBytes = tlv.getValue().getData();
                  String nameStr = Strings.utf8ToString( nameBytes );
      
                  try
                  {
                      // Testing the name as a DN
                      new Dn( nameStr );
                      bindRequestMessage.setName( nameStr );
                  }
                  catch ( LdapInvalidDnException ine )
                  {
                      String msg = "Incorrect DN given : " + nameStr + " (" + Strings.dumpBytes( nameBytes )
                          + ") is invalid";
      ...
      

      As we can see, we first try to parse the DN, then we call the setName method with the String, and this method will parse the DN again...

      Even worse : on the server, we need a schema aware version of the DN, which means we process the {(DN}} again to apply the SchemaManager on it.

      That is clearly a waste of CPU : it's for the server to check the DN, this is not the decoder role.

      For all the other request, we are checking if the DN is valid, which is already overdoing, but at least, we don't parse the DN twice.

        Activity

        Show
        elecharny Emmanuel Lecharny added a comment - Fixed with http://svn.apache.org/viewvc?rev=1764905&view=rev
        Hide
        elecharny Emmanuel Lecharny added a comment -

        The StoreName.action() method should simply not try to parse the {{Dn}.

        Show
        elecharny Emmanuel Lecharny added a comment - The StoreName.action() method should simply not try to parse the {{Dn}.

          People

          • Assignee:
            Unassigned
            Reporter:
            elecharny Emmanuel Lecharny
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development