Re-instate web site group test. Bug Fixes and first implementation of web site role precedence rules.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@14241 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Mark Rogers 2009-05-08 11:06:33 +00:00
parent a687ac1b1b
commit 9715847cf1
5 changed files with 337 additions and 101 deletions

View File

@ -59,6 +59,18 @@
</property>
</bean>
<!-- Site role precedence - higher number - more important role -->
<bean id="siteRoleComparator" class="org.alfresco.repo.site.RoleComparatorImpl" init-method="init">
<property name="rolePrecedence">
<map>
<entry key="SiteManager" value="4" />
<entry key="SiteCollaborator" value="3" />
<entry key="SiteContributor" value="2" />
<entry key="SiteConsumer" value="1" />
</map>
</property>
</bean>
<bean id="siteService" class="org.alfresco.repo.site.SiteServiceImpl" init-method="init">
<property name="nodeService" ref="NodeService"/>
<property name="fileFolderService" ref="FileFolderService"/>
@ -77,6 +89,9 @@
<value>./${spaces.company_home.childname}/st:sites</value>
</property>
<property name="tenantService" ref="tenantService"/>
<property name="roleComparator" ref="siteRoleComparator" />
</bean>
<bean id="siteServiceScript" parent="baseJavaScriptExtension" class="org.alfresco.repo.site.script.ScriptSiteService">

View File

@ -0,0 +1,66 @@
/*
* Copyright (C) 2005-2009 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.repo.site;
import java.util.Comparator;
import java.util.Map;
/* package scope */class RoleComparatorImpl implements Comparator<String>
{
private Map<String, Integer> rolePrecedence;
public RoleComparatorImpl()
{
}
public RoleComparatorImpl(Map<String, Integer> rolePrecedence)
{
this.setRolePrecedence(rolePrecedence);
}
@Override
public int compare(String first, String second)
{
int firstRank = getRolePrecedence().get(first);
int secondRank = getRolePrecedence().get(second);
return secondRank - firstRank;
}
public void init()
{
}
public void setRolePrecedence(Map<String, Integer> rolePrecedence)
{
this.rolePrecedence = rolePrecedence;
}
public Map<String, Integer> getRolePrecedence()
{
return rolePrecedence;
}
}

View File

@ -0,0 +1,52 @@
package org.alfresco.repo.site;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import junit.framework.TestCase;
public class RoleComparatorImplTest extends TestCase
{
public void testRoleComparator()
{
Map<String, Integer> rolePrecedence = new HashMap<String, Integer>();
rolePrecedence.put("SiteManager", 4);
rolePrecedence.put("SiteCollaborator", 3);
rolePrecedence.put("SiteContributor", 2);
rolePrecedence.put("SiteConsumer", 1);
Comparator<String> roleComparator = new RoleComparatorImpl(rolePrecedence);
List<String> roles = new ArrayList<String>();
roles.add("SiteConsumer");
assertEquals("SiteConsumer", sort(roles, roleComparator));
roles.add("SiteConsumer");
assertEquals("SiteConsumer", sort(roles, roleComparator));
roles.add("SiteContributor");
assertEquals("SiteContributor", sort(roles, roleComparator));
roles.add("SiteConsumer");
assertEquals("SiteContributor", sort(roles, roleComparator));
roles.add("SiteManager");
assertEquals("SiteManager", sort(roles, roleComparator));
roles.add("SiteCollaborator");
assertEquals("SiteManager", sort(roles, roleComparator));
}
private String sort(List<String> list, Comparator comparator)
{
SortedSet<String> sortedRoles = new TreeSet<String>(comparator);
for (String role : list)
{
sortedRoles.add(role);
}
return sortedRoles.first();
}
}

View File

