You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ol...@apache.org on 2013/05/01 14:17:50 UTC

svn commit: r1477970 - /archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java

Author: olamy
Date: Wed May  1 12:17:49 2013
New Revision: 1477970

URL: http://svn.apache.org/r1477970
Log:
rename to default to have an interface

Added:
    archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java   (with props)

Added: archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java
URL: http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java?rev=1477970&view=auto
==============================================================================
--- archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java (added)
+++ archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java Wed May  1 12:17:49 2013
@@ -0,0 +1,276 @@
+package org.apache.archiva.redback.common.ldap.connection;
+
+/*
+ * 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.
+ */
+
+import com.sun.jndi.ldap.LdapCtxFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * The configuration for a connection will not change.
+ *
+ * @author <a href="mailto:trygvis@inamo.no">trygvis</a>
+ */
+public class DefaultLdapConnection
+{
+
+    private static LdapCtxFactory ctxFactory;// = new LdapCtxFactory();
+
+
+    static
+    {
+        initCtxFactory();
+    }
+
+
+    private Logger log = LoggerFactory.getLogger( getClass() );
+
+    private LdapConnectionConfiguration config;
+
+    private DirContext context;
+
+    private List<Rdn> baseDnRdns;
+
+    private static void initCtxFactory()
+    {
+        ctxFactory = new LdapCtxFactory();
+    }
+
+    public DefaultLdapConnection( LdapConnectionConfiguration config, Rdn subRdn )
+        throws LdapException
+    {
+        this.config = config;
+
+        LdapName baseDn = new LdapName( config.getBaseDn().getRdns() );
+
+        if ( subRdn != null )
+        {
+            baseDn.add( subRdn );
+        }
+
+        log.debug( "baseDn: {}", baseDn );
+
+        baseDnRdns = Collections.unmodifiableList( baseDn.getRdns() );
+
+        if ( context != null )
+        {
+            throw new LdapException( "Already connected." );
+        }
+
+        log.debug( "baseDnRdns: {}", baseDnRdns );
+
+        Hashtable<Object, Object> e = getEnvironment();
+
+        try
+        {
+            context = (DirContext) ctxFactory.getInitialContext( e );
+        }
+        catch ( NamingException ex )
+        {
+            throw new LdapException( "Could not connect to the server.", ex );
+        }
+    }
+
+    /**
+     * This ldap connection will attempt to establish a connection using the configuration,
+     * replacing the principal and the password
+     *
+     * @param config
+     * @param bindDn
+     * @param password
+     * @throws LdapException
+     */
+    public DefaultLdapConnection( LdapConnectionConfiguration config, String bindDn, String password )
+        throws LdapException
+    {
+        this.config = config;
+
+        Hashtable<Object, Object> e = getEnvironment();
+
+        e.put( Context.SECURITY_PRINCIPAL, bindDn );
+        e.put( Context.SECURITY_CREDENTIALS, password );
+
+        try
+        {
+            context = (DirContext) ctxFactory.getInitialContext( e );
+        }
+        catch ( NamingException ex )
+        {
+            throw new LdapException( "Could not connect to the server.", ex );
+        }
+    }
+
+    // ----------------------------------------------------------------------
+    // Connection Managment
+    // ----------------------------------------------------------------------
+
+    public Hashtable<Object, Object> getEnvironment()
+        throws LdapException
+    {
+        Properties env = new Properties();
+
+        env.putAll( config.getExtraProperties() );
+
+        config.check();
+
+        env.put( Context.INITIAL_CONTEXT_FACTORY, config.getContextFactory() );
+
+        // REDBACK-289/MRM-1488
+        // enable connection pooling when using Sun's LDAP context factory
+        if ( config.getContextFactory().equals( "com.sun.jndi.ldap.LdapCtxFactory" ) )
+        {
+            env.put( "com.sun.jndi.ldap.connect.pool", "true" );
+
+            env.put( "com.sun.jndi.ldap.connect.pool.timeout", "3600" );
+        }
+
+        if ( config.getHostname() != null )
+        {
+            String protocol = "ldap";// config.isSsl() ? "ldaps" : "ldap";
+            if ( config.getPort() != 0 )
+            {
+                env.put( Context.PROVIDER_URL, protocol + "://" + config.getHostname() + ":" + config.getPort() + "/" );
+            }
+            else
+            {
+                env.put( Context.PROVIDER_URL, protocol + "://" + config.getHostname() + "/" );
+            }
+        }
+
+        if ( config.isSsl() )
+        {
+            env.put( Context.SECURITY_PROTOCOL, "ssl" );
+        }
+
+        if ( config.getAuthenticationMethod() != null )
+        {
+            env.put( Context.SECURITY_AUTHENTICATION, config.getAuthenticationMethod() );
+        }
+
+        if ( config.getBindDn() != null )
+        {
+            env.put( Context.SECURITY_PRINCIPAL, config.getBindDn().toString() );
+        }
+
+        if ( config.getPassword() != null )
+        {
+            env.put( Context.SECURITY_CREDENTIALS, config.getPassword() );
+        }
+
+        // ----------------------------------------------------------------------
+        // Object Factories
+        // ----------------------------------------------------------------------
+
+        String objectFactories = null;
+
+        for ( Class<?> objectFactoryClass : config.getObjectFactories() )
+        {
+            if ( objectFactories == null )
+            {
+                objectFactories = objectFactoryClass.getName();
+            }
+            else
+            {
+                objectFactories += ":" + objectFactoryClass.getName();
+            }
+        }
+
+        if ( objectFactories != null )
+        {
+            env.setProperty( Context.OBJECT_FACTORIES, objectFactories );
+        }
+
+        // ----------------------------------------------------------------------
+        // State Factories
+        // ----------------------------------------------------------------------
+
+        String stateFactories = null;
+
+        for ( Class<?> stateFactoryClass : config.getStateFactories() )
+        {
+            if ( stateFactories == null )
+            {
+                stateFactories = stateFactoryClass.getName();
+            }
+            else
+            {
+                stateFactories += ":" + stateFactoryClass.getName();
+            }
+        }
+
+        if ( stateFactories != null )
+        {
+            env.setProperty( Context.STATE_FACTORIES, stateFactories );
+        }
+
+        log.debug( "env properties: {}", env );
+
+        return env;
+    }
+
+    public void close()
+    {
+        try
+        {
+            if ( context != null )
+            {
+                context.close();
+            }
+        }
+        catch ( NamingException ex )
+        {
+            log.info( "skip error closing ldap connection {}", ex.getMessage() );
+        }
+        finally
+        {
+            context = null;
+        }
+    }
+
+    // ----------------------------------------------------------------------
+    // Utils
+    // ----------------------------------------------------------------------
+
+    public LdapConnectionConfiguration getConfiguration()
+    {
+        return config;
+    }
+
+    public List<Rdn> getBaseDnRdns()
+    {
+        return baseDnRdns;
+    }
+
+    public DirContext getDirContext()
+    {
+        return context;
+    }
+}

Propchange: archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/connection/DefaultLdapConnection.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision