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