001    package org.apache.archiva.web.security;
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 org.apache.archiva.admin.model.RepositoryAdminException;
022    import org.apache.archiva.admin.model.beans.LdapGroupMapping;
023    import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
024    import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
025    import org.apache.archiva.redback.common.ldap.MappingException;
026    import org.apache.archiva.redback.common.ldap.role.LdapRoleMapperConfiguration;
027    import org.slf4j.Logger;
028    import org.slf4j.LoggerFactory;
029    import org.springframework.stereotype.Service;
030    
031    import javax.inject.Inject;
032    import javax.inject.Named;
033    import java.util.ArrayList;
034    import java.util.Collection;
035    import java.util.Collections;
036    import java.util.HashMap;
037    import java.util.List;
038    import java.util.Map;
039    
040    /**
041     * @author Olivier Lamy
042     * @since 2.1
043     */
044    @Service( "ldapRoleMapperConfiguration#archiva" )
045    public class ArchivaLdapRoleMapperConfiguration
046        implements LdapRoleMapperConfiguration
047    {
048    
049        private Logger logger = LoggerFactory.getLogger( getClass() );
050    
051        @Inject
052        @Named( value = "redbackRuntimeConfigurationAdmin#default" )
053        private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
054    
055        public void addLdapMapping( String ldapGroup, List<String> roles )
056            throws MappingException
057        {
058            logger.debug( "addLdapMapping ldapGroup: {}, roles: {}", ldapGroup, roles );
059            // TODO check if already exist first
060            try
061            {
062                RedbackRuntimeConfiguration redbackRuntimeConfiguration =
063                    redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
064                boolean added =
065                    redbackRuntimeConfiguration.getLdapGroupMappings().add( new LdapGroupMapping( ldapGroup, roles ) );
066                logger.debug( "addLdapMapping ldapGroup: {}, roles: {}, added: {}", ldapGroup, roles, added );
067                redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
068            }
069            catch ( RepositoryAdminException e )
070            {
071                throw new MappingException( e.getMessage(), e );
072            }
073    
074        }
075    
076        public void updateLdapMapping( String ldapGroup, List<String> roles )
077            throws MappingException
078        {
079    
080            try
081            {
082                RedbackRuntimeConfiguration redbackRuntimeConfiguration =
083                    redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
084                LdapGroupMapping ldapGroupMapping = new LdapGroupMapping( ldapGroup );
085                int idx = redbackRuntimeConfiguration.getLdapGroupMappings().indexOf( ldapGroupMapping );
086                if ( idx > -1 )
087                {
088                    logger.debug( "updateLdapMapping ldapGroup: {}, roles: {}", ldapGroup, roles );
089                    ldapGroupMapping = redbackRuntimeConfiguration.getLdapGroupMappings().get( idx );
090                    ldapGroupMapping.setRoleNames( roles );
091                }
092                redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
093    
094            }
095            catch ( RepositoryAdminException e )
096            {
097                throw new MappingException( e.getMessage(), e );
098            }
099        }
100    
101        public void removeLdapMapping( String group )
102            throws MappingException
103        {
104            try
105            {
106                RedbackRuntimeConfiguration redbackRuntimeConfiguration =
107                    redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
108                boolean removed =
109                    redbackRuntimeConfiguration.getLdapGroupMappings().remove( new LdapGroupMapping( group ) );
110                redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
111                logger.debug( "removeLdapMapping ldapGroup: {}, removed: {}", group, removed );
112            }
113            catch ( RepositoryAdminException e )
114            {
115                throw new MappingException( e.getMessage(), e );
116            }
117    
118        }
119    
120        public Map<String, Collection<String>> getLdapGroupMappings()
121            throws MappingException
122        {
123            try
124            {
125                RedbackRuntimeConfiguration redbackRuntimeConfiguration =
126                    redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
127    
128                List<LdapGroupMapping> ldapGroupMappings = redbackRuntimeConfiguration.getLdapGroupMappings();
129    
130                if ( ldapGroupMappings == null )
131                {
132                    return Collections.emptyMap();
133                }
134    
135                Map<String, Collection<String>> res = new HashMap<String, Collection<String>>( ldapGroupMappings.size() );
136    
137                for ( LdapGroupMapping ldapGroupMapping : ldapGroupMappings )
138                {
139                    res.put( ldapGroupMapping.getGroup(), ldapGroupMapping.getRoleNames() );
140                }
141    
142                return res;
143            }
144            catch ( RepositoryAdminException e )
145            {
146                throw new MappingException( e.getMessage(), e );
147            }
148        }
149    
150        public void setLdapGroupMappings( Map<String, List<String>> mappings )
151            throws MappingException
152        {
153            try
154            {
155                RedbackRuntimeConfiguration redbackRuntimeConfiguration =
156                    redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
157    
158                List<LdapGroupMapping> ldapGroupMappings = new ArrayList<LdapGroupMapping>( mappings.size() );
159    
160                for ( Map.Entry<String, List<String>> entry : mappings.entrySet() )
161                {
162                    ldapGroupMappings.add( new LdapGroupMapping( entry.getKey(), entry.getValue() ) );
163                }
164    
165                redbackRuntimeConfiguration.setLdapGroupMappings( ldapGroupMappings );
166    
167                redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
168            }
169            catch ( RepositoryAdminException e )
170            {
171                throw new MappingException( e.getMessage(), e );
172            }
173    
174        }
175    }