/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see .
*/
package org.alfresco.repo.security.person;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.Set;
import javax.transaction.Status;
import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.tenant.Tenant;
import org.alfresco.repo.tenant.TenantAdminService;
import org.alfresco.repo.tenant.TenantService;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ApplicationContextHelper;
import org.alfresco.util.PropertyMap;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ComparisonFailure;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
/**
* Integration test for HomeFolderProviderSynchronizer.
*
* @author Alan Davis
*/
public class HomeFolderProviderSynchronizerTest
{
private static final QName PROP_PARENT_PATH = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "parentPath");
private static ApplicationContext applicationContext;
private static ServiceRegistry serviceRegistry;
private static TransactionService transactionService;
private static FileFolderService fileFolderService;
private static PersonService personService;
private static NodeService nodeService;
private static ContentService contentService;
private static AuthorityService authorityService;
private static TenantAdminService tenantAdminService;
private static TenantService tenantService;
private static HomeFolderManager homeFolderManager;
private static Properties properties;
private static RegexHomeFolderProvider largeHomeFolderProvider;
private static String largeHomeFolderProviderName;
private static RegexHomeFolderProvider testHomeFolderProvider;
private static String testHomeFolderProviderName;
private static String storeUrl;
private static String origRootPath;
private static NodeRef rootNodeRef;
private static HomeFolderProviderSynchronizer homeFolderProviderSynchronizer;
private static boolean firstTest = true;
private UserTransaction trans;
@BeforeClass
public static void classSetup() throws Exception
{
applicationContext = ApplicationContextHelper.getApplicationContext();
serviceRegistry = (ServiceRegistry) applicationContext.getBean("ServiceRegistry");
transactionService = (TransactionService) applicationContext.getBean("transactionService");
fileFolderService = (FileFolderService) applicationContext.getBean("fileFolderService");
personService = (PersonService) applicationContext.getBean("personService");
nodeService = (NodeService) applicationContext.getBean("nodeService");
contentService = (ContentService) applicationContext.getBean("contentService");
authorityService = (AuthorityService) applicationContext.getBean("authorityService");
tenantAdminService = (TenantAdminService) applicationContext.getBean("tenantAdminService");
tenantService = (TenantService) applicationContext.getBean("tenantService");
homeFolderManager = (HomeFolderManager) applicationContext.getBean("homeFolderManager");
largeHomeFolderProvider = (RegexHomeFolderProvider) applicationContext.getBean("largeHomeFolderProvider");
largeHomeFolderProviderName = largeHomeFolderProvider.getName();
storeUrl = largeHomeFolderProvider.getStoreUrl();
origRootPath = largeHomeFolderProvider.getRootPath();
properties = (Properties) applicationContext.getBean("global-properties");
personService.setCreateMissingPeople(true);
// Create test home folder provider that gets its path from a property and the username
testHomeFolderProvider = new RegexHomeFolderProvider()
{
@Override
public List getHomeFolderPath(NodeRef person)
{
String parentPath = DefaultTypeConverter.INSTANCE.convert(String.class, nodeService.getProperty(person, PROP_PARENT_PATH));
String propPath = ((parentPath == null || parentPath.length() == 0) ? "" : parentPath+'/')+
homeFolderManager.getPersonProperty(person, ContentModel.PROP_USERNAME);
return Arrays.asList(propPath.split("/"));
}
};
testHomeFolderProvider.setPropertyName(ContentModel.PROP_USERNAME.getLocalName());
testHomeFolderProvider.setPattern("(..)");
testHomeFolderProvider.setBeanName("testHomeFolderProvider");
testHomeFolderProvider.setHomeFolderManager(homeFolderManager);
testHomeFolderProvider.setRootPath(origRootPath);
testHomeFolderProvider.setStoreUrl(storeUrl);
testHomeFolderProvider.setOnCreatePermissionsManager((PermissionsManager)applicationContext.getBean("defaultOnCreatePermissionsManager"));
testHomeFolderProvider.setOnCreatePermissionsManager((PermissionsManager)applicationContext.getBean("defaultOnCreatePermissionsManager"));
testHomeFolderProvider.setOnReferencePermissionsManager((PermissionsManager)applicationContext.getBean("defaultOnReferencePermissionsManager"));
testHomeFolderProviderName = testHomeFolderProvider.getName();
homeFolderManager.addProvider(testHomeFolderProvider);
homeFolderProviderSynchronizer = new HomeFolderProviderSynchronizer(
properties, transactionService, authorityService,
personService, fileFolderService, nodeService,
homeFolderManager, tenantAdminService);
}
@Before
public void setUp() throws Exception
{
properties.setProperty("home_folder_provider_synchronizer.enabled", "true");
properties.remove("home_folder_provider_synchronizer.override_provider");
properties.remove("home_folder_provider_synchronizer.keep_empty_parents");
largeHomeFolderProvider.setPattern("^(..)");
testHomeFolderProvider.setRootPath(origRootPath);
largeHomeFolderProvider.setRootPath(origRootPath);
// Just in case we killed a test last time - tidy up
if (firstTest)
{
firstTest = false;
AuthenticationUtil.setRunAsUserSystem();
trans = transactionService.getUserTransaction();
trans.begin();
rootNodeRef = homeFolderManager.getRootPathNodeRef(largeHomeFolderProvider);
trans.commit();
trans = null;
tearDown();
}
AuthenticationUtil.setRunAsUserSystem();
trans = transactionService.getUserTransaction();
trans.begin();
// System.out.println(NodeStoreInspector.dumpNode(nodeService, rootNodeRef));
}
@After
public void tearDown() throws Exception
{
if (trans != null)
{
try
{
trans.commit();
}
catch (Exception e)
{
if ((trans.getStatus() == Status.STATUS_ACTIVE) ||
(trans.getStatus() == Status.STATUS_MARKED_ROLLBACK))
{
trans.rollback();
trans = null;
}
}
}
trans = transactionService.getUserTransaction();
trans.begin();
Set adminGuestUserHomeFolders = deleteNonAdminGuestUsers();
deleteNonAdminGuestFolders(adminGuestUserHomeFolders);
deleteAllTenants();
trans.commit();
trans = null;
AuthenticationUtil.clearCurrentSecurityContext();
}
private Set deleteNonAdminGuestUsers()
{
final Set adminGuestUserHomeFolders = new HashSet();
for (final NodeRef nodeRef : personService.getAllPeople())
{
final String username = DefaultTypeConverter.INSTANCE.convert(String.class,
nodeService.getProperty(nodeRef, ContentModel.PROP_USERNAME));
final String domainUsername = tenantService.getBaseNameUser(username);
String tenantDomain = tenantService.getUserDomain(username);
String systemUser = tenantAdminService.getDomainUser(AuthenticationUtil.getSystemUserName(), tenantDomain);
boolean disabled = !TenantService.DEFAULT_DOMAIN.equals(tenantDomain) &&
!tenantAdminService.isEnabledTenant(tenantDomain);
try
{
if (disabled)
{
tenantAdminService.enableTenant(tenantDomain);
}
AuthenticationUtil.runAs(new RunAsWork