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
19 import org.apache.archiva.admin.model.RepositoryAdminException;
20 import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
21 import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
22 import org.apache.archiva.components.cache.Cache;
23 import org.apache.archiva.components.rest.model.PagedResult;
24 import org.apache.archiva.components.rest.model.PropertyEntry;
25 import org.apache.archiva.components.rest.util.PagingHelper;
26 import org.apache.archiva.components.rest.util.QueryHelper;
27 import org.apache.archiva.redback.authentication.Authenticator;
28 import org.apache.archiva.redback.common.ldap.connection.LdapConnection;
29 import org.apache.archiva.redback.common.ldap.connection.LdapConnectionConfiguration;
30 import org.apache.archiva.redback.common.ldap.connection.LdapConnectionFactory;
31 import org.apache.archiva.redback.common.ldap.connection.LdapException;
32 import org.apache.archiva.redback.common.ldap.user.LdapUserMapper;
33 import org.apache.archiva.redback.policy.CookieSettings;
34 import org.apache.archiva.redback.policy.PasswordRule;
35 import org.apache.archiva.redback.rbac.RBACManager;
36 import org.apache.archiva.redback.role.RoleManager;
37 import org.apache.archiva.redback.users.UserManager;
38 import org.apache.archiva.rest.api.model.v2.BeanInformation;
39 import org.apache.archiva.rest.api.model.v2.CacheConfiguration;
40 import org.apache.archiva.rest.api.model.v2.LdapConfiguration;
41 import org.apache.archiva.rest.api.model.v2.SecurityConfiguration;
42 import org.apache.archiva.rest.api.services.v2.ArchivaRestServiceException;
43 import org.apache.archiva.rest.api.services.v2.ErrorMessage;
44 import org.apache.archiva.rest.api.services.v2.SecurityConfigurationService;
45 import org.apache.commons.collections4.CollectionUtils;
46 import org.apache.commons.lang3.StringUtils;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49 import org.springframework.context.ApplicationContext;
50 import org.springframework.stereotype.Service;
52 import javax.annotation.PostConstruct;
53 import javax.inject.Inject;
54 import javax.inject.Named;
55 import javax.naming.AuthenticationException;
56 import javax.naming.AuthenticationNotSupportedException;
57 import javax.naming.CommunicationException;
58 import javax.naming.InvalidNameException;
59 import javax.naming.NamingException;
60 import javax.naming.NoPermissionException;
61 import javax.naming.ServiceUnavailableException;
62 import javax.ws.rs.core.Response;
63 import java.util.ArrayList;
64 import java.util.Collection;
65 import java.util.Collections;
66 import java.util.Comparator;
67 import java.util.List;
69 import java.util.Properties;
70 import java.util.ResourceBundle;
71 import java.util.function.Predicate;
72 import java.util.stream.Collectors;
74 import static org.apache.archiva.rest.services.v2.ErrorKeys.INVALID_RESULT_SET_ERROR;
75 import static org.apache.archiva.rest.services.v2.ErrorKeys.REPOSITORY_ADMIN_ERROR;
78 * @author Martin Stockhammer <martin_s@apache.org>
80 @Service( "v2.defaultSecurityConfigurationService" )
81 public class DefaultSecurityConfigurationService implements SecurityConfigurationService
83 private static final Logger log = LoggerFactory.getLogger( DefaultSecurityConfigurationService.class );
85 private static final String[] KNOWN_LDAP_CONTEXT_PROVIDERS = {"com.sun.jndi.ldap.LdapCtxFactory","com.ibm.jndi.LDAPCtxFactory"};
86 private List<String> availableContextProviders = new ArrayList<>( );
88 private static final QueryHelper<PropertyEntry> PROP_QUERY_HELPER = new QueryHelper( new String[]{"key"} );
89 private static final PagingHelper PROP_PAGING_HELPER = new PagingHelper( );
93 PROP_QUERY_HELPER.addStringFilter( "key", PropertyEntry::getKey );
94 PROP_QUERY_HELPER.addStringFilter( "value", PropertyEntry::getValue );
95 PROP_QUERY_HELPER.addNullsafeFieldComparator( "key", PropertyEntry::getKey );
96 PROP_QUERY_HELPER.addNullsafeFieldComparator( "value", PropertyEntry::getValue );
100 private ResourceBundle bundle;
104 private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
107 private ApplicationContext applicationContext;
110 @Named( value = "userManager#default" )
111 private UserManager userManager;
114 @Named( value = "rbacManager#default" )
115 private RBACManager rbacManager;
118 private RoleManager roleManager;
121 @Named( value = "ldapConnectionFactory#configurable" )
122 private LdapConnectionFactory ldapConnectionFactory;
125 private LdapUserMapper ldapUserMapper;
128 @Named( value = "cache#users" )
129 private Cache usersCache;
135 bundle = ResourceBundle.getBundle( "org.apache.archiva.rest.RestBundle" );
136 for (String ldapClass : KNOWN_LDAP_CONTEXT_PROVIDERS) {
137 if (isContextFactoryAvailable( ldapClass )) {
138 availableContextProviders.add( ldapClass );
144 public SecurityConfiguration getConfiguration( ) throws ArchivaRestServiceException
148 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
149 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
151 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
153 return SecurityConfiguration.ofRedbackConfiguration( redbackRuntimeConfiguration );
155 catch ( RepositoryAdminException e )
157 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
161 private void updateConfig( SecurityConfiguration newConfig, RedbackRuntimeConfiguration rbConfig )
163 rbConfig.setUserManagerImpls( newConfig.getActiveUserManagers( ) );
164 rbConfig.setRbacManagerImpls( newConfig.getActiveRbacManagers( ) );
165 rbConfig.setUseUsersCache( newConfig.isUserCacheEnabled( ) );
166 Map<String, String> props = rbConfig.getConfigurationProperties( );
167 for ( Map.Entry<String, String> newProp : newConfig.getProperties( ).entrySet( ) )
169 props.put( newProp.getKey( ), newProp.getValue( ) );
173 private void updateConfig( LdapConfiguration newConfig, RedbackRuntimeConfiguration rbConfig )
175 org.apache.archiva.admin.model.beans.LdapConfiguration ldapConfig = rbConfig.getLdapConfiguration( );
176 ldapConfig.setBaseDn( newConfig.getBaseDn( ) );
177 ldapConfig.setAuthenticationMethod( newConfig.getAuthenticationMethod( ) );
178 ldapConfig.setBindAuthenticatorEnabled( newConfig.isBindAuthenticatorEnabled( ) );
179 ldapConfig.setBindDn( newConfig.getBindDn( ) );
180 ldapConfig.setSsl( newConfig.isSslEnabled( ) );
181 ldapConfig.setBaseGroupsDn( newConfig.getGroupsBaseDn( ) );
182 ldapConfig.setHostName( newConfig.getHostName( ) );
183 ldapConfig.setPort( newConfig.getPort( ) );
184 ldapConfig.setPassword( newConfig.getBindPassword( ) );
185 ldapConfig.setUseRoleNameAsGroup( newConfig.isUseRoleNameAsGroup( ) );
186 ldapConfig.setWritable( newConfig.isWritable( ) );
187 ldapConfig.setContextFactory( newConfig.getContextFactory( ) );
189 Map<String, String> props = ldapConfig.getExtraProperties( );
190 for ( Map.Entry<String, String> newProp : newConfig.getProperties( ).entrySet( ) )
192 props.put( newProp.getKey( ), newProp.getValue( ) );
196 private void updateConfig( CacheConfiguration newConfig, RedbackRuntimeConfiguration rbConfig )
198 org.apache.archiva.admin.model.beans.CacheConfiguration cacheConfig = rbConfig.getUsersCacheConfiguration( );
199 cacheConfig.setMaxElementsInMemory( newConfig.getMaxEntriesInMemory( ) );
200 cacheConfig.setMaxElementsOnDisk( newConfig.getMaxEntriesOnDisk( ) );
201 cacheConfig.setTimeToLiveSeconds( newConfig.getTimeToLiveSeconds( ) );
202 cacheConfig.setTimeToIdleSeconds( newConfig.getTimeToIdleSeconds( ) );
206 public SecurityConfiguration updateConfiguration( SecurityConfiguration newConfiguration ) throws ArchivaRestServiceException
208 if ( newConfiguration == null )
210 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.MISSING_DATA ), 400 );
214 RedbackRuntimeConfiguration conf = redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
215 boolean userManagerChanged = !CollectionUtils.isEqualCollection( newConfiguration.getActiveUserManagers( ), conf.getUserManagerImpls( ) );
216 boolean rbacManagerChanged = !CollectionUtils.isEqualCollection( newConfiguration.getActiveRbacManagers( ), conf.getRbacManagerImpls( ) );
218 boolean ldapConfigured = false;
219 for ( String um : newConfiguration.getActiveUserManagers( ) )
221 if ( um.contains( "ldap" ) )
223 ldapConfigured = true;
226 if ( !ldapConfigured )
228 for ( String rbm : newConfiguration.getActiveRbacManagers( ) )
230 if ( rbm.contains( "ldap" ) )
232 ldapConfigured = true;
237 updateConfig( newConfiguration, conf );
238 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( conf );
240 if ( userManagerChanged )
242 log.info( "user managerImpls changed to {} so reload it",
243 newConfiguration.getActiveUserManagers( ) );
244 userManager.initialize( );
247 if ( rbacManagerChanged )
249 log.info( "rbac manager changed to {} so reload it",
250 newConfiguration.getActiveRbacManagers( ) );
251 rbacManager.initialize( );
252 roleManager.initialize( );
255 if ( ldapConfigured )
259 ldapConnectionFactory.initialize( );
261 catch ( Exception e )
263 log.error( "Could not initialize LDAP connection factory: {}", e.getMessage( ) );
264 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_CF_INIT_FAILED, e.getMessage( ) ) );
267 Collection<PasswordRule> passwordRules = applicationContext.getBeansOfType( PasswordRule.class ).values( );
269 for ( PasswordRule passwordRule : passwordRules )
271 passwordRule.initialize( );
274 Collection<CookieSettings> cookieSettingsList =
275 applicationContext.getBeansOfType( CookieSettings.class ).values( );
277 for ( CookieSettings cookieSettings : cookieSettingsList )
279 cookieSettings.initialize( );
282 Collection<Authenticator> authenticators =
283 applicationContext.getBeansOfType( Authenticator.class ).values( );
285 for ( Authenticator authenticator : authenticators )
289 log.debug( "Initializing authenticatior " + authenticator.getId( ) );
290 authenticator.initialize( );
292 catch ( Exception e )
294 log.error( "Initialization of authenticator failed " + authenticator.getId( ), e );
298 if ( ldapConfigured )
302 ldapUserMapper.initialize( );
304 catch ( Exception e )
306 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_USER_MAPPER_INIT_FAILED, e.getMessage( ) ) );
310 catch ( RepositoryAdminException e )
312 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
316 return SecurityConfiguration.ofRedbackConfiguration( redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( ) );
318 catch ( RepositoryAdminException e )
320 log.error( "Error while retrieve updated configuration: {}", e.getMessage( ) );
321 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
326 public PagedResult<PropertyEntry> getConfigurationProperties( String searchTerm, Integer offset, Integer limit, List<String> orderBy, String order ) throws ArchivaRestServiceException
330 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
331 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
333 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
335 boolean ascending = PROP_QUERY_HELPER.isAscending( order );
336 Predicate<PropertyEntry> filter = PROP_QUERY_HELPER.getQueryFilter( searchTerm );
337 Comparator<PropertyEntry> comparator = PROP_QUERY_HELPER.getComparator( orderBy, ascending );
338 Map<String, String> props = redbackRuntimeConfiguration.getConfigurationProperties( );
339 int totalCount = Math.toIntExact( props.entrySet( ).stream( ).map(
340 entry -> new PropertyEntry( entry.getKey( ), entry.getValue( ) )
341 ).filter( filter ).count( ) );
342 List<PropertyEntry> result = props.entrySet( ).stream( ).map(
343 entry -> new PropertyEntry( entry.getKey( ), entry.getValue( ) )
345 .sorted( comparator )
346 .skip( offset ).limit( limit )
347 .collect( Collectors.toList( ) );
348 return new PagedResult<>( totalCount, offset, limit, result );
349 } catch (ArithmeticException e) {
350 log.error( "The total count of the result properties is higher than max integer value! {}" );
351 throw new ArchivaRestServiceException( ErrorMessage.of( INVALID_RESULT_SET_ERROR ) );
353 catch ( RepositoryAdminException e )
355 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
360 public PropertyEntry getConfigurationProperty( String propertyName ) throws ArchivaRestServiceException
364 RedbackRuntimeConfiguration conf = redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
365 if ( conf.getConfigurationProperties( ).containsKey( propertyName ) )
367 String value = conf.getConfigurationProperties( ).get( propertyName );
368 return new PropertyEntry( propertyName, value );
372 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.PROPERTY_NOT_FOUND ), 404 );
376 catch ( RepositoryAdminException e )
378 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
384 public Response updateConfigurationProperty( String propertyName, PropertyEntry propertyValue ) throws ArchivaRestServiceException
386 if ( propertyValue == null )
388 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.MISSING_DATA ), 400 );
392 RedbackRuntimeConfiguration conf = redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
393 if ( conf.getConfigurationProperties( ).containsKey( propertyName ) )
395 conf.getConfigurationProperties( ).put( propertyName, propertyValue.getValue( ) );
396 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( conf );
397 return Response.ok( ).build( );
401 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.PROPERTY_NOT_FOUND ), 404 );
405 catch ( RepositoryAdminException e )
407 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
412 public LdapConfiguration getLdapConfiguration( ) throws ArchivaRestServiceException
416 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
417 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
419 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
421 LdapConfiguration ldapConfig = LdapConfiguration.of( redbackRuntimeConfiguration.getLdapConfiguration( ) );
422 ldapConfig.setAvailableContextFactories( availableContextProviders );
425 catch ( RepositoryAdminException e )
427 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
433 public LdapConfiguration updateLdapConfiguration( LdapConfiguration configuration ) throws ArchivaRestServiceException
437 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
438 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
440 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
442 updateConfig( configuration, redbackRuntimeConfiguration );
444 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
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 final 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 final 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( ) throws ArchivaRestServiceException
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( ) throws ArchivaRestServiceException
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( ) );