[MRM-1736] map roles to ldap groups

git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1460936 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Olivier Lamy 2013-03-26 00:07:51 +00:00
parent bdabf612a2
commit 1323fcc1dc
2 changed files with 290 additions and 0 deletions

View File

@ -0,0 +1,115 @@
package org.apache.archiva.admin.model.beans;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.Arrays;
import java.util.Collection;
/**
* @author Olivier Lamy
* @since 1.4-M4
*/
public class LdapGroupMapping
{
private String group;
private Collection<String> roleNames;
public LdapGroupMapping()
{
// no op
}
public LdapGroupMapping( String group )
{
this.group = group;
}
public LdapGroupMapping( String group, Collection<String> roleNames )
{
this.group = group;
this.roleNames = roleNames;
}
public LdapGroupMapping( String group, String[] roleNames )
{
this.group = group;
if ( roleNames != null )
{
this.roleNames = Arrays.asList( roleNames );
}
}
public String getGroup()
{
return group;
}
public void setGroup( String group )
{
this.group = group;
}
public Collection<String> getRoleNames()
{
return roleNames;
}
public void setRoleNames( Collection<String> roleNames )
{
this.roleNames = roleNames;
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
LdapGroupMapping that = (LdapGroupMapping) o;
if ( group != null ? !group.equals( that.group ) : that.group != null )
{
return false;
}
return true;
}
@Override
public int hashCode()
{
return group != null ? group.hashCode() : 0;
}
@Override
public String toString()
{
return "LdapGroupMapping{" +
"group='" + group + '\'' +
", roleNames=" + roleNames +
'}';
}
}

View File

@ -0,0 +1,175 @@
package org.apache.archiva.web.security;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.archiva.admin.model.RepositoryAdminException;
import org.apache.archiva.admin.model.beans.LdapGroupMapping;
import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
import org.apache.archiva.redback.common.ldap.MappingException;
import org.apache.archiva.redback.common.ldap.role.LdapRoleMapperConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Olivier Lamy
* @since 2.1
*/
@Service( "ldapRoleMapperConfiguration#archiva" )
public class ArchivaLdapRoleMapperConfiguration
implements LdapRoleMapperConfiguration
{
private Logger logger = LoggerFactory.getLogger( getClass() );
@Inject
@Named( value = "redbackRuntimeConfigurationAdmin#default" )
private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
public void addLdapMapping( String ldapGroup, List<String> roles )
throws MappingException
{
logger.debug( "addLdapMapping ldapGroup: {}, roles: {}", ldapGroup, roles );
// TODO check if already exist first
try
{
RedbackRuntimeConfiguration redbackRuntimeConfiguration =
redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
boolean added =
redbackRuntimeConfiguration.getLdapGroupMappings().add( new LdapGroupMapping( ldapGroup, roles ) );
logger.debug( "addLdapMapping ldapGroup: {}, roles: {}, added: {}", ldapGroup, roles, added );
redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
}
catch ( RepositoryAdminException e )
{
throw new MappingException( e.getMessage(), e );
}
}
public void updateLdapMapping( String ldapGroup, List<String> roles )
throws MappingException
{
try
{
RedbackRuntimeConfiguration redbackRuntimeConfiguration =
redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
LdapGroupMapping ldapGroupMapping = new LdapGroupMapping( ldapGroup );
int idx = redbackRuntimeConfiguration.getLdapGroupMappings().indexOf( ldapGroupMapping );
if ( idx > -1 )
{
logger.debug( "updateLdapMapping ldapGroup: {}, roles: {}", ldapGroup, roles );
ldapGroupMapping = redbackRuntimeConfiguration.getLdapGroupMappings().get( idx );
ldapGroupMapping.setRoleNames( roles );
}
redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
}
catch ( RepositoryAdminException e )
{
throw new MappingException( e.getMessage(), e );
}
}
public void removeLdapMapping( String group )
throws MappingException
{
try
{
RedbackRuntimeConfiguration redbackRuntimeConfiguration =
redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
boolean removed =
redbackRuntimeConfiguration.getLdapGroupMappings().remove( new LdapGroupMapping( group ) );
redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
logger.debug( "removeLdapMapping ldapGroup: {}, removed: {}", group, removed );
}
catch ( RepositoryAdminException e )
{
throw new MappingException( e.getMessage(), e );
}
}
public Map<String, Collection<String>> getLdapGroupMappings()
throws MappingException
{
try
{
RedbackRuntimeConfiguration redbackRuntimeConfiguration =
redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
List<LdapGroupMapping> ldapGroupMappings = redbackRuntimeConfiguration.getLdapGroupMappings();
if ( ldapGroupMappings == null )
{
return Collections.emptyMap();
}
Map<String, Collection<String>> res = new HashMap<String, Collection<String>>( ldapGroupMappings.size() );
for ( LdapGroupMapping ldapGroupMapping : ldapGroupMappings )
{
res.put( ldapGroupMapping.getGroup(), ldapGroupMapping.getRoleNames() );
}
return res;
}
catch ( RepositoryAdminException e )
{
throw new MappingException( e.getMessage(), e );
}
}
public void setLdapGroupMappings( Map<String, List<String>> mappings )
throws MappingException
{
try
{
RedbackRuntimeConfiguration redbackRuntimeConfiguration =
redbackRuntimeConfigurationAdmin.getRedbackRuntimeConfiguration();
List<LdapGroupMapping> ldapGroupMappings = new ArrayList<LdapGroupMapping>( mappings.size() );
for ( Map.Entry<String, List<String>> entry : mappings.entrySet() )
{
ldapGroupMappings.add( new LdapGroupMapping( entry.getKey(), entry.getValue() ) );
}
redbackRuntimeConfiguration.setLdapGroupMappings( ldapGroupMappings );
redbackRuntimeConfigurationAdmin.updateRedbackRuntimeConfiguration( redbackRuntimeConfiguration );
}
catch ( RepositoryAdminException e )
{
throw new MappingException( e.getMessage(), e );
}
}
}