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 );
445 ldapConnectionFactory.initialize( );
447 catch ( RepositoryAdminException e )
449 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
454 return LdapConfiguration.of( redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( ).getLdapConfiguration() );
456 catch ( RepositoryAdminException e )
458 log.error( "Error while retrieve updated configuration: {}", e.getMessage( ) );
459 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR, e.getMessage( ) ) );
464 static final Properties toProperties( Map<String, String> values )
466 Properties result = new Properties( );
467 for ( Map.Entry<String, String> entry : values.entrySet( ) )
469 result.setProperty( entry.getKey( ), entry.getValue( ) );
474 private static final boolean isContextFactoryAvailable(final String factoryClass)
478 return Thread.currentThread().getContextClassLoader().loadClass( factoryClass )
481 catch ( ClassNotFoundException e )
489 public Response verifyLdapConfiguration( LdapConfiguration ldapConfiguration ) throws ArchivaRestServiceException
491 LdapConnection ldapConnection = null;
494 LdapConnectionConfiguration ldapConnectionConfiguration =
495 new LdapConnectionConfiguration( ldapConfiguration.getHostName( ), ldapConfiguration.getPort( ),
496 ldapConfiguration.getBaseDn( ), ldapConfiguration.getContextFactory( ),
497 ldapConfiguration.getBindDn( ), ldapConfiguration.getBindPassword( ),
498 ldapConfiguration.getAuthenticationMethod( ),
499 toProperties( ldapConfiguration.getProperties( ) ) );
500 ldapConnectionConfiguration.setSsl( ldapConfiguration.isSslEnabled( ) );
502 ldapConnection = ldapConnectionFactory.getConnection( ldapConnectionConfiguration );
504 catch ( InvalidNameException e )
506 log.warn( "LDAP connection check failed with invalid name : {}", e.getMessage( ), e );
507 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_INVALID_NAME, e.getMessage( ) ), 400 );
509 catch ( LdapException e )
511 handleLdapException( e );
515 if ( ldapConnection != null )
519 ldapConnection.close( );
521 catch ( NamingException e )
523 log.error( "Could not close connection: {}", e.getMessage( ) );
526 ldapConnection = null;
531 // verify groups dn value too
533 LdapConnectionConfiguration ldapConnectionConfiguration = new LdapConnectionConfiguration( ldapConfiguration.getHostName( ), ldapConfiguration.getPort( ),
534 ldapConfiguration.getGroupsBaseDn( ),
535 ldapConfiguration.getContextFactory( ), ldapConfiguration.getBindDn( ),
536 ldapConfiguration.getBindPassword( ),
537 ldapConfiguration.getAuthenticationMethod( ),
538 toProperties( ldapConfiguration.getProperties( ) ) );
540 ldapConnectionConfiguration.setSsl( ldapConfiguration.isSslEnabled( ) );
542 ldapConnection = ldapConnectionFactory.getConnection( ldapConnectionConfiguration );
544 catch ( InvalidNameException e )
546 log.warn( "LDAP connection check failed with invalid name : {}", e.getMessage( ), e );
547 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_INVALID_NAME, e.getMessage( ) ), 400 );
549 catch ( LdapException e )
551 handleLdapException( e );
555 if ( ldapConnection != null )
559 ldapConnection.close( );
561 catch ( NamingException e )
563 log.error( "Could not close connection: {}", e.getMessage( ), e );
568 return Response.ok( ).build( );
571 private void handleLdapException( LdapException e ) throws ArchivaRestServiceException
573 Throwable rootCause = e.getRootCause( );
574 if ( rootCause instanceof CommunicationException )
576 log.warn( "LDAP connection check failed with CommunicationException: {}", e.getMessage( ), e );
577 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_COMMUNICATION_ERROR, e.getMessage( ) ), 400 );
578 } else if (rootCause instanceof ServiceUnavailableException ) {
579 log.warn( "LDAP connection check failed with ServiceUnavailableException: {}", e.getMessage( ), e );
580 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_UNAVAILABLE, e.getMessage( ) ), 400 );
581 } else if (rootCause instanceof AuthenticationException ) {
582 log.warn( "LDAP connection check failed with AuthenticationException: {}", e.getMessage( ), e );
583 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_AUTHENTICATION_FAILED, e.getMessage( ) ), 400 );
584 } else if (rootCause instanceof AuthenticationNotSupportedException ) {
585 log.warn( "LDAP connection check failed with AuthenticationNotSupportedException: {}", e.getMessage( ), e );
586 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_AUTHENTICATION_NOT_SUPPORTED, e.getMessage( ) ), 400 );
587 } else if (rootCause instanceof NoPermissionException ) {
588 log.warn( "LDAP connection check failed with NoPermissionException: {}", e.getMessage( ), e );
589 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_SERVICE_NO_PERMISSION, e.getMessage( ) ), 400 );
591 log.warn( "LDAP connection check failed: {} - {}", e.getClass().getName(), e.getMessage( ), e );
592 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.LDAP_GENERIC_ERROR, e.getMessage( ) ), 400 );
596 public CacheConfiguration getCacheConfiguration( ) throws ArchivaRestServiceException
600 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
601 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
603 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
605 return CacheConfiguration.of( redbackRuntimeConfiguration.getUsersCacheConfiguration( ) );
607 catch ( RepositoryAdminException e )
609 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
615 public CacheConfiguration updateCacheConfiguration( CacheConfiguration cacheConfiguration ) throws ArchivaRestServiceException
617 if ( cacheConfiguration == null )
619 throw new ArchivaRestServiceException( ErrorMessage.of( ErrorKeys.MISSING_DATA ), 400 );
623 RedbackRuntimeConfiguration redbackRuntimeConfiguration =
624 redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration( );
626 log.debug( "getRedbackRuntimeConfiguration -> {}", redbackRuntimeConfiguration );
627 updateConfig( cacheConfiguration, redbackRuntimeConfiguration );
628 redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
629 return getCacheConfiguration( );
631 catch ( RepositoryAdminException e )
633 throw new ArchivaRestServiceException( ErrorMessage.of( REPOSITORY_ADMIN_ERROR ) );
638 public List<BeanInformation> getAvailableUserManagers( ) throws ArchivaRestServiceException
640 Map<String, UserManager> beans = applicationContext.getBeansOfType( UserManager.class );
642 if ( beans.isEmpty( ) )
644 return Collections.emptyList( );
647 return beans.entrySet( ).stream( )
648 .filter( entry -> entry.getValue( ).isFinalImplementation( ) )
649 .map( ( Map.Entry<String, UserManager> entry ) -> {
650 UserManager um = entry.getValue( );
651 String id = StringUtils.substringAfter( entry.getKey( ), "#" );
652 String displayName = bundle.getString( "user_manager." + id + ".display_name" );
653 String description = bundle.getString( "user_manager." + id + ".description" );
654 return new BeanInformation( StringUtils.substringAfter( entry.getKey( ), "#" ), displayName, um.getDescriptionKey( ), description, um.isReadOnly( ) );
655 } ).collect( Collectors.toList( ) );
659 public List<BeanInformation> getAvailableRbacManagers( ) throws ArchivaRestServiceException
661 Map<String, RBACManager> beans = applicationContext.getBeansOfType( RBACManager.class );
663 if ( beans.isEmpty( ) )
665 return Collections.emptyList( );
668 return beans.entrySet( ).stream( )
669 .filter( entry -> entry.getValue( ).isFinalImplementation( ) )
670 .map( ( Map.Entry<String, RBACManager> entry ) -> {
671 RBACManager rm = entry.getValue( );
672 String id = StringUtils.substringAfter( entry.getKey( ), "#" );
673 String displayName = bundle.getString( "rbac_manager." + id + ".display_name" );
674 String description = bundle.getString( "rbac_manager." + id + ".description" );
675 return new BeanInformation( StringUtils.substringAfter( entry.getKey( ), "#" ), displayName, rm.getDescriptionKey( ), description, rm.isReadOnly( ) );
676 } ).collect( Collectors.toList( ) );