1 package org.apache.archiva.rest.services.v2;/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
20 * Licensed to the Apache Software Foundation (ASF) under one
21 * or more contributor license agreements. See the NOTICE file
22 * distributed with this work for additional information
23 * regarding copyright ownership. The ASF licenses this file
24 * to you under the Apache License, Version 2.0 (the
25 * "License"); you may not use this file except in compliance
26 * with the License. You may obtain a copy of the License at
28 * http://www.apache.org/licenses/LICENSE-2.0
29 * Unless required by applicable law or agreed to in writing,
30 * software distributed under the License is distributed on an
31 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
32 * KIND, either express or implied. See the License for the
33 * specific language governing permissions and limitations
37 import org.apache.archiva.admin.model.RepositoryAdminException;
38 import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
39 import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
40 import org.apache.archiva.components.rest.model.PagedResult;
41 import org.apache.archiva.components.rest.model.PropertyEntry;
42 import org.apache.archiva.components.rest.util.QueryHelper;
43 import org.apache.archiva.redback.authentication.Authenticator;
44 import org.apache.archiva.redback.common.ldap.connection.LdapConnection;
45 import org.apache.archiva.redback.common.ldap.connection.LdapConnectionConfiguration;
46 import org.apache.archiva.redback.common.ldap.connection.LdapConnectionFactory;
47 import org.apache.archiva.redback.common.ldap.connection.LdapException;
48 import org.apache.archiva.redback.common.ldap.user.LdapUserMapper;
49 import org.apache.archiva.redback.policy.CookieSettings;
50 import org.apache.archiva.redback.policy.PasswordRule;
51 import org.apache.archiva.redback.rbac.RBACManager;
52 import org.apache.archiva.redback.role.RoleManager;
53 import org.apache.archiva.redback.users.UserManager;
54 import org.apache.archiva.rest.api.model.v2.BeanInformation;
55 import org.apache.archiva.rest.api.model.v2.CacheConfiguration;
56 import org.apache.archiva.rest.api.model.v2.LdapConfiguration;
57 import org.apache.archiva.rest.api.model.v2.SecurityConfiguration;
58 import org.apache.archiva.rest.api.services.v2.ArchivaRestServiceException;
59 import org.apache.archiva.rest.api.services.v2.ErrorKeys;
60 import org.apache.archiva.rest.api.services.v2.ErrorMessage;
61 import org.apache.archiva.rest.api.services.v2.SecurityConfigurationService;
62 import org.apache.commons.collections4.CollectionUtils;
63 import org.apache.commons.lang3.StringUtils;
64 import org.slf4j.Logger;
65 import org.slf4j.LoggerFactory;
66 import org.springframework.context.ApplicationContext;
67 import org.springframework.stereotype.Service;
69 import javax.annotation.PostConstruct;
70 import javax.inject.Inject;
71 import javax.inject.Named;
72 import javax.naming.AuthenticationException;
73 import javax.naming.AuthenticationNotSupportedException;
74 import javax.naming.CommunicationException;
75 import javax.naming.InvalidNameException;
76 import javax.naming.NamingException;
77 import javax.naming.NoPermissionException;
78 import javax.naming.ServiceUnavailableException;
79 import javax.ws.rs.core.Response;
80 import java.util.ArrayList;
81 import java.util.Collection;
82 import java.util.Collections;
83 import java.util.Comparator;
84 import java.util.List;
86 import java.util.Properties;
87 import java.util.ResourceBundle;
88 import java.util.function.Predicate;
89 import java.util.stream.Collectors;
91 import static org.apache.archiva.rest.api.services.v2.ErrorKeys.INVALID_RESULT_SET_ERROR;
92 import static org.apache.archiva.rest.api.services.v2.ErrorKeys.REPOSITORY_ADMIN_ERROR;
95 * @author Martin Stockhammer <martin_s@apache.org>
97 @Service( "v2.defaultSecurityConfigurationService" )
98 public class DefaultSecurityConfigurationService implements SecurityConfigurationService
100 private static final Logger log = LoggerFactory.getLogger( DefaultSecurityConfigurationService.class );
102 private static final String[] KNOWN_LDAP_CONTEXT_PROVIDERS = {"com.sun.jndi.ldap.LdapCtxFactory","com.ibm.jndi.LDAPCtxFactory"};
103 private final List<String> availableContextProviders = new ArrayList<>( );
105 private static final QueryHelper<PropertyEntry> PROP_QUERY_HELPER = new QueryHelper<>( new String[]{"key"} );
109 PROP_QUERY_HELPER.addStringFilter( "key", PropertyEntry::getKey );
110 PROP_QUERY_HELPER.addStringFilter( "value", PropertyEntry::getValue );
111 PROP_QUERY_HELPER.addNullsafeFieldComparator( "key", PropertyEntry::getKey );
112 PROP_QUERY_HELPER.addNullsafeFieldComparator( "value", PropertyEntry::getValue );
116 private ResourceBundle bundle;
120 private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
123 private ApplicationContext applicationContext;
126 @Named( value = "userManager#default" )
127 private UserManager userManager;
130 @Named( value = "rbacManager#default" )
131 private RBACManager rbacManager;
134 private RoleManager roleManager;
137 @Named( value = "ldapConnectionFactory#configurable" )
138 private LdapConnectionFactory ldapConnectionFactory;
141 private LdapUserMapper ldapUserMapper;
147 bundle = ResourceBundle.getBundle( "org.apache.archiva.rest.RestBundle" );
148 for (String ldapClass : KNOWN_LDAP_CONTEXT_PROVIDERS) {
149 if (isContextFactoryAvailable( ldapClass )) {
150 availableContextProviders.add( ldapClass );
156 public SecurityConfiguration getConfiguration( ) throws ArchivaRestServiceException
160 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
161 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
163 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
165 return SecurityConfiguration.ofRedbackConfiguration( redbackRuntimeConfiguration );
167 catch ( RepositoryAdminException e )
169 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
173 private void updateConfig( SecurityConfiguration newConfig, RedbackRuntimeConfiguration rbConfig )
175 rbConfig.setUserManagerImpls( newConfig.getActiveUserManagers( ) );
176 rbConfig.setRbacManagerImpls( newConfig.getActiveRbacManagers( ) );
177 rbConfig.setUseUsersCache( newConfig.isUserCacheEnabled( ) );
178 Map<String, String> props = rbConfig.getConfigurationProperties( );
179 for ( Map.Entry<String, String> newProp : newConfig.getProperties( ).entrySet( ) )
181 props.put( newProp.getKey( ), newProp.getValue( ) );
185 private void updateConfig( LdapConfiguration newConfig, RedbackRuntimeConfiguration rbConfig )
187 org.apache.archiva.admin.model.beans.LdapConfiguration ldapConfig = rbConfig.getLdapConfiguration( );
188 ldapConfig.setBaseDn( newConfig.getBaseDn( ) );
189 ldapConfig.setAuthenticationMethod( newConfig.getAuthenticationMethod( ) );
190 ldapConfig.setBindAuthenticatorEnabled( newConfig.isBindAuthenticatorEnabled( ) );
191 ldapConfig.setBindDn( newConfig.getBindDn( ) );
192 ldapConfig.setSsl( newConfig.isSslEnabled( ) );
193 ldapConfig.setBaseGroupsDn( newConfig.getGroupsBaseDn( ) );
194 ldapConfig.setHostName( newConfig.getHostName( ) );
195 ldapConfig.setPort( newConfig.getPort( ) );
196 ldapConfig.setPassword( newConfig.getBindPassword( ) );
197 ldapConfig.setUseRoleNameAsGroup( newConfig.isUseRoleNameAsGroup( ) );
198 ldapConfig.setWritable( newConfig.isWritable( ) );
199 ldapConfig.setContextFactory( newConfig.getContextFactory( ) );
201 Map<String, String> props = ldapConfig.getExtraProperties( );
202 for ( Map.Entry<String, String> newProp : newConfig.getProperties( ).entrySet( ) )
204 props.put( newProp.getKey( ), newProp.getValue( ) );
208 private void updateConfig( CacheConfiguration newConfig, RedbackRuntimeConfiguration rbConfig )
210 org.apache.archiva.admin.model.beans.CacheConfiguration cacheConfig = rbConfig.getUsersCacheConfiguration( );
211 cacheConfig.setMaxElementsInMemory( newConfig.getMaxEntriesInMemory( ) );
212 cacheConfig.setMaxElementsOnDisk( newConfig.getMaxEntriesOnDisk( ) );
213 cacheConfig.setTimeToLiveSeconds( newConfig.getTimeToLiveSeconds( ) );
214 cacheConfig.setTimeToIdleSeconds( newConfig.getTimeToIdleSeconds( ) );
218 public SecurityConfiguration updateConfiguration( SecurityConfiguration newConfiguration ) throws ArchivaRestServiceException
220 if ( newConfiguration == null )
222 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.MISSING_DATA ), 400 );
226 RedbackRuntimeConfiguration conf = redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
227 boolean userManagerChanged = !CollectionUtils.isEqualCollection( newConfiguration.getActiveUserManagers( ), conf.getUserManagerImpls( ) );
228 boolean rbacManagerChanged = !CollectionUtils.isEqualCollection( newConfiguration.getActiveRbacManagers( ), conf.getRbacManagerImpls( ) );
230 boolean ldapConfigured = newConfiguration.getActiveUserManagers( ).stream( ).anyMatch( um -> um.contains( "ldap" ) );
231 if ( !ldapConfigured )
233 ldapConfigured= newConfiguration.getActiveRbacManagers( ).stream( ).anyMatch( um -> um.contains( "ldap" ) );
236 updateConfig( newConfiguration, conf );
237 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( conf );
239 if ( userManagerChanged )
241 log.info( "user managerImpls changed to {} so reload it",
242 newConfiguration.getActiveUserManagers( ) );
243 userManager.initialize( );
246 if ( rbacManagerChanged )
248 log.info( "rbac manager changed to {} so reload it",
249 newConfiguration.getActiveRbacManagers( ) );
250 rbacManager.initialize( );
251 roleManager.initialize( );
254 if ( ldapConfigured )
258 ldapConnectionFactory.initialize( );
260 catch ( Exception e )
262 log.error( "Could not initialize LDAP connection factory: {}", e.getMessage( ) );
263 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_CF_INIT_FAILED, e.getMessage( ) ) );
266 Collection<PasswordRule> passwordRules = applicationContext.getBeansOfType( PasswordRule.class ).values( );
268 for ( PasswordRule passwordRule : passwordRules )
270 passwordRule.initialize( );
273 Collection<CookieSettings> cookieSettingsList =
274 applicationContext.getBeansOfType( CookieSettings.class ).values( );
276 for ( CookieSettings cookieSettings : cookieSettingsList )
278 cookieSettings.initialize( );
281 Collection<Authenticator> authenticators =
282 applicationContext.getBeansOfType( Authenticator.class ).values( );
284 for ( Authenticator authenticator : authenticators )
288 log.debug( "Initializing authenticatior " + authenticator.getId( ) );
289 authenticator.initialize( );
291 catch ( Exception e )
293 log.error( "Initialization of authenticator failed " + authenticator.getId( ), e );
297 if ( ldapConfigured )
301 ldapUserMapper.initialize( );
303 catch ( Exception e )
305 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_USER_MAPPER_INIT_FAILED, e.getMessage( ) ) );
309 catch ( RepositoryAdminException e )
311 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
315 return SecurityConfiguration.ofRedbackConfiguration( redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( ) );
317 catch ( RepositoryAdminException e )
319 log.error( "Error while retrieve updated configuration: {}", e.getMessage( ) );
320 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
325 public PagedResult<PropertyEntry> getConfigurationProperties( String searchTerm, Integer offset, Integer limit, List<String> orderBy, String order ) throws ArchivaRestServiceException
329 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
330 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
332 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
334 boolean ascending = PROP_QUERY_HELPER.isAscending( order );
335 Predicate<PropertyEntry> filter = PROP_QUERY_HELPER.getQueryFilter( searchTerm );
336 Comparator<PropertyEntry> comparator = PROP_QUERY_HELPER.getComparator( orderBy, ascending );
337 Map<String, String> props = redbackRuntimeConfiguration.getConfigurationProperties( );
338 int totalCount = Math.toIntExact( props.entrySet( ).stream( ).map(
339 entry -> new PropertyEntry( entry.getKey( ), entry.getValue( ) )
340 ).filter( filter ).count( ) );
341 List<PropertyEntry> result = props.entrySet( ).stream( ).map(
342 entry -> new PropertyEntry( entry.getKey( ), entry.getValue( ) )
344 .sorted( comparator )
345 .skip( offset ).limit( limit )
346 .collect( Collectors.toList( ) );
347 return new PagedResult<>( totalCount, offset, limit, result );
348 } catch (ArithmeticException e) {
349 log.error( "The total count of the result properties is higher than max integer value!" );
350 throw new ArchivaRestServiceException( ErrorMessage.of( INVALID_RESULT_SET_ERROR ) );
352 catch ( RepositoryAdminException e )
354 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
359 public PropertyEntry getConfigurationProperty( String propertyName ) throws ArchivaRestServiceException
363 RedbackRuntimeConfiguration conf = redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
364 if ( conf.getConfigurationProperties( ).containsKey( propertyName ) )
366 String value = conf.getConfigurationProperties( ).get( propertyName );
367 return new PropertyEntry( propertyName, value );
371 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.PROPERTY_NOT_FOUND ), 404 );
375 catch ( RepositoryAdminException e )
377 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
383 public Response updateConfigurationProperty( String propertyName, PropertyEntry propertyValue ) throws ArchivaRestServiceException
385 if ( propertyValue == null )
387 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.MISSING_DATA ), 400 );
391 RedbackRuntimeConfiguration conf = redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
392 if ( conf.getConfigurationProperties( ).containsKey( propertyName ) )
394 conf.getConfigurationProperties( ).put( propertyName, propertyValue.getValue( ) );
395 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( conf );
396 return Response.ok( ).build( );
400 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.PROPERTY_NOT_FOUND ), 404 );
404 catch ( RepositoryAdminException e )
406 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
411 public LdapConfiguration getLdapConfiguration( ) throws ArchivaRestServiceException
415 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
416 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
418 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
420 LdapConfiguration ldapConfig = LdapConfiguration.of( redbackRuntimeConfiguration.getLdapConfiguration( ) );
421 ldapConfig.setAvailableContextFactories( availableContextProviders );
424 catch ( RepositoryAdminException e )
426 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
432 public LdapConfiguration updateLdapConfiguration( LdapConfiguration configuration ) throws ArchivaRestServiceException
436 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
437 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
439 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
441 updateConfig( configuration, redbackRuntimeConfiguration );
443 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
444 ldapConnectionFactory.initialize( );
446 catch ( RepositoryAdminException e )
448 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
453 return LdapConfiguration.of( redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( ).getLdapConfiguration() );
455 catch ( RepositoryAdminException e )
457 log.error( "Error while retrieve updated configuration: {}", e.getMessage( ) );
458 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
463 static Properties toProperties( Map<String, String> values )
465 Properties result = new Properties( );
466 for ( Map.Entry<String, String> entry : values.entrySet( ) )
468 result.setProperty( entry.getKey( ), entry.getValue( ) );
473 private static boolean isContextFactoryAvailable( final String factoryClass)
477 return Thread.currentThread().getContextClassLoader().loadClass( factoryClass )
480 catch ( ClassNotFoundException e )
488 public Response verifyLdapConfiguration( LdapConfiguration ldapConfiguration ) throws ArchivaRestServiceException
490 LdapConnection ldapConnection = null;
493 LdapConnectionConfiguration ldapConnectionConfiguration =
494 new LdapConnectionConfiguration( ldapConfiguration.getHostName( ), ldapConfiguration.getPort( ),
495 ldapConfiguration.getBaseDn( ), ldapConfiguration.getContextFactory( ),
496 ldapConfiguration.getBindDn( ), ldapConfiguration.getBindPassword( ),
497 ldapConfiguration.getAuthenticationMethod( ),
498 toProperties( ldapConfiguration.getProperties( ) ) );
499 ldapConnectionConfiguration.setSsl( ldapConfiguration.isSslEnabled( ) );
501 ldapConnection = ldapConnectionFactory.getConnection( ldapConnectionConfiguration );
503 catch ( InvalidNameException e )
505 log.warn( "LDAP connection check failed with invalid name : {}", e.getMessage( ), e );
506 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_INVALID_NAME, e.getMessage( ) ), 400 );
508 catch ( LdapException e )
510 handleLdapException( e );
514 if ( ldapConnection != null )
518 ldapConnection.close( );
520 catch ( NamingException e )
522 log.error( "Could not close connection: {}", e.getMessage( ) );
525 ldapConnection = null;
530 // verify groups dn value too
532 LdapConnectionConfiguration ldapConnectionConfiguration = new LdapConnectionConfiguration( ldapConfiguration.getHostName( ), ldapConfiguration.getPort( ),
533 ldapConfiguration.getGroupsBaseDn( ),
534 ldapConfiguration.getContextFactory( ), ldapConfiguration.getBindDn( ),
535 ldapConfiguration.getBindPassword( ),
536 ldapConfiguration.getAuthenticationMethod( ),
537 toProperties( ldapConfiguration.getProperties( ) ) );
539 ldapConnectionConfiguration.setSsl( ldapConfiguration.isSslEnabled( ) );
541 ldapConnection = ldapConnectionFactory.getConnection( ldapConnectionConfiguration );
543 catch ( InvalidNameException e )
545 log.warn( "LDAP connection check failed with invalid name : {}", e.getMessage( ), e );
546 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_INVALID_NAME, e.getMessage( ) ), 400 );
548 catch ( LdapException e )
550 handleLdapException( e );
554 if ( ldapConnection != null )
558 ldapConnection.close( );
560 catch ( NamingException e )
562 log.error( "Could not close connection: {}", e.getMessage( ), e );
567 return Response.ok( ).build( );
570 private void handleLdapException( LdapException e ) throws ArchivaRestServiceException
572 Throwable rootCause = e.getRootCause( );
573 if ( rootCause instanceof CommunicationException )
575 log.warn( "LDAP connection check failed with CommunicationException: {}", e.getMessage( ), e );
576 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_COMMUNICATION_ERROR, e.getMessage( ) ), 400 );
577 } else if (rootCause instanceof ServiceUnavailableException ) {
578 log.warn( "LDAP connection check failed with ServiceUnavailableException: {}", e.getMessage( ), e );
579 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_UNAVAILABLE, e.getMessage( ) ), 400 );
580 } else if (rootCause instanceof AuthenticationException ) {
581 log.warn( "LDAP connection check failed with AuthenticationException: {}", e.getMessage( ), e );
582 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_AUTHENTICATION_FAILED, e.getMessage( ) ), 400 );
583 } else if (rootCause instanceof AuthenticationNotSupportedException ) {
584 log.warn( "LDAP connection check failed with AuthenticationNotSupportedException: {}", e.getMessage( ), e );
585 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_AUTHENTICATION_NOT_SUPPORTED, e.getMessage( ) ), 400 );
586 } else if (rootCause instanceof NoPermissionException ) {
587 log.warn( "LDAP connection check failed with NoPermissionException: {}", e.getMessage( ), e );
588 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_NO_PERMISSION, e.getMessage( ) ), 400 );
590 log.warn( "LDAP connection check failed: {} - {}", e.getClass().getName(), e.getMessage( ), e );
591 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_GENERIC_ERROR, e.getMessage( ) ), 400 );
595 public CacheConfiguration getCacheConfiguration( ) throws ArchivaRestServiceException
599 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
600 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
602 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
604 return CacheConfiguration.of( redbackRuntimeConfiguration.getUsersCacheConfiguration( ) );
606 catch ( RepositoryAdminException e )
608 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
614 public CacheConfiguration updateCacheConfiguration( CacheConfiguration cacheConfiguration ) throws ArchivaRestServiceException
616 if ( cacheConfiguration == null )
618 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.MISSING_DATA ), 400 );
622 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
623 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
625 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
626 updateConfig( cacheConfiguration, redbackRuntimeConfiguration );
627 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
628 return getCacheConfiguration( );
630 catch ( RepositoryAdminException e )
632 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
637 public List<BeanInformation> getAvailableUserManagers( )
639 Map<String, UserManager> beans = applicationContext.getBeansOfType( UserManager.class );
641 if ( beans.isEmpty( ) )
643 return Collections.emptyList( );
646 return beans.entrySet( ).stream( )
647 .filter( entry -> entry.getValue( ).isFinalImplementation( ) )
648 .map( ( Map.Entry<String, UserManager> entry ) -> {
649 UserManager um = entry.getValue( );
650 String id = StringUtils.substringAfter( entry.getKey( ), "#" );
651 String displayName = bundle.getString( "user_manager." + id + ".display_name" );
652 String description = bundle.getString( "user_manager." + id + ".description" );
653 return new BeanInformation( StringUtils.substringAfter( entry.getKey( ), "#" ), displayName, um.getDescriptionKey( ), description, um.isReadOnly( ) );
654 } ).collect( Collectors.toList( ) );
658 public List<BeanInformation> getAvailableRbacManagers( )
660 Map<String, RBACManager> beans = applicationContext.getBeansOfType( RBACManager.class );
662 if ( beans.isEmpty( ) )
664 return Collections.emptyList( );
667 return beans.entrySet( ).stream( )
668 .filter( entry -> entry.getValue( ).isFinalImplementation( ) )
669 .map( ( Map.Entry<String, RBACManager> entry ) -> {
670 RBACManager rm = entry.getValue( );
671 String id = StringUtils.substringAfter( entry.getKey( ), "#" );
672 String displayName = bundle.getString( "rbac_manager." + id + ".display_name" );
673 String description = bundle.getString( "rbac_manager." + id + ".description" );
674 return new BeanInformation( StringUtils.substringAfter( entry.getKey( ), "#" ), displayName, rm.getDescriptionKey( ), description, rm.isReadOnly( ) );
675 } ).collect( Collectors.toList( ) );