View Javadoc

1   package org.apache.archiva.web.security;
2   /*
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   * http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   */
20  
21  import org.apache.archiva.admin.model.RepositoryAdminException;
22  import org.apache.archiva.admin.model.beans.LdapGroupMapping;
23  import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
24  import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
25  import org.apache.archiva.redback.common.ldap.MappingException;
26  import org.apache.archiva.redback.common.ldap.role.LdapRoleMapperConfiguration;
27  import org.slf4j.Logger;
28  import org.slf4j.LoggerFactory;
29  import org.springframework.stereotype.Service;
30  
31  import javax.inject.Inject;
32  import javax.inject.Named;
33  import java.util.ArrayList;
34  import java.util.Collection;
35  import java.util.Collections;
36  import java.util.HashMap;
37  import java.util.List;
38  import java.util.Map;
39  
40  /**
41   * @author Olivier Lamy
42   * @since 2.1
43   */
44  @Service( "ldapRoleMapperConfiguration#archiva" )
45  public class ArchivaLdapRoleMapperConfiguration
46      implements LdapRoleMapperConfiguration
47  {
48  
49      private Logger logger = LoggerFactory.getLogger( getClass() );
50  
51      @Inject
52      @Named( value = "redbackRuntimeConfigurationAdmin#default" )
53      private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
54  
55      public void addLdapMapping( String ldapGroup, List<String> roles )
56          throws MappingException
57      {
58          logger.debug( "addLdapMapping ldapGroup: {}, roles: {}", ldapGroup, roles );
59          // TODO check if already exist first
60          try
61          {
62              RedbackRuntimeConfiguration redbackRuntimeConfiguration =
63                  redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
64              boolean added =
65                  redbackRuntimeConfiguration.getLdapGroupMappings().add( new LdapGroupMapping( ldapGroup, roles ) );
66              logger.debug( "addLdapMapping ldapGroup: {}, roles: {}, added: {}", ldapGroup, roles, added );
67              redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
68          }
69          catch ( RepositoryAdminException e )
70          {
71              throw new MappingException( e.getMessage(), e );
72          }
73  
74      }
75  
76      public void updateLdapMapping( String ldapGroup, List<String> roles )
77          throws MappingException
78      {
79  
80          try
81          {
82              RedbackRuntimeConfiguration redbackRuntimeConfiguration =
83                  redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
84              LdapGroupMapping ldapGroupMapping = new LdapGroupMapping( ldapGroup );
85              int idx = redbackRuntimeConfiguration.getLdapGroupMappings().indexOf( ldapGroupMapping );
86              if ( idx > -1 )
87              {
88                  logger.debug( "updateLdapMapping ldapGroup: {}, roles: {}", ldapGroup, roles );
89                  ldapGroupMapping = redbackRuntimeConfiguration.getLdapGroupMappings().get( idx );
90                  ldapGroupMapping.setRoleNames( roles );
91              }
92              redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
93  
94          }
95          catch ( RepositoryAdminException e )
96          {
97              throw new MappingException( e.getMessage(), e );
98          }
99      }
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 }