mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

dugan
10.54.2007 36d4f701f6a7ff14626af42259686f2751ac1d0f
Define the configuration option "ds-cfg-strip-syntax-minimum-upper-bound" to strip the 
suggested minimum upper bound value from the schema definition attribute type description
syntax oid. For example:

attributeTypes: ( 2.5.4.41 NAME 'name' EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768}
X-ORIGIN 'RFC 4519' )

to

attributeTypes: ( 2.5.4.41 NAME 'name' EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
X-ORIGIN 'RFC 4519' )

Setting this option to true will strip these values. The default behavior is to return
the value. The server must be rebooted after the value has been changed.

This is to provide a server work around for a bug in the JNDI
getAttributeSyntaxDefinition method that incorrectly uses the value as part of the
syntax name.
1 files added
3 files modified
175 ■■■■ changed files
opends/resource/config/config.ldif 1 ●●●● patch | view | raw | blame | history
opends/resource/schema/02-config.ldif 9 ●●●●● patch | view | raw | blame | history
opends/src/admin/defn/org/opends/server/admin/std/AttributeTypeDescriptionAttributeSyntaxConfiguration.xml 74 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/schema/AttributeTypeSyntax.java 91 ●●●● patch | view | raw | blame | history
opends/resource/config/config.ldif
@@ -1433,6 +1433,7 @@
dn: cn=Attribute Type Description,cn=Syntaxes,cn=config
objectClass: top
objectClass: ds-cfg-attribute-syntax
objectClass: ds-cfg-attribute-type-description-attribute-syntax
cn: Attribute Type Description
ds-cfg-syntax-class: org.opends.server.schema.AttributeTypeSyntax
ds-cfg-syntax-enabled: true
opends/resource/schema/02-config.ldif
@@ -1463,6 +1463,10 @@
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.430
  NAME 'ds-cfg-default-auth-password-storage-scheme'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.435
  NAME 'ds-cfg-strip-syntax-minimum-upper-bound'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE
  X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.1
  NAME 'ds-cfg-access-control-handler' SUP top STRUCTURAL
  MUST ( cn $ ds-cfg-acl-handler-class $ ds-cfg-acl-handler-enabled )
