[MRM-1504] repository admin module : implements update ManagedRepository

git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1163025 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Olivier Lamy 2011-08-29 21:42:14 +00:00
parent 8015b813c2
commit 8eba376fb8
5 changed files with 456 additions and 10 deletions

View File

@ -31,11 +31,19 @@
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-configuration</artifactId>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-security</artifactId>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-scheduler-repository</artifactId>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>audit</artifactId>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
@ -79,6 +87,26 @@
<groupId>org.codehaus.redback.components</groupId>
<artifactId>spring-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.redback</groupId>
<artifactId>redback-rbac-role-manager</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.codehaus.redback</groupId>
<artifactId>redback-authentication-api</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
@ -90,6 +118,33 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.redback</groupId>
<artifactId>redback-users-memory</artifactId>
<scope>test</scope>
<version>${redback.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.redback</groupId>
<artifactId>redback-keys-memory</artifactId>
<scope>test</scope>
<version>${redback.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.redback</groupId>
<artifactId>redback-rbac-cached</artifactId>
<version>${redback.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
@ -118,6 +173,7 @@
<configuration>
<systemPropertyVariables>
<appserver.base>${project.build.outputDirectory}</appserver.base>
<plexus.home>${project.build.outputDirectory}</plexus.home>
</systemPropertyVariables>
</configuration>

View File

@ -19,6 +19,8 @@
*/
import org.apache.archiva.admin.repository.RepositoryAdminException;
import org.apache.archiva.audit.AuditEvent;
import org.apache.archiva.audit.AuditListener;
import org.apache.archiva.metadata.repository.MetadataRepository;
import org.apache.archiva.metadata.repository.MetadataRepositoryException;
import org.apache.archiva.metadata.repository.RepositorySession;
@ -34,6 +36,10 @@
import org.apache.maven.archiva.configuration.IndeterminateConfigurationException;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
import org.apache.maven.archiva.security.ArchivaRoleConstants;
import org.codehaus.plexus.redback.role.RoleManager;
import org.codehaus.plexus.redback.role.RoleManagerException;
import org.codehaus.plexus.redback.users.User;
import org.codehaus.plexus.registry.Registry;
import org.codehaus.plexus.registry.RegistryException;
import org.codehaus.plexus.taskqueue.TaskQueueException;
@ -82,10 +88,15 @@ public class DefaultManagedRepositoryAdmin
@Inject
private RepositorySessionFactory repositorySessionFactory;
@Inject
private RepositoryStatisticsManager repositoryStatisticsManager;
@Inject
private List<AuditListener> auditListeners = new ArrayList<AuditListener>();
@Inject
protected RoleManager roleManager;
public List<ManagedRepository> getManagedRepositories()
throws RepositoryAdminException
{
@ -122,7 +133,7 @@ public ManagedRepository getManagedRepository( String repositoryId )
return null;
}
public Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
public Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException
{
return
@ -241,7 +252,7 @@ else if ( config.getRepositoryGroupsAsMap().containsKey( repoId ) )
}
public Boolean deleteManagedRepository( String repositoryId )
public Boolean deleteManagedRepository( String repositoryId, User user )
throws RepositoryAdminException
{
Configuration config = archivaConfiguration.getConfiguration();
@ -314,16 +325,118 @@ public Boolean deleteManagedRepository( String repositoryId )
}
public Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
public Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException
{
return null; //To change body of implemented methods use File | Settings | File Templates.
// Ensure that the fields are valid.
Configuration configuration = archivaConfiguration.getConfiguration();
ManagedRepositoryConfiguration toremove = configuration.findManagedRepositoryById( managedRepository.getId() );
if ( toremove != null )
{
configuration.removeManagedRepository( toremove );
}
// FIXME the case of the attached staging repository
/*
if ( stagingRepository != null )
{
removeRepository( stagingRepository.getId(), configuration );
}*/
// Save the repository configuration.
String result;
RepositorySession repositorySession = repositorySessionFactory.createSession();
ManagedRepositoryConfiguration managedRepositoryConfiguration =
addManagedRepository( managedRepository.getId(), managedRepository.getLayout(), managedRepository.getName(),
managedRepository.getLocation(), managedRepository.isBlockRedeployments(),
managedRepository.isReleases(), managedRepository.isSnapshots(), needStageRepo,
managedRepository.getCronExpression() );
// FIXME only location has changed from previous
boolean resetStats = true;
try
{
triggerAuditEvent( managedRepository.getId(), null, AuditEvent.MODIFY_MANAGED_REPO, user );
addRepositoryRoles( managedRepositoryConfiguration );
// FIXME this staging part !!
//update changes of the staging repo
/*if ( stageNeeded )
{
stagingRepository = getStageRepoConfig( configuration );
addRepository( stagingRepository, configuration );
addRepositoryRoles( stagingRepository );
}*/
//delete staging repo when we dont need it
/*
if ( !stageNeeded )
{
stagingRepository = getStageRepoConfig( configuration );
removeRepository( stagingRepository.getId(), configuration );
removeContents( stagingRepository );
removeRepositoryRoles( stagingRepository );
}*/
saveConfiguration( this.archivaConfiguration.getConfiguration() );
if ( resetStats )
{
repositoryStatisticsManager.deleteStatistics( repositorySession.getRepository(),
managedRepository.getId() );
repositorySession.save();
}
//MRM-1342 Repository statistics report doesn't appear to be working correctly
//scan repository when modification of repository is successful
// olamy : IMHO we are fine to ignore issue with scheduling scanning
// as here the repo has been updated
scanRepository( managedRepository.getId(), true );
// FIXME staging !!
/*
if ( stageNeeded )
{
executeRepositoryScanner( stagingRepository.getId() );
}*/
}
catch ( RoleManagerException e )
{
throw new RepositoryAdminException( e.getMessage(), e );
}
catch ( MetadataRepositoryException e )
{
throw new RepositoryAdminException( e.getMessage(), e );
}
finally
{
repositorySession.close();
}
return true;
}
//--------------------------
// utils methods
//--------------------------
protected void triggerAuditEvent( String repositoryId, String resource, String action, User user )
{
log.warn( "no user found in triggerAuditEvent" );
AuditEvent event = new AuditEvent( repositoryId, user == null ? "null" : user.getUsername(), resource, action );
// FIXME use a thread local through cxf interceptors to store this
//event.setRemoteIP( getRemoteAddr() );
for ( AuditListener listener : auditListeners )
{
listener.auditEvent( event );
}
}
private String removeExpressions( String directory )
{
String value = StringUtils.replace( directory, "${appserver.base}",
@ -410,4 +523,23 @@ public Boolean scanRepository( String repositoryId, boolean fullScan )
}
return true;
}
protected void addRepositoryRoles( ManagedRepositoryConfiguration newRepository )
throws RoleManagerException
{
String repoId = newRepository.getId();
// TODO: double check these are configured on start up
// TODO: belongs in the business logic
if ( !roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId ) )
{
roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId );
}
if ( !roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId ) )
{
roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId );
}
}
}

