Author: akarasulu Date: Wed Aug 16 10:03:01 2006 New Revision: 431946 URL: http://svn.apache.org/viewvc?rev=431946&view=rev Log: Fix for DIRSERVER-704: Values in operational attributes creatorsName and modifiersName contain OID instead of attribute name Modified: directory/branches/apacheds/1.0/core-unit/src/test/java/org/apache/directory/server/core/jndi/SearchContextITest.java directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/MutableStartupConfiguration.java directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/StartupConfiguration.java directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/operational/OperationalAttributeService.java directory/branches/apacheds/1.0/server-installers/src/main/installers/server.xml directory/branches/apacheds/1.0/server-jndi/src/main/java/org/apache/directory/server/configuration/MutableServerStartupConfiguration.java directory/branches/apacheds/1.0/server-main/server.xml Modified: directory/branches/apacheds/1.0/core-unit/src/test/java/org/apache/directory/server/core/jndi/SearchContextITest.java URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/core-unit/src/test/java/org/apache/directory/server/core/jndi/SearchContextITest.java?rev=431946&r1=431945&r2=431946&view=diff ============================================================================== --- directory/branches/apacheds/1.0/core-unit/src/test/java/org/apache/directory/server/core/jndi/SearchContextITest.java (original) +++ directory/branches/apacheds/1.0/core-unit/src/test/java/org/apache/directory/server/core/jndi/SearchContextITest.java Wed Aug 16 10:03:01 2006 @@ -48,6 +48,11 @@ { protected void setUp() throws Exception { + if ( this.getName().equals( "testOpAttrDenormalizationOn" ) ) + { + super.configuration.setDenormalizeOpAttrsEnabled( true ); + } + super.setUp(); /* @@ -492,6 +497,54 @@ assertTrue( "contains ou=testing00,ou=system", map.containsKey( "ou=testing00,ou=system" ) ); assertTrue( "contains ou=testing01,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); assertTrue( "contains ou=testing02,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); + } + + + public void testOpAttrDenormalizationOff() throws Exception + { + SearchControls controls = new SearchControls(); + controls.setSearchScope( SearchControls.ONELEVEL_SCOPE ); + controls.setDerefLinkFlag( false ); + controls.setReturningAttributes( new String[] { "creatorsName" } ); + sysRoot.addToEnvironment( DerefAliasesEnum.JNDI_PROP, DerefAliasesEnum.NEVERDEREFALIASES.getName() ); + HashMap map = new HashMap(); + + NamingEnumeration list = sysRoot.search( "", "(ou=testing00)", controls ); + while ( list.hasMore() ) + { + SearchResult result = ( SearchResult ) list.next(); + map.put( result.getName(), result.getAttributes() ); + } + + assertEquals( "Expected number of results returned was incorrect!", 1, map.size() ); + assertTrue( map.containsKey( "ou=testing00,ou=system" ) ); + Attributes attrs = ( Attributes ) map.get( "ou=testing00,ou=system" ); + assertEquals( "normalized creator's name", "0.9.2342.19200300.100.1.1=admin,2.5.4.11=system", + attrs.get( "creatorsName" ).get() ); + } + + + public void testOpAttrDenormalizationOn() throws Exception + { + SearchControls controls = new SearchControls(); + controls.setSearchScope( SearchControls.ONELEVEL_SCOPE ); + controls.setDerefLinkFlag( false ); + controls.setReturningAttributes( new String[] { "creatorsName" } ); + sysRoot.addToEnvironment( DerefAliasesEnum.JNDI_PROP, DerefAliasesEnum.NEVERDEREFALIASES.getName() ); + HashMap map = new HashMap(); + + NamingEnumeration list = sysRoot.search( "", "(ou=testing00)", controls ); + while ( list.hasMore() ) + { + SearchResult result = ( SearchResult ) list.next(); + map.put( result.getName(), result.getAttributes() ); + } + + assertEquals( "Expected number of results returned was incorrect!", 1, map.size() ); + assertTrue( map.containsKey( "ou=testing00,ou=system" ) ); + Attributes attrs = ( Attributes ) map.get( "ou=testing00,ou=system" ); + assertEquals( "normalized creator's name", "uid=admin,ou=system", + attrs.get( "creatorsName" ).get() ); } Modified: directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/MutableStartupConfiguration.java URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/MutableStartupConfiguration.java?rev=431946&r1=431945&r2=431946&view=diff ============================================================================== --- directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/MutableStartupConfiguration.java (original) +++ directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/MutableStartupConfiguration.java Wed Aug 16 10:03:01 2006 @@ -143,4 +143,10 @@ { super.setExitVmOnShutdown( exitVmOnShutdown ); } + + + public void setDenormalizeOpAttrsEnabled( boolean denormalizeOpAttrsEnabled ) + { + super.setDenormalizeOpAttrsEnabled( denormalizeOpAttrsEnabled ); + } } Modified: directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/StartupConfiguration.java URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/StartupConfiguration.java?rev=431946&r1=431945&r2=431946&view=diff ============================================================================== --- directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/StartupConfiguration.java (original) +++ directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/configuration/StartupConfiguration.java Wed Aug 16 10:03:01 2006 @@ -65,6 +65,7 @@ private boolean shutdownHookEnabled = true; // allow by default private boolean allowAnonymousAccess = true; // allow by default private boolean accessControlEnabled = false; // turn off by default + private boolean denormalizeOpAttrsEnabled = false; private int maxThreads = MAX_THREADS_DEFAULT; // set to default value private int maxSizeLimit = MAX_SIZE_LIMIT_DEFAULT; // set to default value private int maxTimeLimit = MAX_TIME_LIMIT_DEFAULT; // set to default value (milliseconds) @@ -502,5 +503,17 @@ public PartitionConfiguration getSystemPartitionConfiguration() { return systemPartitionConfiguration; + } + + + public boolean isDenormalizeOpAttrsEnabled() + { + return denormalizeOpAttrsEnabled; + } + + + protected void setDenormalizeOpAttrsEnabled( boolean denormalizeOpAttrsEnabled ) + { + this.denormalizeOpAttrsEnabled = denormalizeOpAttrsEnabled; } } Modified: directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/operational/OperationalAttributeService.java URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/operational/OperationalAttributeService.java?rev=431946&r1=431945&r2=431946&view=diff ============================================================================== --- directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/operational/OperationalAttributeService.java (original) +++ directory/branches/apacheds/1.0/core/src/main/java/org/apache/directory/server/core/operational/OperationalAttributeService.java Wed Aug 16 10:03:01 2006 @@ -18,11 +18,13 @@ import java.util.HashSet; +import java.util.Iterator; import java.util.Map; import javax.naming.Name; import javax.naming.NamingEnumeration; import javax.naming.NamingException; +import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; @@ -45,8 +47,11 @@ import org.apache.directory.shared.ldap.filter.ExprNode; import org.apache.directory.shared.ldap.schema.AttributeType; import org.apache.directory.shared.ldap.schema.UsageEnum; +import org.apache.directory.shared.ldap.util.AttributeUtils; import org.apache.directory.shared.ldap.util.DateUtils; +import org.apache.directory.shared.ldap.name.AttributeTypeAndValue; import org.apache.directory.shared.ldap.name.LdapDN; +import org.apache.directory.shared.ldap.name.Rdn; /** @@ -60,6 +65,20 @@ */ public class OperationalAttributeService extends BaseInterceptor { + private final SearchResultFilter DENORMALIZING_SEARCH_FILTER = new SearchResultFilter() + { + public boolean accept( Invocation invocation, SearchResult result, SearchControls controls ) + throws NamingException + { + if ( controls.getReturningAttributes() != null ) + { + return filterDenormalized( result.getAttributes() ); + } + + return true; + } + }; + /** * the database search result filter to register with filter service */ @@ -84,6 +103,8 @@ private AttributeTypeRegistry registry; + private boolean isDenormalizeOpAttrsEnabled; + /** * Creates the operational attribute management service interceptor. @@ -97,6 +118,7 @@ { nexus = factoryCfg.getPartitionNexus(); registry = factoryCfg.getGlobalRegistries().getAttributeTypeRegistry(); + isDenormalizeOpAttrsEnabled = factoryCfg.getStartupConfiguration().isDenormalizeOpAttrsEnabled(); } @@ -262,6 +284,11 @@ NamingEnumeration e = nextInterceptor.search( base, env, filter, searchCtls ); if ( searchCtls.getReturningAttributes() != null ) { + if ( isDenormalizeOpAttrsEnabled ) + { + return new SearchResultFilteringEnumeration( e, searchCtls, invocation, DENORMALIZING_SEARCH_FILTER ); + } + return e; } @@ -331,8 +358,84 @@ } } + denormalizeEntryOpAttrs( entry ); + // do nothing past here since this explicity specifies which // attributes to include - backends will automatically populate // with right set of attributes using ids array + } + + + public void denormalizeEntryOpAttrs( Attributes entry ) throws NamingException + { + if ( isDenormalizeOpAttrsEnabled ) + { + AttributeType type = registry.lookup( "creatorsName" ); + Attribute attr = AttributeUtils.getAttribute( entry, type ); + + if ( attr != null ) + { + LdapDN creatorsName = new LdapDN( ( String ) attr.get() ); + attr.set( 0, denormalizeTypes( creatorsName ).getUpName() ); + } + + type = null; + type = registry.lookup( "modifiersName" ); + attr = null; + attr = AttributeUtils.getAttribute( entry, type ); + if ( attr != null ) + { + LdapDN modifiersName = new LdapDN( ( String ) attr.get() ); + attr.set( 0, denormalizeTypes( modifiersName ).getUpName() ); + } + } + } + + + /** + * Does not create a new DN but alters existing DN by using the first + * short name for an attributeType definition. + */ + public LdapDN denormalizeTypes( LdapDN dn ) throws NamingException + { + LdapDN newDn = new LdapDN(); + + for ( int ii = 0; ii < dn.size(); ii++ ) + { + Rdn rdn = dn.getRdn( ii ); + if ( rdn.size() == 0 ) + { + newDn.add( new Rdn() ); + continue; + } + else if ( rdn.size() == 1 ) + { + newDn.add( new Rdn( registry.lookup( rdn.getType() ).getName(), rdn.getAtav().getValue() ) ); + continue; + } + + // below we only process multi-valued rdns + StringBuffer buf = new StringBuffer(); + for ( Iterator jj = rdn.iterator(); jj.hasNext(); /**/ ) + { + AttributeTypeAndValue atav = ( AttributeTypeAndValue ) jj.next(); + String type = registry.lookup( rdn.getType() ).getName(); + buf.append( type ).append( '=' ).append( atav.getValue() ); + if ( jj.hasNext() ) + { + buf.append( '+' ); + } + } + newDn.add( new Rdn(buf.toString()) ); + } + + return newDn; + } + + + private boolean filterDenormalized( Attributes entry ) throws NamingException + { + denormalizeEntryOpAttrs( entry ); + return true; } } Modified: directory/branches/apacheds/1.0/server-installers/src/main/installers/server.xml URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/server-installers/src/main/installers/server.xml?rev=431946&r1=431945&r2=431946&view=diff ============================================================================== --- directory/branches/apacheds/1.0/server-installers/src/main/installers/server.xml (original) +++ directory/branches/apacheds/1.0/server-installers/src/main/installers/server.xml Wed Aug 16 10:03:01 2006 @@ -72,6 +72,23 @@ false false false + + + false + 10389 @@ -183,7 +200,7 @@ system - 1000 + 100 ou=system @@ -202,44 +219,44 @@ 1.2.6.1.4.1.18060.1.1.1.3.1 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.2 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.3 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.4 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.5 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.6 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.7 - 100 + 10 ou - 5000 + 100 uid - 1000 + 100 objectClass - 1000 + 100 @@ -256,7 +273,7 @@ example - 1000 + 100 dc=example,dc=com @@ -275,52 +292,52 @@ 1.2.6.1.4.1.18060.1.1.1.3.1 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.2 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.3 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.4 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.5 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.6 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.7 - 100 + 10 dc - 1000 + 100 ou - 5000 + 100 krb5PrincipalName - 1000 + 100 uid - 1000 + 100 objectClass - 1000 + 100 Modified: directory/branches/apacheds/1.0/server-jndi/src/main/java/org/apache/directory/server/configuration/MutableServerStartupConfiguration.java URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/server-jndi/src/main/java/org/apache/directory/server/configuration/MutableServerStartupConfiguration.java?rev=431946&r1=431945&r2=431946&view=diff ============================================================================== --- directory/branches/apacheds/1.0/server-jndi/src/main/java/org/apache/directory/server/configuration/MutableServerStartupConfiguration.java (original) +++ directory/branches/apacheds/1.0/server-jndi/src/main/java/org/apache/directory/server/configuration/MutableServerStartupConfiguration.java Wed Aug 16 10:03:01 2006 @@ -84,6 +84,12 @@ super.setAllowAnonymousAccess( arg0 ); } + + public void setDenormalizeOpAttrsEnabled( boolean denormalizeOpAttrsEnabled ) + { + super.setDenormalizeOpAttrsEnabled( denormalizeOpAttrsEnabled ); + } + public void setAuthenticatorConfigurations( Set arg0 ) { Modified: directory/branches/apacheds/1.0/server-main/server.xml URL: http://svn.apache.org/viewvc/directory/branches/apacheds/1.0/server-main/server.xml?rev=431946&r1=431945&r2=431946&view=diff ============================================================================== --- directory/branches/apacheds/1.0/server-main/server.xml (original) +++ directory/branches/apacheds/1.0/server-main/server.xml Wed Aug 16 10:03:01 2006 @@ -72,6 +72,23 @@ false false false + + + false + 10389 @@ -183,7 +200,7 @@ system - 1000 + 100 ou=system @@ -202,44 +219,44 @@ 1.2.6.1.4.1.18060.1.1.1.3.1 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.2 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.3 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.4 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.5 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.6 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.7 - 100 + 10 ou - 5000 + 100 uid - 1000 + 100 objectClass - 1000 + 100 @@ -256,7 +273,7 @@ example - 1000 + 100 dc=example,dc=com @@ -275,52 +292,52 @@ 1.2.6.1.4.1.18060.1.1.1.3.1 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.2 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.3 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.4 - 1000 + 100 1.2.6.1.4.1.18060.1.1.1.3.5 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.6 - 100 + 10 1.2.6.1.4.1.18060.1.1.1.3.7 - 100 + 10 dc - 1000 + 100 ou - 5000 + 100 krb5PrincipalName - 1000 + 100 uid - 1000 + 100 objectClass - 1000 + 100