You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2006/01/07 10:45:32 UTC

svn commit: r366700 - in /directory/trunk: apacheds-server-unit/src/test/java/org/apache/ldap/server/ ldap-common/ ldap-protocol/src/main/java/org/apache/ldap/server/protocol/ ldap-protocol/src/main/java/org/apache/ldap/server/protocol/support/

Author: akarasulu
Date: Sat Jan  7 01:45:27 2006
New Revision: 366700

URL: http://svn.apache.org/viewcvs?rev=366700&view=rev
Log:
server now responds to unsupport controls with an UNAVAILABLECITICALEXTENSION response: added tests for fix to DIREVE-318

Modified:
    directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/MiscTest.java
    directory/trunk/ldap-common/   (props changed)
    directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java
    directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/support/HandlerUtil.java

Modified: directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/MiscTest.java
URL: http://svn.apache.org/viewcvs/directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/MiscTest.java?rev=366700&r1=366699&r2=366700&view=diff
==============================================================================
--- directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/MiscTest.java (original)
+++ directory/trunk/apacheds-server-unit/src/test/java/org/apache/ldap/server/MiscTest.java Sat Jan  7 01:45:27 2006
@@ -17,8 +17,12 @@
 package org.apache.ldap.server;
 
 
+import org.apache.asn1.util.Asn1StringUtils;
 import org.apache.ldap.server.configuration.MutableDirectoryPartitionConfiguration;
+import org.apache.ldap.common.message.Control;
+import org.apache.ldap.common.util.ArrayUtils;
 import org.apache.ldap.common.util.EmptyEnumeration;
+import org.apache.ldap.common.util.StringTools;
 
 import java.util.Hashtable;
 import java.util.Set;
@@ -28,7 +32,9 @@
 import javax.naming.Context;
 import javax.naming.NoPermissionException;
 import javax.naming.NamingEnumeration;
+import javax.naming.OperationNotSupportedException;
 import javax.naming.directory.*;
+import javax.naming.ldap.InitialLdapContext;
 
 
 /**
@@ -313,5 +319,85 @@
         e = sysRoot.search( "", "(objectclass=*)", cons );
         assertNotNull( e );
         assertFalse( e.getClass().equals( EmptyEnumeration.class ) );
+    }
+    
+    
+    public void testFailureWithUnsupportedControl() throws Exception
+    {
+        Control unsupported = new Control()
+        {
+            boolean isCritical = true;
+            private static final long serialVersionUID = 1L;
+
+            public String getType()
+            {
+                return "1.1.1.1";
+            }
+
+            public void setType(String oid)
+            {
+            }
+
+            public byte[] getValue()
+            {
+                return new byte[0];
+            }
+
+            public void setValue(byte[] value)
+            {
+            }
+
+            public boolean isCritical()
+            {
+                return isCritical;
+            }
+
+            public void setCritical(boolean isCritical)
+            {
+                this.isCritical = isCritical;
+            }
+
+            public String getID()
+            {
+                return "1.1.1.1";
+            }
+
+            public byte[] getEncodedValue()
+            {
+                return new byte[0];
+            }
+        };
+        final Hashtable env = new Hashtable();
+
+        env.put( Context.PROVIDER_URL, "ldap://localhost:" + port + "/ou=system" );
+        env.put("java.naming.ldap.version", "3");
+        env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
+        env.put( Context.SECURITY_AUTHENTICATION, "simple" );
+        env.put( Context.SECURITY_CREDENTIALS, "secret" );
+        env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
+        InitialLdapContext ctx = new InitialLdapContext( env, null );
+
+        Attributes user = new BasicAttributes( "cn", "Kate Bush", true );
+        Attribute oc = new BasicAttribute( "objectClass" );
+        oc.add( "top" );
+        oc.add( "person" );
+        oc.add( "organizationalPerson" );
+        oc.add( "inetOrgPerson" );
+        user.put( oc );
+        user.put( "sn", "Bush" );
+        user.put( "userPassword", "Aerial" );
+        ctx.setRequestControls( new Control[] { unsupported } );
+        
+        try
+        {
+            ctx.createSubcontext( "cn=Kate Bush", user );
+        }
+        catch( OperationNotSupportedException e ) {}
+        
+        unsupported.setCritical( false );
+        DirContext kate = ctx.createSubcontext( "cn=Kate Bush", user );
+        assertNotNull( kate );
+        assertTrue( ArrayUtils.isEquals( Asn1StringUtils.getBytesUtf8( "Aerial" ), 
+            kate.getAttributes( "" ).get( "userPassword" ).get() ) );
     }
 }

Propchange: directory/trunk/ldap-common/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Sat Jan  7 01:45:27 2006
@@ -1,4 +1,5 @@
 *.ipr
+.cdtproject
 *.iml
 .deployables
 *.iws

Modified: directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java
URL: http://svn.apache.org/viewcvs/directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java?rev=366700&r1=366699&r2=366700&view=diff
==============================================================================
--- directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java (original)
+++ directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/LdapProtocolProvider.java Sat Jan  7 01:45:27 2006
@@ -19,9 +19,11 @@
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 import javax.naming.Context;
 
@@ -36,6 +38,7 @@
 import org.apache.ldap.common.message.BindRequestImpl;
 import org.apache.ldap.common.message.CompareRequest;
 import org.apache.ldap.common.message.CompareRequestImpl;
+import org.apache.ldap.common.message.Control;
 import org.apache.ldap.common.message.DeleteRequest;
 import org.apache.ldap.common.message.DeleteRequestImpl;
 import org.apache.ldap.common.message.ExtendedRequest;
@@ -46,7 +49,10 @@
 import org.apache.ldap.common.message.ModifyDnRequestImpl;
 import org.apache.ldap.common.message.ModifyRequest;
 import org.apache.ldap.common.message.ModifyRequestImpl;
+import org.apache.ldap.common.message.Request;
 import org.apache.ldap.common.message.ResultCodeEnum;
+import org.apache.ldap.common.message.ResultResponse;
+import org.apache.ldap.common.message.ResultResponseRequest;
 import org.apache.ldap.common.message.SearchRequest;
 import org.apache.ldap.common.message.SearchRequestImpl;
 import org.apache.ldap.common.message.UnbindRequest;
@@ -86,10 +92,11 @@
 {
     /** the constant service name of this ldap protocol provider **/
     public static final String SERVICE_NAME = "ldap";
