From d9fdc81a33300823ddeb557f3e7e2109df8e53bc Mon Sep 17 00:00:00 2001 From: David Webster Date: Tue, 29 Sep 2015 10:05:44 +0000 Subject: [PATCH] RM-2548: Admin's security clearance should not be editable. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@113335 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../usersecurityclearance.lib.ftl | 3 +- .../UserSecurityClearanceGetUnitTest.java | 17 +++++++-- .../UserSecurityClearancePutUnitTest.java | 7 +++- .../test/util/BaseWebScriptUnitTest.java | 36 ++++++++++++++++--- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/usersecurityclearance.lib.ftl b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/usersecurityclearance.lib.ftl index 4ec40f7fb5..ea61f30eed 100644 --- a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/usersecurityclearance.lib.ftl +++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/usersecurityclearance.lib.ftl @@ -9,7 +9,8 @@ "firstName": <#if pi.firstName??>"${pi.firstName}"<#else>null, "lastName": <#if pi.lastName??>"${pi.lastName}"<#else>null, "fullName": <#if pi.firstName?? && pi.lastName??>"${pi.firstName} ${pi.lastName}"<#else>"${pi.userName}", - "completeName": <#if pi.firstName?? && pi.lastName?? && pi.userName??>"${pi.firstName} ${pi.lastName} (${pi.userName})"<#else>"${pi.userName}" + "completeName": <#if pi.firstName?? && pi.lastName?? && pi.userName??>"${pi.firstName} ${pi.lastName} (${pi.userName})"<#else>"${pi.userName}", + "isEditable": <#if people.isAdmin(people.getPerson(pi.userName))>false<#else>true } \ No newline at end of file diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearanceGetUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearanceGetUnitTest.java index af3c578f16..16b6ea6851 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearanceGetUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearanceGetUnitTest.java @@ -18,6 +18,7 @@ */ package org.alfresco.module.org_alfresco_module_rm.script.classification; +import static java.util.Collections.emptyMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Matchers.any; @@ -31,6 +32,7 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -41,12 +43,14 @@ import org.alfresco.module.org_alfresco_module_rm.classification.SecurityClearan import org.alfresco.module.org_alfresco_module_rm.classification.UserQueryParams; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseWebScriptUnitTest; import org.alfresco.query.PagingResults; +import org.alfresco.repo.jscript.ScriptNode; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.PersonService.PersonInfo; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; import org.json.JSONArray; import org.json.JSONObject; +import org.junit.Ignore; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -184,7 +188,7 @@ public class UserSecurityClearanceGetUnitTest extends BaseWebScriptUnitTest @Override public Pair getTotalResultCount() { - return new Pair(numberOfUsers, numberOfUsers); + return new Pair<>(numberOfUsers, numberOfUsers); } @Override @@ -202,6 +206,14 @@ public class UserSecurityClearanceGetUnitTest extends BaseWebScriptUnitTest assertEquals(expected, mapper.readTree(response.toString())); } + @Override protected Map getMockedPeople() + { + final Map people = super.getMockedPeople(); + + return people; + } + + /** * Check that when supplying a single field with no sort direction, the UserQueryParams are populated with the * specified field and the default direction (true). @@ -285,9 +297,10 @@ public class UserSecurityClearanceGetUnitTest extends BaseWebScriptUnitTest items += "{" + "\"firstName\": \"aFirstName" + fromIndex + "\"," + "\"lastName\": \"aLastName" + fromIndex + "\"," + + "\"clearanceLabel\": \"displayLabel" + fromIndex + "\"," + + "\"isEditable\": true," + "\"completeName\": \"aFirstName" + fromIndex + " aLastName" + fromIndex + " (aUserName" + fromIndex + ")\"," + "\"fullName\": \"aFirstName" + fromIndex + " aLastName" + fromIndex + "\"," + - "\"clearanceLabel\": \"displayLabel" + fromIndex + "\"," + "\"userName\": \"aUserName" + fromIndex + "\"," + "\"classificationId\": \"id" + fromIndex + "\"" + "}"; diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearancePutUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearancePutUnitTest.java index fa4bb890f5..3f6b52eb93 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearancePutUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/UserSecurityClearancePutUnitTest.java @@ -94,7 +94,12 @@ public class UserSecurityClearancePutUnitTest extends BaseWebScriptUnitTest // check the JSON result using Jackson to allow easy equality testing. ObjectMapper mapper = new ObjectMapper(); - String expectedJSONString = "{\"data\":{\"firstName\":\"Firstname\",\"lastName\":\"Lastname\",\"completeName\":\"Firstname Lastname (user1)\",\"fullName\":\"Firstname Lastname\",\"clearanceLabel\":\"Don't tell anyone\",\"userName\":\"user1\",\"classificationId\":\"Top Secret\"}}"; + String expectedJSONString = "{\"data\":{\"firstName\":\"Firstname\",\"lastName\":\"Lastname\"," + + "\"clearanceLabel\":\"Don't tell anyone\"," + + "\"isEditable\":true," + + "\"userName\":\"user1\"," + + "\"completeName\":\"Firstname Lastname (user1)\",\"fullName\":\"Firstname Lastname\"," + + "\"classificationId\":\"Top Secret\"}}"; JsonNode expected = mapper.readTree(expectedJSONString); assertEquals(expected, mapper.readTree(json.toString())); } diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseWebScriptUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseWebScriptUnitTest.java index 2a0f18a927..6291e4576a 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseWebScriptUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseWebScriptUnitTest.java @@ -18,15 +18,21 @@ */ package org.alfresco.module.org_alfresco_module_rm.test.util; +import static java.util.Collections.emptyMap; + import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; +import org.alfresco.repo.jscript.People; +import org.alfresco.repo.jscript.ScriptNode; import org.json.JSONObject; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -125,7 +131,7 @@ public abstract class BaseWebScriptUnitTest extends BaseUnitTest */ protected String executeWebScript(Map parameters) throws Exception { - return executeWebScript( parameters, null); + return executeWebScript(parameters, null); } /** @@ -240,10 +246,11 @@ public abstract class BaseWebScriptUnitTest extends BaseUnitTest doReturn(mockedScriptProcessorRegistry).when(mockedContainer).getScriptProcessorRegistry(); doReturn(mockedTemplateProcessorRegistry).when(mockedContainer).getTemplateProcessorRegistry(); - Map containerTemplateParameters = new HashMap(5); + Map containerTemplateParameters = new HashMap<>(5); containerTemplateParameters.put("jsonUtils", new JSONUtils()); + containerTemplateParameters.put("people", getMockedPeopleObject()); doReturn(containerTemplateParameters).when(mockedContainer).getTemplateParameters(); - + SearchPath mockedSearchPath = mock(SearchPath.class); doReturn(false).when(mockedSearchPath).hasDocument(anyString()); doReturn(mockedSearchPath).when(mockedContainer).getSearchPath(); @@ -252,7 +259,28 @@ public abstract class BaseWebScriptUnitTest extends BaseUnitTest Description mockDescription = mock(Description.class); doReturn(mock(RequiredCache.class)).when(mockDescription).getRequiredCache(); - return mockedContainer; + return mockedContainer; + } + + /** + * Creates a mock {@code people} object for use as a root object within FTL. + * This {@code people} object will return person nodes as specified in {@link #getMockedPeople()}. + */ + protected People getMockedPeopleObject() + { + People p = mock(People.class); + getMockedPeople().forEach((name, person) -> when(p.getPerson(eq(name))).thenReturn(person) ); + return p; + } + + /** + * Creates a map of person ScriptNodes for use within FTL. + * The default implementation is an empty map, but this can be overridden by subclasses. + * @return a map of usernames to mocked ScriptNode objects representing person nodes. + */ + protected Map getMockedPeople() + { + return emptyMap(); } /**