001    package org.apache.archiva.admin.repository.runtime;
002    /*
003     * Licensed to the Apache Software Foundation (ASF) under one
004     * or more contributor license agreements.  See the NOTICE file
005     * distributed with this work for additional information
006     * regarding copyright ownership.  The ASF licenses this file
007     * to you under the Apache License, Version 2.0 (the
008     * "License"); you may not use this file except in compliance
009     * with the License.  You may obtain a copy of the License at
010     *
011     *   http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing,
014     * software distributed under the License is distributed on an
015     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016     * KIND, either express or implied.  See the License for the
017     * specific language governing permissions and limitations
018     * under the License.
019     */
020    
021    import net.sf.beanlib.provider.replicator.BeanReplicator;
022    import org.apache.archiva.admin.model.RepositoryAdminException;
023    import org.apache.archiva.admin.model.beans.CacheConfiguration;
024    import org.apache.archiva.admin.model.beans.LdapConfiguration;
025    import org.apache.archiva.admin.model.beans.LdapGroupMapping;
026    import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
027    import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
028    import org.apache.archiva.configuration.ArchivaConfiguration;
029    import org.apache.archiva.configuration.Configuration;
030    import org.apache.archiva.configuration.IndeterminateConfigurationException;
031    import org.apache.archiva.redback.components.cache.Cache;
032    import org.apache.archiva.redback.components.registry.RegistryException;
033    import org.apache.archiva.redback.configuration.UserConfiguration;
034    import org.apache.archiva.redback.configuration.UserConfigurationException;
035    import org.apache.archiva.redback.configuration.UserConfigurationKeys;
036    import org.apache.commons.lang.StringUtils;
037    import org.slf4j.Logger;
038    import org.slf4j.LoggerFactory;
039    import org.springframework.stereotype.Service;
040    
041    import javax.annotation.PostConstruct;
042    import javax.inject.Inject;
043    import javax.inject.Named;
044    import java.util.ArrayList;
045    import java.util.Collection;
046    import java.util.HashMap;
047    import java.util.HashSet;
048    import java.util.List;
049    import java.util.Map;
050    import java.util.Set;
051    
052    /**
053     * @author Olivier Lamy
054     * @since 1.4-M4
055     */
056    @Service( "redbackRuntimeConfigurationAdmin#default" )
057    public class DefaultRedbackRuntimeConfigurationAdmin
058        implements RedbackRuntimeConfigurationAdmin, UserConfiguration
059    {
060    
061        protected Logger log = LoggerFactory.getLogger( getClass() );
062    
063        @Inject
064        private ArchivaConfiguration archivaConfiguration;
065    
066        @Inject
067        @Named( value = "userConfiguration#redback" )
068        private UserConfiguration userConfiguration;
069    
070        @Inject
071        @Named( value = "cache#users" )
072        private Cache usersCache;
073    
074        @PostConstruct
075        public void initialize()
076            throws UserConfigurationException
077        {
078            try
079            {
080                RedbackRuntimeConfiguration redbackRuntimeConfiguration = getRedbackRuntimeConfiguration();
081                // migrate or not data from redback
082                if ( !redbackRuntimeConfiguration.isMigratedFromRedbackConfiguration() )
083                {
084                    // not migrated so build a new fresh one
085                    redbackRuntimeConfiguration = new RedbackRuntimeConfiguration();
086                    // so migrate if available
087                    String userManagerImpl =
088                        userConfiguration.getConcatenatedList( UserConfigurationKeys.USER_MANAGER_IMPL, "jdo" );
089                    if ( StringUtils.isNotEmpty( userManagerImpl ) )
090                    {
091                        String[] impls = StringUtils.split( userManagerImpl, ',' );
092                        for ( String impl : impls )
093                        {
094                            redbackRuntimeConfiguration.getUserManagerImpls().add( impl );
095                        }
096                    }
097    
098                    String rbacManagerImpls =
099                        userConfiguration.getConcatenatedList( UserConfigurationKeys.RBAC_MANAGER_IMPL, "jdo" );
100    
101                    if ( StringUtils.isNotEmpty( rbacManagerImpls ) )
102                    {
103                        String[] impls = StringUtils.split( rbacManagerImpls, ',' );
104                        for ( String impl : impls )
105                        {
106                            redbackRuntimeConfiguration.getRbacManagerImpls().add( impl );
107                        }
108                    }
109    
110                    // now ldap
111    
112                    LdapConfiguration ldapConfiguration = redbackRuntimeConfiguration.getLdapConfiguration();
113                    if ( ldapConfiguration == null )
114                    {
115                        ldapConfiguration = new LdapConfiguration();
116                        redbackRuntimeConfiguration.setLdapConfiguration( ldapConfiguration );
117                    }
118    
119                    ldapConfiguration.setHostName(
120                        userConfiguration.getString( UserConfigurationKeys.LDAP_HOSTNAME, null ) );
121                    ldapConfiguration.setPort( userConfiguration.getInt( UserConfigurationKeys.LDAP_PORT, -1 ) );
122                    ldapConfiguration.setSsl( userConfiguration.getBoolean( UserConfigurationKeys.LDAP_SSL, false ) );
123                    ldapConfiguration.setBaseDn(
124                        userConfiguration.getConcatenatedList( UserConfigurationKeys.LDAP_BASEDN, null ) );
125    
126                    ldapConfiguration.setBaseGroupsDn(
127                        userConfiguration.getConcatenatedList( UserConfigurationKeys.LDAP_GROUPS_BASEDN,
128                                                               ldapConfiguration.getBaseDn() ) );
129    
130                    ldapConfiguration.setContextFactory(
131                        userConfiguration.getString( UserConfigurationKeys.LDAP_CONTEX_FACTORY,
132                                                     isSunContextFactoryAvailable()
133                                                         ? "com.sun.jndi.ldap.LdapCtxFactory"
134                                                         : "" ) );
135                    ldapConfiguration.setBindDn(
136                        userConfiguration.getConcatenatedList( UserConfigurationKeys.LDAP_BINDDN, null ) );
137                    ldapConfiguration.setPassword(
138                        userConfiguration.getString( UserConfigurationKeys.LDAP_PASSWORD, null ) );
139                    ldapConfiguration.setAuthenticationMethod(
140                        userConfiguration.getString( UserConfigurationKeys.LDAP_AUTHENTICATION_METHOD, null ) );
141    
142                    ldapConfiguration.setWritable(
143                        userConfiguration.getBoolean( UserConfigurationKeys.LDAP_WRITABLE, false ) );
144    
145                    ldapConfiguration.setUseRoleNameAsGroup(
146                        userConfiguration.getBoolean( UserConfigurationKeys.LDAP_GROUPS_USE_ROLENAME, false ) );
147    
148                    boolean ldapBindAuthenticatorEnabled =
149                        userConfiguration.getBoolean( UserConfigurationKeys.LDAP_BIND_AUTHENTICATOR_ENABLED, false );
150                    ldapConfiguration.setBindAuthenticatorEnabled( ldapBindAuthenticatorEnabled );
151    
152                    // LDAP groups mapping reading !!
153                    // UserConfigurationKeys.LDAP_GROUPS_ROLE_START_KEY
154                    // userConfiguration.getKeys()
155    
156                    Collection<String> keys = userConfiguration.getKeys();
157    
158                    List<LdapGroupMapping> ldapGroupMappings = new ArrayList<LdapGroupMapping>();
159    
160                    for ( String key : keys )
161                    {
162                        if ( key.startsWith( UserConfigurationKeys.LDAP_GROUPS_ROLE_START_KEY ) )
163                        {
164                            String group =
165                                StringUtils.substringAfter( key, UserConfigurationKeys.LDAP_GROUPS_ROLE_START_KEY );
166                            String val = userConfiguration.getConcatenatedList( key, "" );
167                            if ( !StringUtils.isEmpty( val ) )
168                            {
169                                String[] roles = StringUtils.split( val, ',' );
170                                ldapGroupMappings.add( new LdapGroupMapping( group, roles ) );
171                            }
172                        }
173                    }
174    
175                    redbackRuntimeConfiguration.setLdapGroupMappings( ldapGroupMappings );
176    
177                    redbackRuntimeConfiguration.setMigratedFromRedbackConfiguration( true );
178    
179                    updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
180    
181                }
182                // we must ensure userManagerImpls list is not empty if so put at least jdo one !
183                if ( redbackRuntimeConfiguration.getUserManagerImpls().isEmpty() )
184                {
185                    log.info(
186                        "redbackRuntimeConfiguration with empty userManagerImpls so force at least jdo implementation !" );
187                    redbackRuntimeConfiguration.getUserManagerImpls().add( "jdo" );
188                    updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
189                }
190    
191                // we ensure authorizerImpls is not empty if so put
192                if ( redbackRuntimeConfiguration.getRbacManagerImpls().isEmpty() )
193                {
194                    log.info(
195                        "redbackRuntimeConfiguration with empty rbacManagerImpls so force at least cached implementation !" );
196                    redbackRuntimeConfiguration.getRbacManagerImpls().add( "cached" );
197                    updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
198                }
199    
200                boolean save = false;
201    
202                // NPE free
203                if ( redbackRuntimeConfiguration.getUsersCacheConfiguration() == null )
204                {
205                    redbackRuntimeConfiguration.setUsersCacheConfiguration( new CacheConfiguration() );
206                }
207                // if -1 it means non initialized to take values from the spring bean
208                if ( redbackRuntimeConfiguration.getUsersCacheConfiguration().getTimeToIdleSeconds() < 0 )
209                {
210                    redbackRuntimeConfiguration.getUsersCacheConfiguration().setTimeToIdleSeconds(
211                        usersCache.getTimeToIdleSeconds() );
212                    save = true;
213    
214                }
215                usersCache.setTimeToIdleSeconds(
216                    redbackRuntimeConfiguration.getUsersCacheConfiguration().getTimeToIdleSeconds() );
217    
218                if ( redbackRuntimeConfiguration.getUsersCacheConfiguration().getTimeToLiveSeconds() < 0 )
219                {
220                    redbackRuntimeConfiguration.getUsersCacheConfiguration().setTimeToLiveSeconds(
221                        usersCache.getTimeToLiveSeconds() );
222                    save = true;
223    
224                }
225                usersCache.setTimeToLiveSeconds(
226                    redbackRuntimeConfiguration.getUsersCacheConfiguration().getTimeToLiveSeconds() );
227    
228                if ( redbackRuntimeConfiguration.getUsersCacheConfiguration().getMaxElementsInMemory() < 0 )
229                {
230                    redbackRuntimeConfiguration.getUsersCacheConfiguration().setMaxElementsInMemory(
231                        usersCache.getMaxElementsInMemory() );
232                    save = true;
233                }
234                usersCache.setMaxElementsInMemory(
235                    redbackRuntimeConfiguration.getUsersCacheConfiguration().getMaxElementsInMemory() );
236    
237                if ( redbackRuntimeConfiguration.getUsersCacheConfiguration().getMaxElementsOnDisk() < 0 )
238                {
239                    redbackRuntimeConfiguration.getUsersCacheConfiguration().setMaxElementsOnDisk(
240                        usersCache.getMaxElementsOnDisk() );
241                    save = true;
242                }
243                usersCache.setMaxElementsOnDisk(
244                    redbackRuntimeConfiguration.getUsersCacheConfiguration().getMaxElementsOnDisk() );
245    
246                if ( save )
247                {
248                    updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
249                }
250    
251            }
252            catch ( RepositoryAdminException e )
253            {
254                throw new UserConfigurationException( e.getMessage(), e );
255            }
256        }
257    
258        private boolean isSunContextFactoryAvailable()
259        {
260            try
261            {
262                return Thread.currentThread().getContextClassLoader().loadClass( "com.sun.jndi.ldap.LdapCtxFactory" )
263                    != null;
264            }
265            catch ( ClassNotFoundException e )
266            {
267                return false;
268            }
269        }
270    
271        public RedbackRuntimeConfiguration getRedbackRuntimeConfiguration()
272        {
273            return build( archivaConfiguration.getConfiguration().getRedbackRuntimeConfiguration() );
274        }
275    
276        public void updateRedbackRuntimeConfiguration( RedbackRuntimeConfiguration redbackRuntimeConfiguration )
277            throws RepositoryAdminException
278        {
279            org.apache.archiva.configuration.RedbackRuntimeConfiguration runtimeConfiguration =
280                build( redbackRuntimeConfiguration );
281            Configuration configuration = archivaConfiguration.getConfiguration();
282            configuration.setRedbackRuntimeConfiguration( runtimeConfiguration );
283            try
284            {
285                archivaConfiguration.save( configuration );
286            }
287            catch ( RegistryException e )
288            {
289                throw new RepositoryAdminException( e.getMessage(), e );
290            }
291            catch ( IndeterminateConfigurationException e )
292            {
293                throw new RepositoryAdminException( e.getMessage(), e );
294            }
295        }
296    
297        private RedbackRuntimeConfiguration build(
298            org.apache.archiva.configuration.RedbackRuntimeConfiguration runtimeConfiguration )
299        {
300            RedbackRuntimeConfiguration redbackRuntimeConfiguration =
301                new BeanReplicator().replicateBean( runtimeConfiguration, RedbackRuntimeConfiguration.class );
302    
303            if ( runtimeConfiguration.getLdapConfiguration() != null )
304            {
305                redbackRuntimeConfiguration.setLdapConfiguration(
306                    new BeanReplicator().replicateBean( runtimeConfiguration.getLdapConfiguration(),
307                                                        LdapConfiguration.class ) );
308            }
309    
310            if ( runtimeConfiguration.getUsersCacheConfiguration() != null )
311            {
312                redbackRuntimeConfiguration.setUsersCacheConfiguration(
313                    new BeanReplicator().replicateBean( runtimeConfiguration.getUsersCacheConfiguration(),
314                                                        CacheConfiguration.class ) );
315            }
316    
317            if ( redbackRuntimeConfiguration.getLdapConfiguration() == null )
318            {
319                // prevent NPE
320                redbackRuntimeConfiguration.setLdapConfiguration( new LdapConfiguration() );
321            }
322    
323            if ( redbackRuntimeConfiguration.getUsersCacheConfiguration() == null )
324            {
325                redbackRuntimeConfiguration.setUsersCacheConfiguration( new CacheConfiguration() );
326            }
327    
328            List<org.apache.archiva.configuration.LdapGroupMapping> mappings = runtimeConfiguration.getLdapGroupMappings();
329    
330            if ( mappings != null && mappings.size() > 0 )
331            {
332                List<LdapGroupMapping> ldapGroupMappings = new ArrayList<LdapGroupMapping>( mappings.size() );
333    
334                for ( org.apache.archiva.configuration.LdapGroupMapping mapping : mappings )
335                {
336                    ldapGroupMappings.add( new LdapGroupMapping( mapping.getGroup(), mapping.getRoleNames() ) );
337                }
338    
339                redbackRuntimeConfiguration.setLdapGroupMappings( ldapGroupMappings );
340            }
341    
342            cleanupProperties( redbackRuntimeConfiguration );
343    
344            return redbackRuntimeConfiguration;
345        }
346    
347        /**
348         * cleaning from map properties used directly in archiva configuration fields
349         *
350         * @param redbackRuntimeConfiguration
351         */
352        private void cleanupProperties( RedbackRuntimeConfiguration redbackRuntimeConfiguration )
353        {
354            Map<String, String> properties = redbackRuntimeConfiguration.getConfigurationProperties();
355            properties.remove( UserConfigurationKeys.LDAP_HOSTNAME );
356            properties.remove( UserConfigurationKeys.LDAP_PORT );
357            properties.remove( UserConfigurationKeys.LDAP_BIND_AUTHENTICATOR_ENABLED );
358            properties.remove( UserConfigurationKeys.LDAP_SSL );
359            properties.remove( UserConfigurationKeys.LDAP_BASEDN );
360            properties.remove( UserConfigurationKeys.LDAP_GROUPS_BASEDN );
361            properties.remove( UserConfigurationKeys.LDAP_CONTEX_FACTORY );
362            properties.remove( UserConfigurationKeys.LDAP_BINDDN );
363            properties.remove( UserConfigurationKeys.LDAP_PASSWORD );
364            properties.remove( UserConfigurationKeys.LDAP_AUTHENTICATION_METHOD );
365            properties.remove( UserConfigurationKeys.LDAP_WRITABLE );
366            properties.remove( UserConfigurationKeys.LDAP_GROUPS_USE_ROLENAME );
367            // cleanup groups <-> role mapping
368            /**for ( Map.Entry<String, String> entry : new HashMap<String, String>( properties ).entrySet() )
369             {
370             if ( entry.getKey().startsWith( UserConfigurationKeys.LDAP_GROUPS_ROLE_START_KEY ) )
371             {
372             properties.remove( entry.getKey() );
373             }
374             }*/
375        }
376    
377        private org.apache.archiva.configuration.RedbackRuntimeConfiguration build(
378            RedbackRuntimeConfiguration archivaRuntimeConfiguration )
379        {
380            org.apache.archiva.configuration.RedbackRuntimeConfiguration redbackRuntimeConfiguration =
381                new BeanReplicator().replicateBean( archivaRuntimeConfiguration,
382                                                    org.apache.archiva.configuration.RedbackRuntimeConfiguration.class );
383    
384            if ( archivaRuntimeConfiguration.getLdapConfiguration() == null )
385            {
386                archivaRuntimeConfiguration.setLdapConfiguration( new LdapConfiguration() );
387            }
388            redbackRuntimeConfiguration.setLdapConfiguration(
389                new BeanReplicator().replicateBean( archivaRuntimeConfiguration.getLdapConfiguration(),
390                                                    org.apache.archiva.configuration.LdapConfiguration.class ) );
391    
392            if ( archivaRuntimeConfiguration.getUsersCacheConfiguration() == null )
393            {
394                archivaRuntimeConfiguration.setUsersCacheConfiguration( new CacheConfiguration() );
395            }
396    
397            redbackRuntimeConfiguration.setUsersCacheConfiguration(
398                new BeanReplicator().replicateBean( archivaRuntimeConfiguration.getUsersCacheConfiguration(),
399                                                    org.apache.archiva.configuration.CacheConfiguration.class ) );
400    
401            List<LdapGroupMapping> ldapGroupMappings = archivaRuntimeConfiguration.getLdapGroupMappings();
402    
403            if ( ldapGroupMappings != null && ldapGroupMappings.size() > 0 )
404            {
405    
406                List<org.apache.archiva.configuration.LdapGroupMapping> mappings =
407                    new ArrayList<org.apache.archiva.configuration.LdapGroupMapping>( ldapGroupMappings.size() );
408    
409                for ( LdapGroupMapping ldapGroupMapping : ldapGroupMappings )
410                {
411    
412                    org.apache.archiva.configuration.LdapGroupMapping mapping =
413                        new org.apache.archiva.configuration.LdapGroupMapping();
414                    mapping.setGroup( ldapGroupMapping.getGroup() );
415                    mapping.setRoleNames( new ArrayList<String>( ldapGroupMapping.getRoleNames() ) );
416                    mappings.add( mapping );
417    
418                }
419                redbackRuntimeConfiguration.setLdapGroupMappings( mappings );
420            }
421            return redbackRuntimeConfiguration;
422        }
423    
424        // wrapper for UserConfiguration to intercept values (and store it not yet migrated)
425    
426    
427        public String getString( String key )
428        {
429            if ( UserConfigurationKeys.USER_MANAGER_IMPL.equals( key ) )
430            {
431                // possible false for others than archiva user manager
432                return getRedbackRuntimeConfiguration().getUserManagerImpls().get( 0 );
433            }
434    
435            if ( StringUtils.startsWith( key, UserConfigurationKeys.LDAP_GROUPS_ROLE_START_KEY ) )
436            {
437                RedbackRuntimeConfiguration redbackRuntimeConfiguration = getRedbackRuntimeConfiguration();
438                int index = redbackRuntimeConfiguration.getLdapGroupMappings().indexOf( new LdapGroupMapping(
439                    StringUtils.substringAfter( key, UserConfigurationKeys.LDAP_GROUPS_ROLE_START_KEY ) ) );
440                if ( index > -1 )
441                {
442                    return StringUtils.join( redbackRuntimeConfiguration.getLdapGroupMappings().get( index ).getRoleNames(),
443                                             ',' );
444                }
445            }
446    
447            RedbackRuntimeConfiguration conf = getRedbackRuntimeConfiguration();
448    
449            if ( conf.getConfigurationProperties().containsKey( key ) )
450            {
451                return conf.getConfigurationProperties().get( key );
452            }
453    
454            String value = userConfiguration.getString( key );
455            if ( value == null )
456            {
457                return null;
458            }
459            conf.getConfigurationProperties().put( key, value );
460    
461            try
462            {
463                updateRedbackRuntimeConfiguration( conf );
464            }
465            catch ( RepositoryAdminException e )
466            {
467                log.error( "fail to save RedbackRuntimeConfiguration: {}", e.getMessage(), e );
468                throw new RuntimeException( e.getMessage(), e );
469            }
470    
471            return value;
472        }
473    
474        public String getString( String key, String defaultValue )
475        {
476            if ( UserConfigurationKeys.LDAP_HOSTNAME.equals( key ) )
477            {
478                return getRedbackRuntimeConfiguration().getLdapConfiguration().getHostName();
479            }
480            if ( UserConfigurationKeys.LDAP_CONTEX_FACTORY.equals( key ) )
481            {
482                return getRedbackRuntimeConfiguration().getLdapConfiguration().getContextFactory();
483            }
484            if ( UserConfigurationKeys.LDAP_PASSWORD.equals( key ) )
485            {
486                return getRedbackRuntimeConfiguration().getLdapConfiguration().getPassword();
487            }
488            if ( UserConfigurationKeys.LDAP_AUTHENTICATION_METHOD.equals( key ) )
489            {
490                return getRedbackRuntimeConfiguration().getLdapConfiguration().getAuthenticationMethod();
491            }
492    
493            RedbackRuntimeConfiguration conf = getRedbackRuntimeConfiguration();
494    
495            if ( conf.getConfigurationProperties().containsKey( key ) )
496            {
497                return conf.getConfigurationProperties().get( key );
498            }
499    
500            String value = userConfiguration.getString( key, defaultValue );
501    
502            if ( value == null )
503            {
504                return null;
505            }
506    
507            conf.getConfigurationProperties().put( key, value );
508            try
509            {
510                updateRedbackRuntimeConfiguration( conf );
511            }
512            catch ( RepositoryAdminException e )
513            {
514                log.error( "fail to save RedbackRuntimeConfiguration: {}", e.getMessage(), e );
515                throw new RuntimeException( e.getMessage(), e );
516            }
517    
518            return value;
519        }
520    
521        public int getInt( String key )
522        {
523            RedbackRuntimeConfiguration conf = getRedbackRuntimeConfiguration();
524    
525            if ( conf.getConfigurationProperties().containsKey( key ) )
526            {
527                return Integer.valueOf( conf.getConfigurationProperties().get( key ) );
528            }
529    
530            int value = userConfiguration.getInt( key );
531    
532            conf.getConfigurationProperties().put( key, Integer.toString( value ) );
533            try
534            {
535                updateRedbackRuntimeConfiguration( conf );
536            }
537            catch ( RepositoryAdminException e )
538            {
539                log.error( "fail to save RedbackRuntimeConfiguration: {}", e.getMessage(), e );
540                throw new RuntimeException( e.getMessage(), e );
541            }
542    
543            return value;
544        }
545    
546        public int getInt( String key, int defaultValue )
547        {
548            if ( UserConfigurationKeys.LDAP_PORT.equals( key ) )
549            {
550                return getRedbackRuntimeConfiguration().getLdapConfiguration().getPort();
551            }
552    
553            RedbackRuntimeConfiguration conf = getRedbackRuntimeConfiguration();
554    
555            if ( conf.getConfigurationProperties().containsKey( key ) )
556            {
557                return Integer.valueOf( conf.getConfigurationProperties().get( key ) );
558            }
559    
560            int value = userConfiguration.getInt( key, defaultValue );
561    
562            conf.getConfigurationProperties().put( key, Integer.toString( value ) );
563            try
564            {
565                updateRedbackRuntimeConfiguration( conf );
566            }
567            catch ( RepositoryAdminException e )
568            {
569                log.error( "fail to save RedbackRuntimeConfiguration: {}", e.getMessage(), e );
570                throw new RuntimeException( e.getMessage(), e );
571            }
572    
573            return value;
574        }
575    
576        public boolean getBoolean( String key )
577        {
578            RedbackRuntimeConfiguration conf = getRedbackRuntimeConfiguration();
579    
580            if ( UserConfigurationKeys.LDAP_WRITABLE.equals( key ) )
581            {
582                return conf.getLdapConfiguration().isWritable();
583            }
584    
585            if ( UserConfigurationKeys.LDAP_GROUPS_USE_ROLENAME.equals( key ) )
586            {
587                return conf.getLdapConfiguration().isUseRoleNameAsGroup();
588            }
589    
590            if ( UserConfigurationKeys.LDAP_BIND_AUTHENTICATOR_ENABLED.equals( key ) )
591            {
592                return conf.getLdapConfiguration().isBindAuthenticatorEnabled();
593            }
594    
595            if ( conf.getConfigurationProperties().containsKey( key ) )
596            {
597                return Boolean.valueOf( conf.getConfigurationProperties().get( key ) );
598            }
599    
600            boolean value = userConfiguration.getBoolean( key );
601    
602            conf.getConfigurationProperties().put( key, Boolean.toString( value ) );
603            try
604            {
605                updateRedbackRuntimeConfiguration( conf );
606            }
607            catch ( RepositoryAdminException e )
608            {
609                log.error( "fail to save RedbackRuntimeConfiguration: {}", e.getMessage(), e );
610                throw new RuntimeException( e.getMessage(), e );
611            }
612    
613            return value;
614        }
615    
616        public boolean getBoolean( String key, boolean defaultValue )
617        {
618            if ( UserConfigurationKeys.LDAP_SSL.equals( key ) )
619            {
620                return getRedbackRuntimeConfiguration().getLdapConfiguration().isSsl();
621            }
622    
623            if ( UserConfigurationKeys.LDAP_WRITABLE.equals( key ) )
624            {
625                return getRedbackRuntimeConfiguration().getLdapConfiguration().isWritable();
626            }
627    
628            if ( UserConfigurationKeys.LDAP_GROUPS_USE_ROLENAME.equals( key ) )
629            {
630                return getRedbackRuntimeConfiguration().getLdapConfiguration().isUseRoleNameAsGroup();
631            }
632    
633            if ( UserConfigurationKeys.LDAP_BIND_AUTHENTICATOR_ENABLED.equals( key ) )
634            {
635                return getRedbackRuntimeConfiguration().getLdapConfiguration().isBindAuthenticatorEnabled();
636            }
637    
638            RedbackRuntimeConfiguration conf = getRedbackRuntimeConfiguration();
639    
640            if ( conf.getConfigurationProperties().containsKey( key ) )
641            {
642                return Boolean.valueOf( conf.getConfigurationProperties().get( key ) );
643            }
644    
645            boolean value = userConfiguration.getBoolean( key, defaultValue );
646    
647            conf.getConfigurationProperties().put( key, Boolean.toString( value ) );
648            try
649            {
650                updateRedbackRuntimeConfiguration( conf );
651            }
652            catch ( RepositoryAdminException e )
653            {
654                log.error( "fail to save RedbackRuntimeConfiguration: {}", e.getMessage(), e );
655                throw new RuntimeException( e.getMessage(), e );
656            }
657    
658            return value;
659        }
660    
661        public List<String> getList( String key )
662        {
663            List<String> value = userConfiguration.getList( key );
664    
665            RedbackRuntimeConfiguration conf = getRedbackRuntimeConfiguration();
666            // TODO concat values
667            conf.getConfigurationProperties().put( key, "" );
668            try
669            {
670                updateRedbackRuntimeConfiguration( conf );
671            }
672            catch ( RepositoryAdminException e )
673            {
674                log.error( "fail to save RedbackRuntimeConfiguration: {}", e.getMessage(), e );
675                throw new RuntimeException( e.getMessage(), e );
676            }
677    
678            return value;
679        }
680    
681        public String getConcatenatedList( String key, String defaultValue )
682        {
683            if ( UserConfigurationKeys.LDAP_BASEDN.equals( key ) )
684            {
685                return getRedbackRuntimeConfiguration().getLdapConfiguration().getBaseDn();
686            }
687            if ( UserConfigurationKeys.LDAP_BINDDN.equals( key ) )
688            {
689                return getRedbackRuntimeConfiguration().getLdapConfiguration().getBindDn();
690            }
691            if ( UserConfigurationKeys.LDAP_GROUPS_BASEDN.equals( key ) )
692            {
693                return getRedbackRuntimeConfiguration().getLdapConfiguration().getBaseGroupsDn();
694            }
695            return userConfiguration.getConcatenatedList( key, defaultValue );
696        }
697    
698        public Collection<String> getKeys()
699        {
700            Collection<String> keys = userConfiguration.getKeys();
701    
702            Set<String> keysSet = new HashSet<String>( keys );
703    
704            keysSet.addAll( getRedbackRuntimeConfiguration().getConfigurationProperties().keySet() );
705    
706            return keysSet;
707        }
708    
709    
710    }