@ -26,12 +26,15 @@ package org.alfresco.repo.site;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import org.alfresco.model.ContentModel;
@ -133,6 +136,7 @@ public class SiteServiceImpl implements SiteService, SiteModel
private TenantService tenantService;
private TenantAdminService tenantAdminService;
private RetryingTransactionHelper retryingTransactionHelper;
private Comparator<String> roleComparator ;
/**
@ -1026,6 +1030,11 @@ public class SiteServiceImpl implements SiteService, SiteModel
members.put(group, permission);
}
}
else
{
// No name filter add this group
members.put(group, permission);
}
}
else
{
@ -1102,8 +1111,23 @@ public class SiteServiceImpl implements SiteService, SiteModel
List<String> roles = getMembersRoles(shortName, authorityName);
if (roles.isEmpty() == false)
{
if(roleComparator != null)
{
// Need to sort the roles into the most important first.
SortedSet<String> sortedRoles = new TreeSet<String>(roleComparator);
for (String role : roles)
{
sortedRoles.add(role);
}
result = sortedRoles.first();
}
else
{
// don't search on precedence
result = roles.get(0);
}
}
return result;
}
@ -1126,6 +1150,8 @@ public class SiteServiceImpl implements SiteService, SiteModel
* Helper method to get the permission groups for a given authority on a site.
* Returns empty List if the user does not have a explicit membership to the site.
*
* A user permission will take precedence over a permission obtained via a group.
*
* @param siteShortName site short name
* @param authorityName authority name
* @return List<String> Permission groups, empty list if no explicit membership set
@ -1134,6 +1160,24 @@ public class SiteServiceImpl implements SiteService, SiteModel
{
List<String> result = new ArrayList<String>(5);
Set<String> roles = this.permissionService.getSettablePermissions(SiteModel.TYPE_SITE);
for (String role : roles)
{
String roleGroup = getSiteRoleGroup(siteShortName, role, true);
Set<String> authorities = this.authorityService.getContainedAuthorities(AuthorityType.USER, roleGroup, true);
if (authorities.contains(authorityName) == true)
{
result.add(roleGroup);
}
}
// If there are user permissions then they take priority
if(result.size() > 0)
{
return result;
}
// Now do a deep search through all users and groups
for (String role : roles)
{
String roleGroup = getSiteRoleGroup(siteShortName, role, true);
@ -1549,4 +1593,13 @@ public class SiteServiceImpl implements SiteService, SiteModel
return "";
}
}
public void setRoleComparator(Comparator<String> roleComparator) {
this.roleComparator = roleComparator;
}
public Comparator<String> getRoleComparator() {
return roleComparator;
}
}

View File

@ -68,8 +68,11 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest
private static final String USER_ONE = "UserOne_SiteServiceImplTest";
private static final String USER_TWO = "UserTwo_SiteServiceImplTest";
private static final String USER_THREE = "UserThree_SiteServiceImplTest";
private static final String USER_FOUR = "UserFour_SiteServiceImplTest";
private static final String GROUP_ONE = "GrpOne_SiteServiceImplTest";
private static final String GROUP_TWO = "GrpTwo_SiteServiceImplTest";
private static final String GROUP_THREE = "GrpThree_SiteServiceImplTest";
private static final String GROUP_FOUR = "GrpFour_SiteServiceImplTest";
private SiteService siteService;
private ScriptService scriptService;
@ -82,6 +85,8 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest
private String groupOne;
private String groupTwo;
private String groupThree;
private String groupFour;
/**
* Called during the transaction setup
@ -104,14 +109,24 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest
createUser(USER_ONE);
createUser(USER_TWO);
createUser(USER_THREE);
createUser(USER_FOUR);
// Create the test groups
this.groupOne = this.authorityService.createAuthority(AuthorityType.GROUP, null, GROUP_ONE);
this.authorityService.addAuthority(this.groupOne, USER_TWO);
this.groupTwo = this.authorityService.createAuthority(AuthorityType.GROUP, null, GROUP_TWO);
this.authorityService.addAuthority(this.groupTwo, USER_TWO);
this.authorityService.addAuthority(this.groupTwo, USER_THREE);
this.groupThree = this.authorityService.createAuthority(AuthorityType.GROUP, null, GROUP_THREE);
this.authorityService.addAuthority(this.groupThree, USER_TWO);
this.authorityService.addAuthority(this.groupThree, USER_THREE);
this.groupFour = this.authorityService.createAuthority(AuthorityType.GROUP, this.groupThree, GROUP_FOUR);
this.authorityService.addAuthority(this.groupFour, USER_FOUR);
// Set the current authentication
this.authenticationComponent.setCurrentUser(USER_ONE);
}
@ -684,105 +699,140 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest
}
// TODO MER Temp remove this test - failing.
// public void testGroupMembership()
// {
// // USER_ONE - SiteAdmin
// // GROUP_ONE - USER_TWO
// // GROUP_TWO - USER_TWO, USER_THREE
//
// // Create a site as user one
// this.siteService.createSite(TEST_SITE_PRESET, "testMembership", TEST_TITLE, TEST_DESCRIPTION, SiteVisibility.PRIVATE);
//
// // Get the members of the site and check that user one is a manager
// Map<String, String> members = this.siteService.listMembers("testMembership", null, null, 0);
// assertNotNull(members);
// assertEquals(1, members.size());
// assertTrue(members.containsKey(USER_ONE));
// assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
//
// // Add a group
// this.siteService.setMembership("testMembership", this.groupTwo, SiteModel.SITE_CONSUMER);
// // - is the group in the list of all members?
// members = this.siteService.listMembers("testMembership", null, null, 0);
// assertNotNull(members);
// assertEquals(2, members.size());
// assertTrue(members.containsKey(USER_ONE));
// assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
// assertTrue(members.containsKey(this.groupTwo));
// assertEquals(SiteModel.SITE_CONSUMER, members.get(this.groupTwo));
// // - is the user in the expanded list?
// members = this.siteService.listMembers("testMembership", null, null, 0, true);
// assertNotNull(members);
// assertEquals(3, members.size());
// assertTrue(members.containsKey(USER_ONE));
// assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
// assertTrue(members.containsKey(USER_TWO));
// assertEquals(SiteModel.SITE_CONSUMER, members.get(USER_TWO));
// assertTrue(members.containsKey(USER_THREE));
// assertEquals(SiteModel.SITE_CONSUMER, members.get(USER_THREE));
// // - is the user a member?
// assertTrue(this.siteService.isMember("testMembership", USER_ONE));
// assertTrue(this.siteService.isMember("testMembership", USER_TWO));
// assertTrue(this.siteService.isMember("testMembership", USER_THREE));
// // - is the group a member?
// assertTrue(this.siteService.isMember("testMembership", this.groupTwo));
// // - can we get the roles for the various members directly
// assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", USER_ONE));
// assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", USER_TWO));
// assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", USER_THREE));
// assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", this.groupTwo));
//
// // Add a group member as an explicit member
// this.siteService.setMembership("testMembership", USER_THREE, SiteModel.SITE_COLLABORATOR);
// // - check the explicit members list
// members = this.siteService.listMembers("testMembership", null, null, 0);
// assertNotNull(members);
// assertEquals(3, members.size());
// assertTrue(members.containsKey(USER_ONE));
// assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
// assertTrue(members.containsKey(USER_THREE));
// assertEquals(SiteModel.SITE_COLLABORATOR, members.get(USER_THREE));
// assertTrue(members.containsKey(this.groupTwo));
// assertEquals(SiteModel.SITE_CONSUMER, members.get(this.groupTwo));
// // - check the expanded members list
// members = this.siteService.listMembers("testMembership", null, null, 0, true);
// assertNotNull(members);
// assertEquals(3, members.size());
// assertTrue(members.containsKey(USER_ONE));
// assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
// assertTrue(members.containsKey(USER_TWO));
// assertEquals(SiteModel.SITE_CONSUMER, members.get(USER_TWO));
// assertTrue(members.containsKey(USER_THREE));
// assertEquals(SiteModel.SITE_COLLABORATOR, members.get(USER_THREE));
// // - check is member
// assertTrue(this.siteService.isMember("testMembership", USER_ONE));
// assertTrue(this.siteService.isMember("testMembership", USER_TWO));
// assertTrue(this.siteService.isMember("testMembership", USER_THREE));
// // - is the group a member?
// assertTrue(this.siteService.isMember("testMembership", this.groupTwo));
// // - check get role directly
// assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", USER_ONE));
// assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", USER_TWO));
// assertEquals(SiteModel.SITE_COLLABORATOR, this.siteService.getMembersRole("testMembership", USER_THREE));
// assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", this.groupTwo));
//
// // Check permissions of added group
//
// // Update the permissions of the group
//
// // Add other group with higher role
// // - is group in list?
// // - is new user a member?
// // - does redefined user have highest role?
//
// // Add group user as a specific user with higher role
// // - check that the user's role is higher that the group?
//
// // Add a group with a sub-group
//
// // Remove groups
// }
public void testGroupMembership()
{
// USER_ONE - SiteAdmin
// GROUP_ONE - USER_TWO
// GROUP_TWO - USER_TWO, USER_THREE
// Create a site as user one
this.siteService.createSite(TEST_SITE_PRESET, "testMembership", TEST_TITLE, TEST_DESCRIPTION, SiteVisibility.PRIVATE);
// Get the members of the site and check that user one is a manager
Map<String, String> members = this.siteService.listMembers("testMembership", null, null, 0);
assertNotNull(members);
assertEquals(1, members.size());
assertTrue(members.containsKey(USER_ONE));
assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
/**
* Test of isMember - ONE is member, TWO and THREE are not
*/
assertTrue(this.siteService.isMember("testMembership", USER_ONE));
assertTrue(!this.siteService.isMember("testMembership", USER_TWO));
assertTrue(!this.siteService.isMember("testMembership", USER_THREE));
/**
* Add a group (GROUP_TWO) with role consumer
*/
this.siteService.setMembership("testMembership", this.groupTwo, SiteModel.SITE_CONSUMER);
// - is the group in the list of all members?
members = this.siteService.listMembers("testMembership", null, null, 0);
assertNotNull(members);
assertEquals(2, members.size());
assertTrue(members.containsKey(USER_ONE));
assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
assertTrue(members.containsKey(this.groupTwo));
assertEquals(SiteModel.SITE_CONSUMER, members.get(this.groupTwo));
// - is the user in the expanded list?
members = this.siteService.listMembers("testMembership", null, null, 0, true);
assertNotNull(members);
assertEquals(3, members.size());
assertTrue(members.containsKey(USER_ONE));
assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
assertTrue(members.containsKey(USER_TWO));
assertEquals(SiteModel.SITE_CONSUMER, members.get(USER_TWO));
assertTrue(members.containsKey(USER_THREE));
assertEquals(SiteModel.SITE_CONSUMER, members.get(USER_THREE));
// - is the user a member?
assertTrue(this.siteService.isMember("testMembership", USER_ONE));
assertTrue(this.siteService.isMember("testMembership", USER_TWO));
assertTrue(this.siteService.isMember("testMembership", USER_THREE));
// - is the group a member?
assertTrue(this.siteService.isMember("testMembership", this.groupTwo));
// - can we get the roles for the various members directly
assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", USER_ONE));
assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", USER_TWO));
assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", USER_THREE));
assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", this.groupTwo));
/**
* Add a group member (USER_THREE) as an explicit member
*/
this.siteService.setMembership("testMembership", USER_THREE, SiteModel.SITE_COLLABORATOR);
// - check the explicit members list
members = this.siteService.listMembers("testMembership", null, null, 0);
assertNotNull(members);
assertEquals(3, members.size());
assertTrue(members.containsKey(USER_ONE));
assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
assertTrue(members.containsKey(USER_THREE));
assertEquals(SiteModel.SITE_COLLABORATOR, members.get(USER_THREE));
assertTrue(members.containsKey(this.groupTwo));
assertEquals(SiteModel.SITE_CONSUMER, members.get(this.groupTwo));
// - check the expanded members list
members = this.siteService.listMembers("testMembership", null, null, 0, true);
assertNotNull(members);
assertEquals(3, members.size());
assertTrue(members.containsKey(USER_ONE));
assertEquals(SiteModel.SITE_MANAGER, members.get(USER_ONE));
assertTrue(members.containsKey(USER_TWO));
assertEquals(SiteModel.SITE_CONSUMER, members.get(USER_TWO));
assertTrue(members.containsKey(USER_THREE));
assertEquals(SiteModel.SITE_COLLABORATOR, members.get(USER_THREE));
// - check is member
assertTrue(this.siteService.isMember("testMembership", USER_ONE));
assertTrue(this.siteService.isMember("testMembership", USER_TWO));
assertTrue(this.siteService.isMember("testMembership", USER_THREE));
assertTrue(!this.siteService.isMember("testMembership", USER_FOUR));
// - is the group a member?
assertTrue(this.siteService.isMember("testMembership", this.groupTwo));
// - check get role directly
assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", USER_ONE));
assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", USER_TWO));
assertEquals(SiteModel.SITE_COLLABORATOR, this.siteService.getMembersRole("testMembership", USER_THREE));
assertEquals(SiteModel.SITE_CONSUMER, this.siteService.getMembersRole("testMembership", this.groupTwo));
// Check permissions of added group
// Update the permissions of the group
this.siteService.setMembership("testMembership", USER_THREE, SiteModel.SITE_CONTRIBUTOR);
/**
* Add other group (GROUP_3) with higher (MANAGER) role
*
* - is group in list?
* - is new user a member?
* - does redefined user have highest role?
* USER_TWO should be Manager from group 3 having higher priority than group 2
* USER_THREE should still be Contributor from explicit membership.
* USER_FOUR should be Manager - from group 4 sub-group
*/
this.siteService.setMembership("testMembership", this.groupThree, SiteModel.SITE_MANAGER);
assertTrue(this.siteService.isMember("testMembership", USER_ONE));
assertTrue(this.siteService.isMember("testMembership", USER_TWO));
assertTrue(this.siteService.isMember("testMembership", USER_THREE));
assertTrue(this.siteService.isMember("testMembership", USER_FOUR));
assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", USER_ONE));
assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", USER_TWO));
assertEquals(SiteModel.SITE_CONTRIBUTOR, this.siteService.getMembersRole("testMembership", USER_THREE));
assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", this.groupThree));
// From sub group four
assertEquals(SiteModel.SITE_MANAGER, this.siteService.getMembersRole("testMembership", USER_FOUR));
// Remove groups
}
/**
* Tests the visibility of a site