You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2010/10/27 13:22:05 UTC

svn commit: r1027916 - in /directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core: ./ io/api/

Author: pamarcelot
Date: Wed Oct 27 11:22:05 2010
New Revision: 1027916

URL: http://svn.apache.org/viewvc?rev=1027916&view=rev
Log:
Added support for non simple binds (needs to be polished a little more).
Added support for PagedSearchControl in the Directory API connection wrapper.

Added:
    directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/DirectoryServerInfo.java
Modified:
    directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java
    directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java

Added: directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/DirectoryServerInfo.java
URL: http://svn.apache.org/viewvc/directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/DirectoryServerInfo.java?rev=1027916&view=auto
==============================================================================
--- directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/DirectoryServerInfo.java (added)
+++ directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/DirectoryServerInfo.java Wed Oct 27 11:22:05 2010
@@ -0,0 +1,115 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.connection.core;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.directory.studio.connection.core.event.ConnectionEventRegistry;
+
+
+/**
+ * This class holds information about a directory server.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class DirectoryServerInfo
+{
+    /**
+     * This enum contains all detectable directory server types.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public static enum DirectoryServerType
+    {
+        APACHEDS,
+        IBM_DIRECTORY_SERVER,
+        IBM_SECUREWAY_DIRECTORY,
+        IBM_TIVOLI_DIRECTORY_SERVER,
+        MICROSOFT_ACTIVE_DIRECTORY_2000,
+        MICROSOFT_ACTIVE_DIRECTORY_2003,
+        NETSCAPE,
+        NOVELL,
+        OPENLDAP,
+        OPENDS,
+        OPENDJ,
+        SIEMENS_DIRX,
+        SUN_DIRECTORY_SERVER,
+        UNKNOWN
+    }
+
+    /** The type */
+    private DirectoryServerType type;
+
+    /** The version */
+    private String version;
+
+
+    /**
+     * Gets the type.
+     *
+     * @return
+     *      the type
+     */
+    public DirectoryServerType getType()
+    {
+        return type;
+    }
+
+
+    /**
+     * Sets the type.
+     *
+     * @param type
+     *      the type
+     */
+    public void setType( DirectoryServerType type )
+    {
+        this.type = type;
+    }
+
+
+    /**
+     * Gets the version.
+     *
+     * @return
+     *      the version
+     */
+    public String getVersion()
+    {
+        return version;
+    }
+
+
+    /**
+     * Sets the version.
+     *
+     * @param version
+     *      the version
+     */
+    public void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+}

Modified: directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java
URL: http://svn.apache.org/viewvc/directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java?rev=1027916&r1=1027915&r2=1027916&view=diff
==============================================================================
--- directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java (original)
+++ directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/CursorStudioNamingEnumeration.java Wed Oct 27 11:22:05 2010
@@ -20,18 +20,26 @@
 package org.apache.directory.studio.connection.core.io.api;
 
 
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import javax.naming.NamingException;
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
+import javax.naming.ldap.BasicControl;
 import javax.naming.ldap.Control;
+import javax.naming.ldap.PagedResultsResponseControl;
 
+import org.apache.directory.ldap.client.api.SearchCursor;
+import org.apache.directory.shared.ldap.codec.search.controls.pagedSearch.PagedResultsControl;
 import org.apache.directory.shared.ldap.cursor.Cursor;
 import org.apache.directory.shared.ldap.message.Referral;
 import org.apache.directory.shared.ldap.message.Response;
+import org.apache.directory.shared.ldap.message.SearchResultDone;
 import org.apache.directory.shared.ldap.message.SearchResultEntry;
 import org.apache.directory.shared.ldap.message.SearchResultReference;
 import org.apache.directory.shared.ldap.util.AttributeUtils;
@@ -61,6 +69,7 @@ public class CursorStudioNamingEnumerati
     private List<Referral> referralsList = new ArrayList<Referral>();
     private List<String> currentReferralUrlsList;
     private StudioNamingEnumeration cursorNamingEnumeration;
