You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2008/08/24 11:46:16 UTC
svn commit: r688483 - in /directory/apacheds/trunk:
protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java
Author: elecharny
Date: Sun Aug 24 02:46:15 2008
New Revision: 688483
URL: http://svn.apache.org/viewvc?rev=688483&view=rev
Log:
Applied Stefan's fix for DIRSERVER-1234
Modified:
directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java
Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java?rev=688483&r1=688482&r2=688483&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java Sun Aug 24 02:46:15 2008
@@ -22,12 +22,14 @@
import java.util.concurrent.TimeUnit;
+import org.apache.directory.server.core.DirectoryService;
import org.apache.directory.server.core.entry.ClonedServerEntry;
import org.apache.directory.server.core.entry.ServerEntryUtils;
import org.apache.directory.server.core.entry.ServerStringValue;
import org.apache.directory.server.core.event.EventType;
import org.apache.directory.server.core.event.NotificationCriteria;
import org.apache.directory.server.core.filtering.EntryFilteringCursor;
+import org.apache.directory.server.core.partition.PartitionNexus;
import org.apache.directory.server.ldap.LdapSession;
import org.apache.directory.shared.ldap.codec.util.LdapURLEncodingException;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
@@ -501,6 +503,16 @@
}
/*
+ * Do not add the OR'd (objectClass=referral) expression if the user
+ * searches for the subSchemaSubEntry as the SchemaIntercepter can't
+ * handle an OR'd filter.
+ */
+ if ( isSubSchemaSubEntrySearch( session, req ) )
+ {
+ return;
+ }
+
+ /*
* Most of the time the search filter is just (objectClass=*) and if
* this is the case then there's no reason at all to OR this with an
* (objectClass=referral). If we detect this case then we leave it
@@ -632,4 +644,43 @@
return isBaseIsRoot && isBaseScope && isRootDSEFilter;
}
+
+
+ /**
+ * <p>
+ * Determines if a search request is a subSchemaSubEntry search.
+ * </p>
+ * <p>
+ * It is a schema search if:
+ * - the base DN is the DN of the subSchemaSubEntry of the root DSE
+ * - and the scope is BASE OBJECT
+ * - and the filter is (objectClass=subschema)
+ * (RFC 4512, 4.4,)
+ * </p>
+ * <p>
+ * However in this method we only check the first condition to avoid
+ * performance issues.
+ * </p>
+ *
+ * @param session the LDAP session
+ * @param req the request issued
+ *
+ * @return true if the search is on the subSchemaSubEntry, false otherwise
+ *
+ * @throws Exception the exception
+ */
+ private static boolean isSubSchemaSubEntrySearch( LdapSession session, SearchRequest req ) throws Exception
+ {
+ LdapDN base = req.getBase();
+ String baseNormForm = ( base.isNormalized() ? base.getNormName() : base.toNormName() );
+
+ DirectoryService ds = session.getCoreSession().getDirectoryService();
+ PartitionNexus nexus = ds.getPartitionNexus();
+ Value<?> subschemaSubentry = nexus.getRootDSE( null ).get( SchemaConstants.SUBSCHEMA_SUBENTRY_AT ).get();
+ LdapDN subschemaSubentryDn = new LdapDN( ( String ) ( subschemaSubentry.get() ) );
+ subschemaSubentryDn.normalize( ds.getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+ String subschemaSubentryDnNorm = subschemaSubentryDn.getNormName();
+
+ return subschemaSubentryDnNorm.equals( baseNormForm );
+ }
}
\ No newline at end of file
Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java?rev=688483&r1=688482&r2=688483&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SchemaSearchIT.java Sun Aug 24 02:46:15 2008
@@ -288,4 +288,39 @@
assertFalse( results.hasMore() );
results.close();
}
+
+
+ /**
+ * Test case for DIRSERVER-: Ensure that schema entry is returned,
+ * even if no ManageDsaIT control is present in the search request.
+ */
+ @Test
+ public void testRequestWithoutManageDsaITControl() throws Exception
+ {
+ DirContext ctx = getWiredContext( ldapServer );
+
+ // this removes the ManageDsaIT control from the search request
+ ctx.addToEnvironment( DirContext.REFERRAL, "throw" );
+
+ SearchControls ctls = new SearchControls();
+ String[] attrNames =
+ { "objectClasses", "attributeTypes", "ldapSyntaxes", "matchingRules", "matchingRuleUse", "createTimestamp",
+ "modifyTimestamp" };
+ ctls.setSearchScope( SearchControls.OBJECT_SCOPE );
+ ctls.setReturningAttributes( attrNames );
+
+ NamingEnumeration<SearchResult> result = ctx.search( DN, FILTER, ctls );
+
+ if ( result.hasMore() )
+ {
+ SearchResult entry = result.next();
+ checkForAttributes( entry.getAttributes(), attrNames );
+ }
+ else
+ {
+ fail( "entry " + DN + " not found" );
+ }
+
+ result.close();
+ }
}