-
     /** a map of the default request object class name to the handler class name */
     private static final Map DEFAULT_HANDLERS;
-
+    /** a set of supported controls */
+    private static final Set SUPPORTED_CONTROLS;
+    
     static
     {
         HashMap map = new HashMap();
@@ -135,6 +142,11 @@
         map.put( UnbindRequestImpl.class.getName(), UnbindHandler.class );
 
         DEFAULT_HANDLERS = Collections.unmodifiableMap( map );
+        
+        HashSet set = new HashSet();
+        set.add( "2.16.840.1.113730.3.4.3" );  // PersistentSearch control
+        set.add( "2.16.840.1.113730.3.4.7" );  // EntryChangeNotification control
+        SUPPORTED_CONTROLS = Collections.unmodifiableSet( set );
     }
 
     /** the underlying provider codec factory */
@@ -390,6 +402,24 @@
                 req.setOid( "1.3.6.1.4.1.1466.20037" );
                 req.setPayload( "UNSECURED".getBytes( "ISO-8859-1" ) );
                 message = req;
+            }
+            
+            if ( ( ( Request ) message ).getControls().size() > 0 && message instanceof ResultResponseRequest )
+            {
+                ResultResponseRequest req = ( ResultResponseRequest ) message;
+                Iterator controls = req.getControls().values().iterator();
+                while ( controls.hasNext() )
+                {
+                    Control control = ( Control ) controls.next();
+                    if ( control.isCritical() && ! SUPPORTED_CONTROLS.contains( control.getID() ) )
+                    {
+                        ResultResponse resp = req.getResultResponse();
+                        resp.getLdapResult().setErrorMessage( "Unsupport critical control: " + control.getID() );
+                        resp.getLdapResult().setResultCode( ResultCodeEnum.UNAVAILABLECRITICALEXTENSION );
+                        session.write( resp );
+                        return;
+                    }
+                }
             }
             
             super.messageReceived( session, message );

Modified: directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/support/HandlerUtil.java
URL: http://svn.apache.org/viewcvs/directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/support/HandlerUtil.java?rev=366700&r1=366699&r2=366700&view=diff
==============================================================================
--- directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/support/HandlerUtil.java (original)
+++ directory/trunk/ldap-protocol/src/main/java/org/apache/ldap/server/protocol/support/HandlerUtil.java Sat Jan  7 01:45:27 2006
@@ -20,7 +20,6 @@
                 }
             }
         }
-        
     }
     */
 }