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 2007/01/25 12:13:05 UTC
svn commit: r499739 -
/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaService.java
Author: elecharny
Date: Thu Jan 25 03:12:59 2007
New Revision: 499739
URL: http://svn.apache.org/viewvc?view=rev&rev=499739
Log:
Fixed DIRSERVER-836
Modified:
directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaService.java
Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaService.java?view=diff&rev=499739&r1=499738&r2=499739
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaService.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaService.java Thu Jan 25 03:12:59 2007
@@ -382,6 +382,73 @@
return new SearchResultFilteringEnumeration( e, new SearchControls(), invocation, binaryAttributeFilter );
}
+ /**
+ * Remove all unknown attributes from the searchControls, to avoid an exception.
+ *
+ * RFC 2251 states that :
+ * " Attributes MUST be named at most once in the list, and are returned "
+ * " at most once in an entry. "
+ * " If there are attribute descriptions in "
+ * " the list which are not recognized, they are ignored by the server."
+ *
+ * @param searchCtls The SearchControls we will filter
+ */
+ private void filterAttributesToReturn( SearchControls searchCtls ) throws NamingException
+ {
+ String[] attributes = searchCtls.getReturningAttributes();
+
+ if ( ( attributes == null ) || ( attributes.length == 0 ) )
+ {
+ return;
+ }
+
+ Map<String, String> filteredAttrs = new HashMap<String, String>();
+
+ for ( int i = 0; i < attributes.length; i++ )
+ {
+ String attribute = attributes[i];
+
+ // Skip special attributes
+ if ( ( "*".equals( attribute ) ) || ( "+".equals( attribute ) ) || ( "1.1".equals( attribute ) ) )
+ {
+ if ( !filteredAttrs.containsKey( attribute ) )
+ {
+ filteredAttrs.put( attribute, attribute );
+ }
+
+ continue;
+ }
+
+ if ( registries.getAttributeTypeRegistry().hasAttributeType( attribute ) )
+ {
+ String oid = registries.getOidRegistry().getOid( attribute );
+
+ if ( !filteredAttrs.containsKey( oid ) )
+ {
+ filteredAttrs.put( oid, attribute );
+ }
+ }
+ }
+
+ // If we still have the same attribute number, then we can just get out the method
+ if ( filteredAttrs.size() == attributes.length )
+ {
+ return;
+ }
+
+ // Some attributes have been removed. let's modify the searchControl
+ String[] newAttributesList = new String[filteredAttrs.size()];
+
+ int pos = 0;
+
+ for ( String key:filteredAttrs.keySet() )
+ {
+ newAttributesList[pos++] = filteredAttrs.get( key );
+ }
+
+ searchCtls.setReturningAttributes( newAttributesList );
+ }
+
/**
*
@@ -391,6 +458,12 @@
{
// check to make sure the DN searched for is a subentry
Invocation invocation = InvocationStack.getInstance().peek();
+
+ // We have to eliminate bad attributes from the request, accordingly
+ // to RFC 2251, chap. 4.5.1. Basically, all unknown attributes are removed
+ // from the list
+ filterAttributesToReturn( searchCtls );
+
if ( !subschemaSubentryDn.toNormName().equals( base.toNormName() ) )
{
NamingEnumeration e = nextInterceptor.search( base, env, filter, searchCtls );