| package org.apache.archiva.redback.management; |
| |
| /* |
| * 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 junit.framework.TestCase; |
| import org.apache.archiva.redback.keys.AuthenticationKey; |
| import org.apache.archiva.redback.keys.KeyManager; |
| import org.apache.archiva.redback.keys.KeyManagerException; |
| import org.apache.archiva.redback.rbac.*; |
| import org.apache.archiva.redback.tests.utils.RBACDefaults; |
| import org.apache.archiva.redback.users.User; |
| import org.apache.archiva.redback.users.UserManager; |
| import org.apache.archiva.redback.users.UserManagerException; |
| import org.apache.commons.io.FileUtils; |
| import org.apache.commons.io.IOUtils; |
| import org.custommonkey.xmlunit.XMLAssert; |
| import org.junit.Before; |
| import org.junit.Ignore; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.springframework.test.context.ContextConfiguration; |
| import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; |
| |
| import javax.inject.Inject; |
| import javax.inject.Named; |
| import java.io.*; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import java.nio.file.Paths; |
| import java.nio.file.StandardOpenOption; |
| import java.text.SimpleDateFormat; |
| import java.util.Arrays; |
| import java.util.Date; |
| import java.util.List; |
| import java.util.Locale; |
| |
| |
| // @TODO: Investigate how to implement export with JPA |
| @Ignore("Currently no JPA implementation") |
| @RunWith(SpringJUnit4ClassRunner.class) |
| @ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" }) |
| public class DataManagementTest |
| extends TestCase |
| { |
| @Inject |
| private DataManagementTool dataManagementTool; |
| |
| private Path targetDirectory; |
| |
| @Inject |
| @Named(value = "userManager#jpa") |
| UserManager userManager; |
| |
| @Inject |
| @Named(value = "keyManager#jpa") |
| KeyManager keyManager; |
| |
| |
| @Inject |
| @Named(value = "rbacManager#jpa") |
| RBACManager rbacManager; |
| |
| @Before |
| public void setUp() |
| throws Exception |
| { |
| super.setUp(); |
| targetDirectory = createBackupDirectory(); |
| } |
| |
| @Test |
| public void testEraseUsers() |
| throws Exception |
| { |
| |
| dataManagementTool.eraseUsersDatabase( userManager ); |
| |
| createUserDatabase( userManager ); |
| |
| dataManagementTool.eraseUsersDatabase( userManager ); |
| |
| assertEmpty( userManager ); |
| } |
| |
| @Test |
| public void testEraseKeys() |
| throws Exception |
| { |
| |
| createKeyDatabase( keyManager ); |
| |
| dataManagementTool.eraseKeysDatabase( keyManager ); |
| |
| assertEmpty( keyManager ); |
| } |
| |
| @Test |
| public void testBackupRbac() |
| throws Exception |
| { |
| RBACManager manager = rbacManager; |
| |
| dataManagementTool.eraseRBACDatabase( manager ); |
| |
| createRbacDatabase( manager ); |
| |
| dataManagementTool.backupRBACDatabase( manager, targetDirectory ); |
| |
| Path backupFile = targetDirectory.resolve( "rbac.xml" ); |
| |
| assertTrue( "Check database exists", Files.exists(backupFile) ); |
| |
| StringWriter sw = new StringWriter(); |
| |
| IOUtils.copy( getClass().getResourceAsStream( "/expected-rbac.xml" ), sw ); |
| |
| XMLAssert.assertXMLEqual( new StringReader( sw.toString() ), |
| new StringReader( FileUtils.readFileToString( backupFile.toFile() ) ) ); |
| |
| } |
| |
| private void createRbacDatabase( RBACManager manager ) |
| throws RbacManagerException |
| { |
| RBACDefaults defaults = new RBACDefaults( manager ); |
| |
| defaults.createDefaults(); |
| |
| UserAssignment assignment = manager.createUserAssignment( "bob" ); |
| assignment.addRoleName( "Developer" ); |
| manager.saveUserAssignment( assignment ); |
| |
| assignment = manager.createUserAssignment( "betty" ); |
| assignment.addRoleName( "System Administrator" ); |
| manager.saveUserAssignment( assignment ); |
| } |
| |
| @Test |
| public void testBackupUsers() |
| throws Exception |
| { |
| UserManager manager = userManager; |
| |
| createUserDatabase( manager ); |
| |
| dataManagementTool.backupUserDatabase( manager, targetDirectory ); |
| |
| Path backupFile = targetDirectory.resolve( "users.xml" ); |
| |
| assertTrue( "Check database exists", Files.exists(backupFile) ); |
| |
| StringWriter sw = new StringWriter(); |
| |
| IOUtils.copy( getClass().getResourceAsStream( "/expected-users.xml" ), sw ); |
| |
| String actual = FileUtils.readFileToString( backupFile.toFile() ).trim(); |
| String expected = sw.toString().trim(); |
| |
| XMLAssert.assertXMLEqual( removeTimestampVariance( expected ), removeTimestampVariance( actual ) ); |
| |
| } |
| |
| private void createUserDatabase( UserManager manager ) |
| throws UserManagerException |
| { |
| User user = manager.createUser( "smcqueen", "Steve McQueen", "the cooler king" ); |
| user.setPassword( "abc123" ); |
| manager.addUser( user ); |
| |
| user = manager.createUser( "bob", "Sideshow Bob", "bob_862@hotmail.com" ); |
| user.setPassword( "bobby862" ); |
| manager.addUser( user ); |
| |
| user = manager.createUser( "betty", "Betty", "betty@aol.com" ); |
| user.setPassword( "rover2" ); |
| manager.addUser( user ); |
| } |
| |
| @Test |
| public void testBackupKeys() |
| throws Exception |
| { |
| KeyManager manager = keyManager; |
| |
| createKeyDatabase( manager ); |
| |
| Thread.sleep( 60000 ); |
| |
| dataManagementTool.backupKeyDatabase( manager, targetDirectory ); |
| |
| Path backupFile = targetDirectory.resolve( "keys.xml" ); |
| |
| assertTrue( "Check database exists", Files.exists(backupFile) ); |
| |
| StringWriter sw = new StringWriter(); |
| |
| IOUtils.copy( getClass().getResourceAsStream( "/expected-keys.xml" ), sw ); |
| |
| String actual = FileUtils.readFileToString( backupFile.toFile() ).trim(); |
| String expected = sw.toString().trim(); |
| |
| XMLAssert.assertXMLEqual( removeKeyAndTimestampVariance( expected ), removeKeyAndTimestampVariance( actual ) ); |
| |
| } |
| |
| private static void createKeyDatabase( KeyManager manager ) |
| throws KeyManagerException |
| { |
| manager.createKey( "bob", "Testing", 15 ); |
| manager.createKey( "betty", "Something", 25 ); |
| manager.createKey( "fred", "Else", 30 ); |
| manager.createKey( "tony", "Expired", 0 ); |
| } |
| |
| @Test |
| public void testRestoreRbac() |
| throws Exception |
| { |
| RBACManager manager = rbacManager; |
| |
| dataManagementTool.eraseRBACDatabase( manager ); |
| |
| assertEmpty( manager ); |
| |
| Path backupFile = targetDirectory.resolve("rbac.xml" ); |
| |
| InputStream is = getClass().getResourceAsStream( "/expected-rbac.xml" ); |
| |
| BufferedWriter fw = Files.newBufferedWriter(backupFile, StandardOpenOption.CREATE_NEW); |
| |
| IOUtils.copy( is, fw ); |
| |
| is.close(); |
| |
| fw.close(); |
| |
| dataManagementTool.restoreRBACDatabase( manager, targetDirectory ); |
| |
| List<? extends Role> roles = manager.getAllRoles(); |
| List<? extends UserAssignment> assignments = manager.getAllUserAssignments(); |
| assertEquals( 4, roles.size() ); |
| assertEquals( 2, assignments.size() ); |
| assertEquals( 6, manager.getAllOperations().size() ); |
| assertEquals( 1, manager.getAllResources().size() ); |
| assertEquals( 6, manager.getAllPermissions().size() ); |
| |
| Role role = roles.get( 0 ); |
| assertEquals( "User Administrator", role.getName() ); |
| assertTrue( role.isAssignable() ); |
| assertEquals( 2, role.getPermissions().size() ); |
| assertPermission( role.getPermissions().get( 0 ), "Edit All Users", "edit-all-users", "*" ); |
| assertPermission( role.getPermissions().get( 1 ), "Remove Roles", "remove-roles", "*" ); |
| |
| role = roles.get( 1 ); |
| assertEquals( "System Administrator", role.getName() ); |
| assertTrue( role.isAssignable() ); |
| assertEquals( 1, role.getChildRoleNames().size() ); |
| assertEquals( "User Administrator", role.getChildRoleNames().get( 0 ) ); |
| assertEquals( 4, role.getPermissions().size() ); |
| assertPermission( role.getPermissions().get( 0 ), "Edit Configuration", "edit-configuration", "*" ); |
| assertPermission( role.getPermissions().get( 1 ), "Run Indexer", "run-indexer", "*" ); |
| assertPermission( role.getPermissions().get( 2 ), "Add Repository", "add-repository", "*" ); |
| assertPermission( role.getPermissions().get( 3 ), "Regenerate Index", "regenerate-index", "*" ); |
| |
| role = roles.get( 2 ); |
| assertEquals( "Trusted Developer", role.getName() ); |
| assertTrue( role.isAssignable() ); |
| assertEquals( 1, role.getChildRoleNames().size() ); |
| assertEquals( "System Administrator", role.getChildRoleNames().get( 0 ) ); |
| assertEquals( 1, role.getPermissions().size() ); |
| assertPermission( role.getPermissions().get( 0 ), "Run Indexer", "run-indexer", "*" ); |
| |
| role = roles.get( 3 ); |
| assertEquals( "Developer", role.getName() ); |
| assertTrue( role.isAssignable() ); |
| assertEquals( 1, role.getChildRoleNames().size() ); |
| assertEquals( "Trusted Developer", role.getChildRoleNames().get( 0 ) ); |
| assertEquals( 1, role.getPermissions().size() ); |
| assertPermission( role.getPermissions().get( 0 ), "Run Indexer", "run-indexer", "*" ); |
| |
| UserAssignment assignment = assignments.get( 0 ); |
| assertEquals( "bob", assignment.getPrincipal() ); |
| assertEquals( 1, assignment.getRoleNames().size() ); |
| assertEquals( "Developer", assignment.getRoleNames().get( 0 ) ); |
| |
| assignment = assignments.get( 1 ); |
| assertEquals( "betty", assignment.getPrincipal() ); |
| assertEquals( 1, assignment.getRoleNames().size() ); |
| assertEquals( "System Administrator", assignment.getRoleNames().get( 0 ) ); |
| } |
| |
| private void assertEmpty( RBACManager manager ) |
| throws RbacManagerException |
| { |
| assertEquals( 0, manager.getAllRoles().size() ); |
| assertEquals( 0, manager.getAllUserAssignments().size() ); |
| assertEquals( 0, manager.getAllOperations().size() ); |
| assertEquals( 0, manager.getAllResources().size() ); |
| assertEquals( 0, manager.getAllPermissions().size() ); |
| } |
| |
| @Test |
| public void testRestoreUsers() |
| throws Exception |
| { |
| UserManager manager = userManager; |
| |
| dataManagementTool.eraseUsersDatabase( manager ); |
| |
| assertEmpty( manager ); |
| |
| Path backupFile = targetDirectory.resolve( "users.xml" ); |
| |
| BufferedWriter fw = Files.newBufferedWriter(backupFile, StandardOpenOption.CREATE_NEW ); |
| |
| IOUtils.copy( getClass().getResourceAsStream( "/expected-users.xml" ), fw ); |
| |
| fw.close(); |
| |
| dataManagementTool.restoreUsersDatabase( manager, targetDirectory ); |
| |
| List<? extends User> users = manager.getUsers(); |
| assertEquals( 3, users.size() ); |
| |
| User user = users.get( 0 ); |
| assertEquals( "smcqueen", user.getUsername() ); |
| assertEquals( "bKE9UspwyIPg8LsQHkJaiehiTeUdstI5JZOvaoQRgJA=", user.getEncodedPassword() ); |
| assertEquals( "Steve McQueen", user.getFullName() ); |
| assertEquals( "the cooler king", user.getEmail() ); |
| assertEquals( 1164424661686L, user.getLastPasswordChange().getTime() ); |
| assertEquals( Arrays.asList( new String[]{ "bKE9UspwyIPg8LsQHkJaiehiTeUdstI5JZOvaoQRgJA=" } ), |
| user.getPreviousEncodedPasswords() ); |
| |
| user = users.get( 1 ); |
| assertEquals( "bob", user.getUsername() ); |
| assertEquals( "A0MR+q0lm554bD6Uft60ztlYZ8N1pEqXhKNM9H7SlS8=", user.getEncodedPassword() ); |
| assertEquals( "Sideshow Bob", user.getFullName() ); |
| assertEquals( "bob_862@hotmail.com", user.getEmail() ); |
| assertEquals( 1164424669526L, user.getLastPasswordChange().getTime() ); |
| assertEquals( Arrays.asList( new String[]{ "A0MR+q0lm554bD6Uft60ztlYZ8N1pEqXhKNM9H7SlS8=" } ), |
| user.getPreviousEncodedPasswords() ); |
| |
| user = users.get( 2 ); |
| assertEquals( "betty", user.getUsername() ); |
| assertEquals( "L/mA/suWallwvYzw4wyRYkn5y8zWxAITuv4sLhJLN1E=", user.getEncodedPassword() ); |
| assertEquals( "Betty", user.getFullName() ); |
| assertEquals( "betty@aol.com", user.getEmail() ); |
| assertEquals( 1164424669536L, user.getLastPasswordChange().getTime() ); |
| assertEquals( Arrays.asList( new String[]{ "L/mA/suWallwvYzw4wyRYkn5y8zWxAITuv4sLhJLN1E=" } ), |
| user.getPreviousEncodedPasswords() ); |
| } |
| |
| private void assertEmpty( UserManager manager ) |
| throws UserManagerException |
| { |
| List<? extends User> users = manager.getUsers(); |
| assertEquals( 0, users.size() ); |
| } |
| |
| @Test |
| public void testRestoreKeys() |
| throws Exception |
| { |
| KeyManager manager = keyManager; |
| |
| dataManagementTool.eraseKeysDatabase( manager ); |
| |
| assertEmpty( manager ); |
| |
| Path backupFile = targetDirectory.resolve( "keys.xml" ); |
| |
| BufferedWriter fw = Files.newBufferedWriter( backupFile, StandardOpenOption.CREATE_NEW ); |
| |
| IOUtils.copy( getClass().getResourceAsStream( "/expected-keys.xml" ), fw ); |
| |
| fw.close(); |
| |
| dataManagementTool.restoreKeysDatabase( manager, targetDirectory ); |
| |
| List<AuthenticationKey> keys = manager.getAllKeys(); |
| assertEquals( 3, keys.size() ); |
| |
| AuthenticationKey key = keys.get( 0 ); |
| assertEquals( "248df0fec5d54e3eb11339f5e81d8bd7", key.getKey() ); |
| assertEquals( "bob", key.getForPrincipal() ); |
| assertEquals( "Testing", key.getPurpose() ); |
| assertEquals( 1164426311921L, key.getDateCreated().getTime() ); |
| assertEquals( 1164427211921L, key.getDateExpires().getTime() ); |
| |
| key = keys.get( 1 ); |
| assertEquals( "a98dddc2ae614a7c82f8afd3ba6e39fb", key.getKey() ); |
| assertEquals( "betty", key.getForPrincipal() ); |
| assertEquals( "Something", key.getPurpose() ); |
| assertEquals( 1164426315657L, key.getDateCreated().getTime() ); |
| assertEquals( 1164427815657L, key.getDateExpires().getTime() ); |
| |
| key = keys.get( 2 ); |
| assertEquals( "1428d2ca3a0246f0a1d979504e351388", key.getKey() ); |
| assertEquals( "fred", key.getForPrincipal() ); |
| assertEquals( "Else", key.getPurpose() ); |
| assertEquals( 1164426315664L, key.getDateCreated().getTime() ); |
| assertEquals( 1164428115664L, key.getDateExpires().getTime() ); |
| } |
| |
| private void assertEmpty( KeyManager manager ) |
| { |
| assertEquals( 0, manager.getAllKeys().size() ); |
| } |
| |
| private String removeKeyAndTimestampVariance( String content ) |
| { |
| return removeTagContent( removeTagContent( removeTagContent( content, "dateCreated" ), "dateExpires" ), "key" ); |
| } |
| |
| private static String removeTimestampVariance( String content ) |
| { |
| return removeTagContent( removeTagContent( content, "lastPasswordChange" ), "accountCreationDate" ); |
| } |
| |
| private static String removeTagContent( String content, String field ) |
| { |
| return content.replaceAll( "<" + field + ">.*</" + field + ">", "<" + field + "></" + field + ">" ); |
| } |
| |
| private static void assertPermission( Permission permission, String name, String operation, String resource ) |
| { |
| assertEquals( name, permission.getName() ); |
| assertEquals( operation, permission.getOperation().getName() ); |
| assertEquals( resource, permission.getResource().getIdentifier() ); |
| } |
| |
| private static Path createBackupDirectory() throws IOException { |
| String timestamp = new SimpleDateFormat( "yyyyMMdd.HHmmss", Locale.US ).format( new Date() ); |
| |
| Path targetDirectory = Files.createTempDirectory( "redback-test" ).resolve( "./target/backups/" + timestamp ); |
| Files.createDirectories(targetDirectory); |
| |
| return targetDirectory; |
| } |
| |
| } |