@@ -1479,6 +1483,11 @@
objectClasses: ( 1.3.6.1.4.1.26027.1.2.3 NAME 'ds-cfg-attribute-syntax'
  SUP top STRUCTURAL MUST ( cn $ ds-cfg-syntax-class $ ds-cfg-syntax-enabled )
  X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.116
  NAME 'ds-cfg-attribute-type-description-attribute-syntax'
  SUP ds-cfg-attribute-syntax  STRUCTURAL
  MAY ( ds-cfg-strip-syntax-minimum-upper-bound )
  X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.4
  NAME 'ds-cfg-telephone-number-attribute-syntax'
  SUP ds-cfg-attribute-syntax STRUCTURAL
opends/src/admin/defn/org/opends/server/admin/std/AttributeTypeDescriptionAttributeSyntaxConfiguration.xml
New file
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
! CDDL HEADER START
!
! The contents of this file are subject to the terms of the
! Common Development and Distribution License, Version 1.0 only
! (the "License").  You may not use this file except in compliance
! with the License.
!
! You can obtain a copy of the license at
! trunk/opends/resource/legal-notices/OpenDS.LICENSE
! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
! See the License for the specific language governing permissions
! and limitations under the License.
!
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
!      Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
!
!      Portions Copyright 2007 Sun Microsystems, Inc.
! -->
<adm:managed-object name="attribute-type-description-attribute-syntax"
plural-name="attribute-type-description-attribute-syntaxes"
extends="attribute-syntax"
package="org.opends.server.admin.std" abstract="false"
xmlns:adm="http://www.opends.org/admin"
xmlns:ldap="http://www.opends.org/admin-ldap">
  <adm:synopsis>
    <adm:user-friendly-plural-name />
    describe the format of the directory schema attribute type definitions.
  </adm:synopsis>
  <adm:profile name="ldap">
    <ldap:object-class>
      <ldap:oid>11.3.6.1.4.1.26027.1.2.116</ldap:oid>
      <ldap:name>ds-cfg-attribute-type-description-attribute-syntax</ldap:name>
      <ldap:superior>ds-cfg-attribute-syntax</ldap:superior>
    </ldap:object-class>
  </adm:profile>
  <adm:property name="strip-syntax-minimum-upper-bound" mandatory="false">
    <adm:synopsis>
      Indicate whether the suggested minimum upper bound appended
      to an attribute's syntax OID in it's schema definition Attribute Type
      Description is stripped off. When retrieving the server's schema, some API's
      (JNDI) fail in their syntax lookup methods because they don't parse this value
      correctly. This configuration option allows the server to be configured to
      provide schema definitions these APIs can parse correctly.
    </adm:synopsis>
    <adm:default-behavior>
      <adm:defined>
        <adm:value>false</adm:value>
      </adm:defined>
    </adm:default-behavior>
    <adm:syntax>
      <adm:boolean />
    </adm:syntax>
    <adm:profile name="ldap">
      <ldap:attribute>
        <ldap:oid>1.3.6.1.4.1.26027.1.1.435</ldap:oid>
        <ldap:name>ds-cfg-strip-syntax-minimum-upper-bound</ldap:name>
      </ldap:attribute>
    </adm:profile>
  </adm:property>
</adm:managed-object>
opends/src/server/org/opends/server/schema/AttributeTypeSyntax.java
@@ -34,7 +34,8 @@
import java.util.LinkedList;
import java.util.List;
import org.opends.server.admin.std.server.AttributeSyntaxCfg;
import org.opends.server.admin.std.server.*;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.api.ApproximateMatchingRule;
import org.opends.server.api.AttributeSyntax;
import org.opends.server.api.EqualityMatchingRule;
@@ -42,17 +43,10 @@
import org.opends.server.api.SubstringMatchingRule;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeUsage;
import org.opends.server.types.ByteString;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InitializationException;
import org.opends.server.types.ResultCode;
import org.opends.server.types.Schema;
import static org.opends.server.loggers.debug.DebugLogger.*;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.*;
import static org.opends.server.messages.MessageHandler.*;
import static org.opends.server.messages.SchemaMessages.*;
import static org.opends.server.schema.SchemaConstants.*;
@@ -67,14 +61,18 @@
 * syntax is defined in RFC 2252.
 */
public class AttributeTypeSyntax
       extends AttributeSyntax<AttributeSyntaxCfg>
{
    extends AttributeSyntax<AttributeTypeDescriptionAttributeSyntaxCfg>
    implements
       ConfigurationChangeListener<AttributeTypeDescriptionAttributeSyntaxCfg> {
  /**
   * The tracer object for the debug logger.
   */
  private static final DebugTracer TRACER = getTracer();
  // The reference to the configuration for this attribute type description
  // syntax.
  private AttributeTypeDescriptionAttributeSyntaxCfg currentConfig;
  // The default equality matching rule for this syntax.
@@ -86,7 +84,8 @@
  // The default substring matching rule for this syntax.
  private SubstringMatchingRule defaultSubstringMatchingRule;
  // If true strip the suggested minimum upper bound from the syntax OID.
  private static boolean stripMinimumUpperBound=false;
  /**
   * Creates a new instance of this syntax.  Note that the only thing that
@@ -104,7 +103,8 @@
  /**
   * {@inheritDoc}
   */
  public void initializeSyntax(AttributeSyntaxCfg configuration)
  public void
  initializeSyntax(AttributeTypeDescriptionAttributeSyntaxCfg configuration)
         throws ConfigException, InitializationException
  {
    defaultEqualityMatchingRule =
@@ -136,6 +136,19 @@
                                  SYNTAX_ATTRIBUTE_TYPE_NAME);
      throw new InitializationException(msgID, message);
    }
    // This syntax is one of the Directory Server's core syntaxes and therefore
    // it may be instantiated at times without a configuration entry.  If that
    // is the case, then we'll exit now before doing anything that could require
    // access to that entry.
    if (configuration == null)
    {
      return;
    }
    currentConfig = configuration;
    currentConfig.addAttributeTypeDescriptionChangeListener(this);
    stripMinimumUpperBound=configuration.isStripSyntaxMinimumUpperBound();
  }
@@ -656,13 +669,13 @@
        // of characters that should be allowed in values of that type.  This
        // implementation will ignore any such length because it does not
        // impose any practical limit on the length of attribute values.
        boolean inBrace         = false;
        boolean lastWasPeriod   = false;
        int leftBracePos=0;
        StringBuilder oidBuffer = new StringBuilder();
        while (pos < length)
        {
          c = lowerStr.charAt(pos++);
          if (inBrace)
          if (leftBracePos != 0)
          {
            // The only thing we'll allow here will be numeric digits and the
            // closing curly brace.
@@ -678,7 +691,18 @@
                               ResultCode.INVALID_ATTRIBUTE_SYNTAX, message,
                               msgID);
              }
              //If option ds-cfg-strip-syntax-minimum-upper-bound is true,
              //remove minimum number specification (including braces) because
              //it breaks some syntax retrieval APIs such as JNDI's
              //getAttributeSyntaxDefinition().
              if(stripMinimumUpperBound) {
                String firstPart=
                         value.stringValue().substring(0,leftBracePos-1);
                String secPart=value.stringValue().substring(pos);
                StringBuilder tmpBuffer=
                        new StringBuilder(firstPart).append(secPart);
                value.setValue(tmpBuffer.toString().getBytes());
              }
              break;
            }
            else if (! isDigit(c))
@@ -716,8 +740,10 @@
            }
            else if (c == '{')
            {
              // It's the start of the length specification.
              inBrace = true;
              // It's the start of the length specification. Keep an index
              //to this character because the specification will need to be
              //removed.
              leftBracePos=pos;
            }
            else if (c == ' ')
            {
@@ -1437,5 +1463,34 @@
    return startPos;
  }
  /**
   * {@inheritDoc}
   */
  public ConfigChangeResult applyConfigurationChange(
              AttributeTypeDescriptionAttributeSyntaxCfg configuration)
  {
    currentConfig = configuration;
    stripMinimumUpperBound = configuration.isStripSyntaxMinimumUpperBound();
    return new ConfigChangeResult(ResultCode.SUCCESS, false);
  }
  /**
   * {@inheritDoc}
   */
  public boolean isConfigurationChangeAcceptable(
                      AttributeTypeDescriptionAttributeSyntaxCfg configuration,
                      List<String> unacceptableReasons)
  {
    // The configuration will always be acceptable.
    return true;
  }
}