]> source.dussan.org Git - archiva.git/blob
1ada46e172ff65e1dc09e429d86ff11ccd3e7f69
[archiva.git] /
1 package org.apache.archiva.rest.services;
2 /*
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  */
20
21 import org.apache.archiva.admin.model.RepositoryAdminException;
22 import org.apache.archiva.admin.model.beans.CacheConfiguration;
23 import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
24 import org.apache.archiva.admin.model.beans.LdapConfiguration;
25 import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
26 import org.apache.archiva.redback.authentication.AuthenticationException;
27 import org.apache.archiva.redback.authentication.Authenticator;
28 import org.apache.archiva.redback.common.ldap.LdapUserMapper;
29 import org.apache.archiva.redback.common.ldap.connection.LdapConnection;
30 import org.apache.archiva.redback.common.ldap.connection.LdapConnectionConfiguration;
31 import org.apache.archiva.redback.common.ldap.connection.LdapConnectionFactory;
32 import org.apache.archiva.redback.common.ldap.connection.LdapException;
33 import org.apache.archiva.redback.components.cache.Cache;
34 import org.apache.archiva.redback.policy.CookieSettings;
35 import org.apache.archiva.redback.policy.PasswordRule;
36 import org.apache.archiva.redback.users.UserManager;
37 import org.apache.archiva.rest.api.model.UserManagerImplementationInformation;
38 import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
39 import org.apache.archiva.rest.api.services.RedbackRuntimeConfigurationService;
40 import org.apache.commons.lang.StringUtils;
41 import org.springframework.context.ApplicationContext;
42 import org.springframework.stereotype.Service;
43
44 import javax.annotation.PostConstruct;
45 import javax.inject.Inject;
46 import javax.inject.Named;
47 import javax.naming.InvalidNameException;
48 import java.util.ArrayList;
49 import java.util.Collection;
50 import java.util.Collections;
51 import java.util.List;
52 import java.util.Map;
53 import java.util.Properties;
54
55 /**
56  * @author Olivier Lamy
57  * @since 1.4-M4
58  */
59 @Service("redbackRuntimeConfigurationService#rest")
60 public class DefaultRedbackRuntimeConfigurationService
61     extends AbstractRestService
62     implements RedbackRuntimeConfigurationService
63 {
64     @Inject
65     private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
66
67     @Inject
68     @Named(value = "userManager#configurable")
69     private UserManager userManager;
70
71     @Inject
72     private ApplicationContext applicationContext;
73
74     @Inject
75     @Named(value = "ldapConnectionFactory#configurable")
76     private LdapConnectionFactory ldapConnectionFactory;
77
78     @Inject
79     @Named(value = "cache#users")
80     private Cache usersCache;
81
82     @Inject
83     private LdapUserMapper ldapUserMapper;
84
85
86     public RedbackRuntimeConfiguration getRedbackRuntimeConfiguration()
87         throws ArchivaRestServiceException
88     {
89         try
90         {
91             return redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
92         }
93         catch ( RepositoryAdminException e )
94         {
95             throw new ArchivaRestServiceException( e.getMessage(), e );
96         }
97     }
98
99     public Boolean updateRedbackRuntimeConfiguration( RedbackRuntimeConfiguration redbackRuntimeConfiguration )
100         throws ArchivaRestServiceException
101     {
102         try
103         {
104             // has user manager impl changed ?
105             boolean userManagerChanged = redbackRuntimeConfiguration.getUserManagerImpls().size()
106                 != redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration().getUserManagerImpls().size();
107
108             userManagerChanged =
109                 userManagerChanged || ( redbackRuntimeConfiguration.getUserManagerImpls().toString().hashCode()
110                     != redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration().getUserManagerImpls().toString().hashCode() );
111
112             redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
113
114             if ( userManagerChanged )
115             {
116                 log.info( "user managerImpls changed to {} so reload it",
117                           redbackRuntimeConfiguration.getUserManagerImpls() );
118                 userManager.initialize();
119             }
120
121             ldapConnectionFactory.initialize();
122
123             Collection<PasswordRule> passwordRules = applicationContext.getBeansOfType( PasswordRule.class ).values();
124
125             for ( PasswordRule passwordRule : passwordRules )
126             {
127                 passwordRule.initialize();
128             }
129
130             Collection<CookieSettings> cookieSettingsList =
131                 applicationContext.getBeansOfType( CookieSettings.class ).values();
132
133             for ( CookieSettings cookieSettings : cookieSettingsList )
134             {
135                 cookieSettings.initialize();
136             }
137
138             Collection<Authenticator> authenticators =
139                 applicationContext.getBeansOfType( Authenticator.class ).values();
140
141             for ( Authenticator authenticator : authenticators )
142             {
143                 authenticator.initialize();
144             }
145
146             // users cache
147             usersCache.setTimeToIdleSeconds(
148                 redbackRuntimeConfiguration.getUsersCacheConfiguration().getTimeToIdleSeconds() );
149             usersCache.setTimeToLiveSeconds(
150                 redbackRuntimeConfiguration.getUsersCacheConfiguration().getTimeToLiveSeconds() );
151             usersCache.setMaxElementsInMemory(
152                 redbackRuntimeConfiguration.getUsersCacheConfiguration().getMaxElementsInMemory() );
153             usersCache.setMaxElementsOnDisk(
154                 redbackRuntimeConfiguration.getUsersCacheConfiguration().getMaxElementsOnDisk() );
155
156
157             ldapUserMapper.initialize();
158
159             return Boolean.TRUE;
160         }
161         catch ( AuthenticationException e )
162         {
163             throw new ArchivaRestServiceException( e.getMessage(), e );
164         }
165         catch ( RepositoryAdminException e )
166         {
167             throw new ArchivaRestServiceException( e.getMessage(), e );
168         }
169
170     }
171
172     public List<UserManagerImplementationInformation> getUserManagerImplementationInformations()
173         throws ArchivaRestServiceException
174     {
175
176         Map<String, UserManager> beans = applicationContext.getBeansOfType( UserManager.class );
177
178         if ( beans.isEmpty() )
179         {
180             return Collections.emptyList();
181         }
182
183         List<UserManagerImplementationInformation> informations =
184             new ArrayList<UserManagerImplementationInformation>( beans.size() );
185
186         for ( Map.Entry<String, UserManager> entry : beans.entrySet() )
187         {
188             UserManager userManager = applicationContext.getBean( entry.getKey(), UserManager.class );
189             if ( userManager.isFinalImplementation() )
190             {
191                 UserManagerImplementationInformation information = new UserManagerImplementationInformation();
192                 information.setBeanId( StringUtils.substringAfter( entry.getKey(), "#" ) );
193                 information.setDescriptionKey( userManager.getDescriptionKey() );
194                 information.setReadOnly( userManager.isReadOnly() );
195                 informations.add( information );
196             }
197         }
198
199         return informations;
200     }
201
202
203     public Boolean checkLdapConnection()
204         throws ArchivaRestServiceException
205     {
206         LdapConnection ldapConnection = null;
207         try
208         {
209             ldapConnection = ldapConnectionFactory.getConnection();
210         }
211         catch ( LdapException e )
212         {
213             log.warn( "fail to get LdapConnection: {}", e.getMessage() );
214             throw new ArchivaRestServiceException( e.getMessage(), e );
215         }
216         finally
217         {
218
219             if ( ldapConnection != null )
220             {
221                 ldapConnection.close();
222             }
223         }
224
225         return Boolean.TRUE;
226     }
227
228     public Boolean checkLdapConnection( LdapConfiguration ldapConfiguration )
229         throws ArchivaRestServiceException
230     {
231         LdapConnection ldapConnection = null;
232         try
233         {
234             LdapConnectionConfiguration ldapConnectionConfiguration =
235                 new LdapConnectionConfiguration( ldapConfiguration.getHostName(), ldapConfiguration.getPort(),
236                                                  ldapConfiguration.getBaseDn(), ldapConfiguration.getContextFactory(),
237                                                  ldapConfiguration.getBindDn(), ldapConfiguration.getPassword(),
238                                                  ldapConfiguration.getAuthenticationMethod(),
239                                                  toProperties( ldapConfiguration.getExtraProperties() ) );
240
241             ldapConnection = ldapConnectionFactory.getConnection( ldapConnectionConfiguration );
242         }
243         catch ( InvalidNameException e )
244         {
245             log.warn( "fail to get LdapConnection: {}", e.getMessage() );
246             throw new ArchivaRestServiceException( e.getMessage(), e );
247         }
248         catch ( LdapException e )
249         {
250             log.warn( "fail to get LdapConnection: {}", e.getMessage() );
251             throw new ArchivaRestServiceException( e.getMessage(), e );
252         }
253         finally
254         {
255
256             if ( ldapConnection != null )
257             {
258                 ldapConnection.close();
259             }
260         }
261
262         return Boolean.TRUE;
263     }
264
265     private Properties toProperties( Map<String, String> map )
266     {
267         Properties properties = new Properties();
268         if ( map == null || map.isEmpty() )
269         {
270             return properties;
271         }
272         for ( Map.Entry<String, String> entry : map.entrySet() )
273         {
274             properties.put( entry.getKey(), entry.getValue() );
275         }
276         return properties;
277     }
278 }
279
280