+    private SearchResultDone searchResultDone;
 
 
     /**
@@ -149,6 +158,12 @@ public class CursorStudioNamingEnumerati
                 }
             }
 
+            // Storing the search result done (if needed)
+            if ( searchResultDone == null )
+            {
+                searchResultDone = ( ( SearchCursor ) cursor ).getSearchDone();
+            }
+
             // Are we following referrals manually?
             if ( referralsHandlingMethod == ReferralHandlingMethod.FOLLOW_MANUALLY )
             {
@@ -322,8 +337,66 @@ public class CursorStudioNamingEnumerati
      */
     public Control[] getResponseControls() throws NamingException
     {
-        //        return ctx != null ? ctx.getResponseControls() : null;
-        // TODO implement
+        if ( searchResultDone != null )
+        {
+            Map<String, org.apache.directory.shared.ldap.message.control.Control> controlsMap = searchResultDone
+                .getControls();
+            if ( ( controlsMap != null ) && ( controlsMap.size() > 0 ) )
+            {
+                return convertControls( controlsMap.values() );
+            }
+        }
+
         return new Control[0];
     }
+
+
+    /**
+     * Converts the controls.
+     *
+     * @param controls
+     *      an array of controls
+     * @return
+     *      an array of converted controls
+     */
+    private Control[] convertControls( Collection<org.apache.directory.shared.ldap.message.control.Control> controls )
+    {
+        if ( controls != null )
+        {
+            List<Control> convertedControls = new ArrayList<Control>();
+
+            for ( org.apache.directory.shared.ldap.message.control.Control control : controls )
+            {
+                if ( PagedResultsResponseControl.OID.equals( control.getOid() ) )
+                {
+                    // Special case for the PagedResultsResponseControl
+                    try
+                    {
+                        PagedResultsResponseControl convertedControl = new PagedResultsResponseControl(
+                            control.getOid(),
+                            control.isCritical(), control.getValue() );
+                        convertedControls.add( convertedControl );
+                    }
+                    catch ( IOException e )
+                    {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
+                }
+                else
+                {
+                    // Default case
+                    Control convertedControl = new BasicControl( control.getOid(), control.isCritical(),
+                        control.getValue() );
+                    convertedControls.add( convertedControl );
+                }
+            }
+
+            return convertedControls.toArray( new Control[0] );
+        }
+        else
+        {
+            return new Control[0];
+        }
+    }
 }

Modified: directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java
URL: http://svn.apache.org/viewvc/directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java?rev=1027916&r1=1027915&r2=1027916&view=diff
==============================================================================
--- directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java (original)
+++ directory/studio/branches/studio-connection-refactoring/plugins/connection.core/src/main/java/org/apache/directory/studio/connection/core/io/api/DirectoryApiConnectionWrapper.java Wed Oct 27 11:22:05 2010
@@ -48,14 +48,21 @@ import org.apache.directory.shared.ldap.
 import org.apache.directory.shared.ldap.filter.SearchScope;
 import org.apache.directory.shared.ldap.message.AddRequest;
 import org.apache.directory.shared.ldap.message.AddRequestImpl;
+import org.apache.directory.shared.ldap.message.AddResponse;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.message.DeleteRequest;
 import org.apache.directory.shared.ldap.message.DeleteRequestImpl;
+import org.apache.directory.shared.ldap.message.DeleteResponse;
+import org.apache.directory.shared.ldap.message.LdapResult;
 import org.apache.directory.shared.ldap.message.ModifyDnRequest;
 import org.apache.directory.shared.ldap.message.ModifyDnRequestImpl;
+import org.apache.directory.shared.ldap.message.ModifyDnResponse;
 import org.apache.directory.shared.ldap.message.ModifyRequest;
 import org.apache.directory.shared.ldap.message.ModifyRequestImpl;
+import org.apache.directory.shared.ldap.message.ModifyResponse;
 import org.apache.directory.shared.ldap.message.Response;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
+import org.apache.directory.shared.ldap.message.ResultResponse;
 import org.apache.directory.shared.ldap.message.SearchRequest;
 import org.apache.directory.shared.ldap.message.SearchRequestImpl;
 import org.apache.directory.shared.ldap.name.DN;
@@ -65,6 +72,7 @@ import org.apache.directory.studio.conne
 import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
 import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
 import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
