]> source.dussan.org Git - archiva.git/blob
c80bc47b268a0118d857d1ca08f78fba47233f42
[archiva.git] /
1 package org.apache.archiva.redback.common.ldap.connection;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import com.sun.jndi.ldap.LdapCtxFactory;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import javax.naming.Context;
27 import javax.naming.NamingException;
28 import javax.naming.directory.DirContext;
29 import javax.naming.ldap.LdapName;
30 import javax.naming.ldap.Rdn;
31 import java.util.Collections;
32 import java.util.Hashtable;
33 import java.util.List;
34 import java.util.Properties;
35
36 /**
37  * The configuration for a connection will not change.
38  *
39  * @author <a href="mailto:trygvis@inamo.no">trygvis</a>
40  * @version $Id$
41  */
42 public class LdapConnection
43 {
44
45     private static LdapCtxFactory ctxFactory;// = new LdapCtxFactory();
46
47
48     static
49     {
50         initCtxFactory();
51     }
52
53
54     private Logger log = LoggerFactory.getLogger( getClass() );
55
56     private LdapConnectionConfiguration config;
57
58     private DirContext context;
59
60     private List<Rdn> baseDnRdns;
61
62     private static void initCtxFactory()
63     {
64         ctxFactory = new LdapCtxFactory();
65     }
66
67     public LdapConnection( LdapConnectionConfiguration config, Rdn subRdn )
68         throws LdapException
69     {
70         this.config = config;
71
72         LdapName baseDn = new LdapName( config.getBaseDn().getRdns() );
73
74         if ( subRdn != null )
75         {
76             baseDn.add( subRdn );
77         }
78
79         baseDnRdns = Collections.unmodifiableList( baseDn.getRdns() );
80
81         if ( context != null )
82         {
83             throw new LdapException( "Already connected." );
84         }
85
86         Hashtable<Object, Object> e = getEnvironment();
87
88         try
89         {
90             context = (DirContext) ctxFactory.getInitialContext( e );
91         }
92         catch ( NamingException ex )
93         {
94             throw new LdapException( "Could not connect to the server.", ex );
95         }
96     }
97
98     /**
99      * This ldap connection will attempt to establish a connection using the configuration,
100      * replacing the principal and the password
101      *
102      * @param config
103      * @param bindDn
104      * @param password
105      * @throws LdapException
106      */
107     public LdapConnection( LdapConnectionConfiguration config, String bindDn, String password )
108         throws LdapException
109     {
110         this.config = config;
111
112         Hashtable<Object, Object> e = getEnvironment();
113
114         e.put( Context.SECURITY_PRINCIPAL, bindDn );
115         e.put( Context.SECURITY_CREDENTIALS, password );
116
117         try
118         {
119             context = (DirContext) ctxFactory.getInitialContext( e );
120         }
121         catch ( NamingException ex )
122         {
123             throw new LdapException( "Could not connect to the server.", ex );
124         }
125     }
126
127     // ----------------------------------------------------------------------
128     // Connection Managment
129     // ----------------------------------------------------------------------
130
131     public Hashtable<Object, Object> getEnvironment()
132         throws LdapException
133     {
134         Properties env = new Properties();
135
136         env.putAll( config.getExtraProperties() );
137
138         config.check();
139
140         env.put( Context.INITIAL_CONTEXT_FACTORY, config.getContextFactory() );
141
142         // REDBACK-289/MRM-1488
143         // enable connection pooling when using Sun's LDAP context factory
144         if( config.getContextFactory().equals( "com.sun.jndi.ldap.LdapCtxFactory" ) )
145         {
146             env.put( "com.sun.jndi.ldap.connect.pool", "true");
147
148             env.put( "com.sun.jndi.ldap.connect.pool.timeout", "3600" );
149         }
150
151         if ( config.getHostname() != null )
152         {
153             String protocol = config.isSsl() ? "ldaps" : "ldap";
154             if ( config.getPort() != 0 )
155             {
156                 env.put( Context.PROVIDER_URL, protocol + "://" + config.getHostname() + ":" + config.getPort() + "/" );
157             }
158             else
159             {
160                 env.put( Context.PROVIDER_URL, protocol + "://" + config.getHostname() + "/" );
161             }
162         }
163
164         if ( config.getAuthenticationMethod() != null )
165         {
166             env.put( Context.SECURITY_AUTHENTICATION, config.getAuthenticationMethod() );
167         }
168
169         if ( config.getBindDn() != null )
170         {
171             env.put( Context.SECURITY_PRINCIPAL, config.getBindDn().toString() );
172         }
173
174         if ( config.getPassword() != null )
175         {
176             env.put( Context.SECURITY_CREDENTIALS, config.getPassword() );
177         }
178
179         // ----------------------------------------------------------------------
180         // Object Factories
181         // ----------------------------------------------------------------------
182
183         String objectFactories = null;
184
185         for ( Class<?> objectFactoryClass : config.getObjectFactories() )
186         {
187             if ( objectFactories == null )
188             {
189                 objectFactories = objectFactoryClass.getName();
190             }
191             else
192             {
193                 objectFactories += ":" + objectFactoryClass.getName();
194             }
195         }
196
197         if ( objectFactories != null )
198         {
199             env.setProperty( Context.OBJECT_FACTORIES, objectFactories );
200         }
201
202         // ----------------------------------------------------------------------
203         // State Factories
204         // ----------------------------------------------------------------------
205
206         String stateFactories = null;
207
208         for ( Class<?> stateFactoryClass : config.getStateFactories() )
209         {
210             if ( stateFactories == null )
211             {
212                 stateFactories = stateFactoryClass.getName();
213             }
214             else
215             {
216                 stateFactories += ":" + stateFactoryClass.getName();
217             }
218         }
219
220         if ( stateFactories != null )
221         {
222             env.setProperty( Context.STATE_FACTORIES, stateFactories );
223         }
224
225         return env;
226     }
227
228     public void close()
229     {
230         try
231         {
232             if ( context != null )
233             {
234                 context.close();
235             }
236         }
237         catch ( NamingException ex )
238         {
239             log.info( "skip error closing ldap connection {}", ex.getMessage() );
240         }
241         finally
242         {
243             context = null;
244         }
245     }
246
247     // ----------------------------------------------------------------------
248     // Utils
249     // ----------------------------------------------------------------------
250
251     public LdapConnectionConfiguration getConfiguration()
252     {
253         return config;
254     }
255
256     public List<Rdn> getBaseDnRdns()
257     {
258         return baseDnRdns;
259     }
260
261     public DirContext getDirContext()
262     {
263         return context;
264     }
265 }