View File

@ -20,6 +20,7 @@
import org.apache.archiva.admin.repository.RepositoryAdminException;
import org.codehaus.plexus.redback.users.User;
import java.util.List;
@ -35,14 +36,14 @@ List<ManagedRepository> getManagedRepositories()
ManagedRepository getManagedRepository( String repositoryId )
throws RepositoryAdminException;
Boolean deleteManagedRepository( String repositoryId )
Boolean deleteManagedRepository( String repositoryId, User user )
throws RepositoryAdminException;
Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException;
Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException;

View File

@ -19,9 +19,12 @@
*/
import org.apache.commons.lang.StringUtils;
import org.codehaus.plexus.redback.users.User;
import org.codehaus.plexus.redback.users.memory.SimpleUser;
import org.junit.Test;
import javax.inject.Inject;
import java.io.File;
import java.util.List;
/**
@ -71,20 +74,53 @@ public void addDeleteManagedRepo()
repo.setId( "test-new-one" );
repo.setName( "test repo" );
repo.setLocation( APPSERVER_BASE_PATH + repo.getId() );
managedRepositoryAdmin.addManagedRepository( repo, false );
managedRepositoryAdmin.addManagedRepository( repo, false, getFakeUser() );
repos = managedRepositoryAdmin.getManagedRepositories();
assertNotNull( repos );
assertEquals( initialSize + 1, repos.size() );
assertNotNull( managedRepositoryAdmin.getManagedRepository( "test-new-one" ) );
managedRepositoryAdmin.deleteManagedRepository( "test-new-one" );
managedRepositoryAdmin.deleteManagedRepository( "test-new-one", getFakeUser() );
repos = managedRepositoryAdmin.getManagedRepositories();
assertNotNull( repos );
assertEquals( initialSize, repos.size() );
}
@Test
public void updateDeleteManagedRepo()
throws Exception
{
List<ManagedRepository> repos = managedRepositoryAdmin.getManagedRepositories();
assertNotNull( repos );
int initialSize = repos.size();
assertTrue( initialSize > 0 );
ManagedRepository repo = new ManagedRepository();
repo.setId( "test-new-one" );
repo.setName( "test repo" );
repo.setLocation( APPSERVER_BASE_PATH + repo.getId() );
managedRepositoryAdmin.addManagedRepository( repo, false, getFakeUser() );
repos = managedRepositoryAdmin.getManagedRepositories();
assertNotNull( repos );
assertEquals( initialSize + 1, repos.size() );
String newName = "test repo update";
repo.setName( newName );
repo.setLocation( APPSERVER_BASE_PATH + "new-path" );
managedRepositoryAdmin.updateManagedRepository( repo, false, getFakeUser() );
repo = managedRepositoryAdmin.getManagedRepository( "test-new-one" );
assertNotNull( repo );
assertEquals( newName, repo.getName() );
assertEquals( APPSERVER_BASE_PATH + "new-path", repo.getLocation() );
assertTrue( new File( APPSERVER_BASE_PATH + "new-path" ).exists() );
}
private ManagedRepository findManagedRepoById( List<ManagedRepository> repos, String id )
{
@ -98,4 +134,12 @@ private ManagedRepository findManagedRepoById( List<ManagedRepository> repos, St
return null;
}
User getFakeUser()
{
SimpleUser user = new SimpleUser();
user.setUsername( "root" );
user.setFullName( "The top user" );
return user;
}
}

View File

@ -0,0 +1,213 @@
<redback-role-model>
<modelVersion>1.0.0</modelVersion>
<applications>
<application>
<id>System</id>
<description>Roles that apply system-wide, across all of the applications</description>
<version>1.0.0</version>
<resources>
<resource>
<id>global</id>
<name>*</name>
<permanent>true</permanent>
<description>global resource implies full access for authorization</description>
</resource>
<resource>
<id>username</id>
<name>${username}</name>
<permanent>true</permanent>
<description>replaced with the username of the principal at authorization check time</description>
</resource>
</resources>
<operations>
<operation>
<id>configuration-edit</id>
<name>configuration-edit</name>
<description>edit configuration</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-user-create</id>
<name>user-management-user-create</name>
<description>create user</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-user-edit</id>
<name>user-management-user-edit</name>
<description>edit user</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-user-role</id>
<name>user-management-user-role</name>
<description>user roles</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-user-delete</id>
<name>user-management-user-delete</name>
<description>delete user</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-user-list</id>
<name>user-management-user-list</name>
<description>list users</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-role-grant</id>
<name>user-management-role-grant</name>
<description>grant role</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-role-drop</id>
<name>user-management-role-drop</name>
<description>drop role</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-rbac-admin</id>
<name>user-management-rbac-admin</name>
<description>administer rbac</description>
<permanent>true</permanent>
</operation>
<operation>
<id>guest-access</id>
<name>guest-access</name>
<description>access guest</description>
<permanent>true</permanent>
</operation>
<operation>
<id>user-management-manage-data</id>
<name>user-management-manage-data</name>
<description>manage data</description>
<permanent>true</permanent>
</operation>
</operations>
<roles>
<role>
<id>system-administrator</id>
<name>System Administrator</name>
<permanent>true</permanent>
<assignable>true</assignable>
<permissions>
<permission>
<id>edit-redback-configuration</id>
<name>Edit Redback Configuration</name>
<operation>configuration-edit</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>manage-rbac-setup</id>
<name>User RBAC Management</name>
<operation>user-management-rbac-admin</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>manage-rbac-data</id>
<name>RBAC Manage Data</name>
<operation>user-management-manage-data</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
</permissions>
<childRoles>
<childRole>user-administrator</childRole>
</childRoles>
</role>
<role>
<id>user-administrator</id>
<name>User Administrator</name>
<permanent>true</permanent>
<assignable>true</assignable>
<permissions>
<permission>
<id>drop-roles-for-anyone</id>
<name>Drop Roles for Anyone</name>
<operation>user-management-role-drop</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>grant-roles-for-anyone</id>
<name>Grant Roles for Anyone</name>
<operation>user-management-role-grant</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>user-create</id>
<name>Create Users</name>
<operation>user-management-user-create</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>user-delete</id>
<name>Delete Users</name>
<operation>user-management-user-delete</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>user-edit</id>
<name>Edit Users</name>
<operation>user-management-user-edit</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>access-users-roles</id>
<name>Access Users Roles</name>
<operation>user-management-user-role</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
<permission>
<id>access-user-list</id>
<name>Access User List</name>
<operation>user-management-user-list</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
</permissions>
</role>
<role>
<id>registered-user</id>
<name>Registered User</name>
<permanent>true</permanent>
<assignable>true</assignable>
<permissions>
<permission>
<id>edit-user-by-username</id>
<name>Edit User Data by Username</name>
<operation>user-management-user-edit</operation>
<resource>username</resource>
<permanent>true</permanent>
</permission>
</permissions>
</role>
<role>
<id>guest</id>
<name>Guest</name>
<permanent>true</permanent>
<assignable>true</assignable>
<permissions>
<permission>
<id>guest-permission</id>
<name>Guest Permission</name>
<operation>guest-access</operation>
<resource>global</resource>
<permanent>true</permanent>
</permission>
</permissions>
</role>
</roles>
</application>
</applications>
</redback-role-model>