diff --git a/archiva-modules/archiva-base/archiva-repository-admin/pom.xml b/archiva-modules/archiva-base/archiva-repository-admin/pom.xml index f0841c946..158deae66 100644 --- a/archiva-modules/archiva-base/archiva-repository-admin/pom.xml +++ b/archiva-modules/archiva-base/archiva-repository-admin/pom.xml @@ -31,11 +31,19 @@ org.apache.archiva archiva-configuration + + + org.apache.archiva + archiva-security org.apache.archiva archiva-scheduler-repository + + org.apache.archiva + audit + javax.inject javax.inject @@ -79,6 +87,26 @@ org.codehaus.redback.components spring-quartz + + org.codehaus.redback + redback-rbac-role-manager + + + commons-logging + commons-logging + + + + + org.codehaus.redback + redback-authentication-api + + + commons-logging + commons-logging + + + junit junit @@ -90,6 +118,33 @@ test + + org.codehaus.redback + redback-users-memory + test + ${redback.version} + + + + org.codehaus.redback + redback-keys-memory + test + ${redback.version} + + + + org.codehaus.redback + redback-rbac-cached + ${redback.version} + test + + + commons-logging + commons-logging + + + + org.apache.derby derby @@ -118,6 +173,7 @@ ${project.build.outputDirectory} + ${project.build.outputDirectory} diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java index c2f3a9db2..26f0bb69f 100644 --- a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java +++ b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java @@ -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 auditListeners = new ArrayList(); + + @Inject + protected RoleManager roleManager; + public List 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 ); + } + } } diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java index b425574f4..3c97583ef 100644 --- a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java +++ b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java @@ -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 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; diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java b/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java index 393696ace..bab5e5e83 100644 --- a/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java +++ b/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java @@ -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 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 repos, String id ) { @@ -98,4 +134,12 @@ private ManagedRepository findManagedRepoById( List repos, St return null; } + User getFakeUser() + { + SimpleUser user = new SimpleUser(); + user.setUsername( "root" ); + user.setFullName( "The top user" ); + return user; + } + } diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml b/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml new file mode 100644 index 000000000..ecc1de8fb --- /dev/null +++ b/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml @@ -0,0 +1,213 @@ + + 1.0.0 + + + System + Roles that apply system-wide, across all of the applications + 1.0.0 + + + global + * + true + global resource implies full access for authorization + + + username + ${username} + true + replaced with the username of the principal at authorization check time + + + + + configuration-edit + configuration-edit + edit configuration + true + + + user-management-user-create + user-management-user-create + create user + true + + + user-management-user-edit + user-management-user-edit + edit user + true + + + user-management-user-role + user-management-user-role + user roles + true + + + user-management-user-delete + user-management-user-delete + delete user + true + + + user-management-user-list + user-management-user-list + list users + true + + + user-management-role-grant + user-management-role-grant + grant role + true + + + user-management-role-drop + user-management-role-drop + drop role + true + + + user-management-rbac-admin + user-management-rbac-admin + administer rbac + true + + + guest-access + guest-access + access guest + true + + + user-management-manage-data + user-management-manage-data + manage data + true + + + + + system-administrator + System Administrator + true + true + + + edit-redback-configuration + Edit Redback Configuration + configuration-edit + global + true + + + manage-rbac-setup + User RBAC Management + user-management-rbac-admin + global + true + + + manage-rbac-data + RBAC Manage Data + user-management-manage-data + global + true + + + + user-administrator + + + + user-administrator + User Administrator + true + true + + + drop-roles-for-anyone + Drop Roles for Anyone + user-management-role-drop + global + true + + + grant-roles-for-anyone + Grant Roles for Anyone + user-management-role-grant + global + true + + + user-create + Create Users + user-management-user-create + global + true + + + user-delete + Delete Users + user-management-user-delete + global + true + + + user-edit + Edit Users + user-management-user-edit + global + true + + + access-users-roles + Access Users Roles + user-management-user-role + global + true + + + access-user-list + Access User List + user-management-user-list + global + true + + + + + registered-user + Registered User + true + true + + + edit-user-by-username + Edit User Data by Username + user-management-user-edit + username + true + + + + + guest + Guest + true + true + + + guest-permission + Guest Permission + guest-access + global + true + + + + + + + \ No newline at end of file