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 }