blob: 4d3d87d1ba217080a66853ee11dd8f18021877eb [file] [log] [blame]
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;
}
}