+import org.apache.directory.studio.connection.core.ConnectionParameter;
 import org.apache.directory.studio.connection.core.ConnectionParameter.EncryptionMethod;
 import org.apache.directory.studio.connection.core.IAuthHandler;
 import org.apache.directory.studio.connection.core.ICredentials;
@@ -295,7 +303,22 @@ public class DirectoryApiConnectionWrapp
                         bindPrincipal = credentials.getBindPrincipal();
                         bindPassword = credentials.getBindPassword();
 
-                        getLdapConnection().bind( bindPrincipal, bindPassword );
+                        // Simple Authentication
+                        if ( connection.getConnectionParameter().getAuthMethod() == ConnectionParameter.AuthenticationMethod.SIMPLE )
+                        {
+                            getLdapConnection().bind( bindPrincipal, bindPassword );
+                        }
+                        // CRAM-MD5 Authentication
+                        else if ( connection.getConnectionParameter().getAuthMethod() == ConnectionParameter.AuthenticationMethod.SASL_CRAM_MD5 )
+                        {
+                            getLdapConnection().bindCramMd5( bindPrincipal, bindPassword, null );
+                        }
+                        // DIGEST-MD5 Authentication
+                        else if ( connection.getConnectionParameter().getAuthMethod() == ConnectionParameter.AuthenticationMethod.SASL_DIGEST_MD5 )
+                        {
+                            getLdapConnection().bindDigestMd5( bindPrincipal, bindPassword, null,
+                                connection.getConnectionParameter().getSaslRealm() );
+                        }
                     }
                     catch ( Exception e )
                     {
@@ -556,7 +579,10 @@ public class DirectoryApiConnectionWrapp
                     request.addAllControls( convertControls( controls ) );
 
                     // Performing the modify operation
-                    getLdapConnection().modify( request );
+                    ModifyResponse modifyResponse = getLdapConnection().modify( request );
+
+                    // Checking the response
+                    checkResponse( modifyResponse );
                 }
                 catch ( Exception e )
                 {
@@ -682,7 +708,10 @@ public class DirectoryApiConnectionWrapp
                     request.addAllControls( convertControls( controls ) );
 
                     // Performing the rename operation
-                    getLdapConnection().modifyDn( request );
+                    ModifyDnResponse modifyDnResponse = getLdapConnection().modifyDn( request );
+
+                    // Checking the response
+                    checkResponse( modifyDnResponse );
                 }
                 catch ( Exception e )
                 {
@@ -747,7 +776,10 @@ public class DirectoryApiConnectionWrapp
                     request.addAllControls( convertControls( controls ) );
 
                     // Performing the add operation
-                    getLdapConnection().add( request );
+                    AddResponse addResponse = getLdapConnection().add( request );
+
+                    // Checking the response
+                    checkResponse( addResponse );
                 }
                 catch ( Exception e )
                 {
@@ -811,7 +843,10 @@ public class DirectoryApiConnectionWrapp
                     request.addAllControls( convertControls( controls ) );
 
                     // Performing the delete operation
-                    getLdapConnection().delete( request );
+                    DeleteResponse deleteResponse = getLdapConnection().delete( request );
+
+                    // Checking the response
+                    checkResponse( deleteResponse );
                 }
                 catch ( Exception e )
                 {
@@ -1013,4 +1048,25 @@ public class DirectoryApiConnectionWrapp
     {
         return ConnectionCorePlugin.getDefault().getJndiLoggers();
     }
+
+
+    /**
+     * Checks the given response.
+     *
+     * @param response
+     *      the response
+     * @throws Exception
+     *      if the LDAP result associated with the response is not a success
+     */
+    private void checkResponse( ResultResponse response ) throws Exception
+    {
+        if ( response != null )
+        {
+            LdapResult ldapResult = response.getLdapResult();
+            if ( ( ldapResult != null ) && !( ResultCodeEnum.SUCCESS.equals( ldapResult.getResultCode() ) ) )
+            {
+                throw new Exception( ldapResult.getResultCode().getResultCode() + " " + ldapResult.getErrorMessage() );
+            }
+        }
+    }
 }