From: remillet Date: Thu, 7 Dec 2017 19:55:38 +0000 (-0800) Subject: DRYD-186: POSTs to the Role resource can now declare a set of permissions to associat... X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=d12c82f713fd145579a7b9bc477a48c9493bbccb;p=tmp%2Fjakarta-migration.git DRYD-186: POSTs to the Role resource can now declare a set of permissions to associate with the new role. If the permissions don't exist, the Services will create them. The permissions MUST include values for the actionGroup and resource. --- diff --git a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java index 76217e33b..865ffd49a 100644 --- a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java +++ b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java @@ -656,8 +656,8 @@ public class XmlReplay { fullURL = fixupFullURL(fullURL, protoHostPort, uri); } else if (method.equalsIgnoreCase("DELETE")){ String fromTestID = testNode.valueOf("fromTestID"); - ServiceResult pr = serviceResultsMap.get(fromTestID); - if (pr!=null){ + ServiceResult pr = Tools.notBlank(fromTestID) ? serviceResultsMap.get(fromTestID) : null; + if (pr != null) { serviceResult = XmlReplayTransport.doDELETE(pr.deleteURL, authForTest, testIDLabel, fromTestID); serviceResult.fromTestID = fromTestID; if (expectedCodes.size()>0){ diff --git a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplayTransport.java b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplayTransport.java index efd9cbed4..31dd26038 100644 --- a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplayTransport.java +++ b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplayTransport.java @@ -110,7 +110,9 @@ public class XmlReplayTransport { deleteMethod.setRequestHeader("Accept", "multipart/mixed"); deleteMethod.addRequestHeader("Accept", "application/xml"); deleteMethod.setRequestHeader("Authorization", formatAuth(authForTest)); - deleteMethod.setRequestHeader("X-XmlReplay-fromTestID", fromTestID); + if (Tools.notBlank(fromTestID)) { + deleteMethod.setRequestHeader("X-XmlReplay-fromTestID", fromTestID); + } int statusCode1 = 0; String res = ""; try { diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security.xml index 013d72b5c..5946eca88 100644 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security.xml @@ -184,7 +184,7 @@ dimension/1.xml - 404 + 403 PUT /cspace-services/dimensions/${dimension1.CSID} dimension/2-put.xml diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/3-role-test-cm.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/3-role-test-cm.xml index 8575b3a78..ccd7034d6 100644 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/3-role-test-cm.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/3-role-test-cm.xml @@ -1,6 +1,29 @@ - - ROLE_TEST_CM - role for ROLE_TEST_CM + + ROLE_TEST_CM + role for ROLE_TEST_CM + + 4381 + 1-vocabularies-RL + vocabularies + RL + + + 4382 + 1-groups-RL + groups + RL + + + 4381 + 1-vocabularies-CRUL + vocabularies + CRUL + + + 4382 + 1-groups-CRUL + groups + CRUL + diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/4-role-intern.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/4-role-intern.xml index d74115ed2..b16fc0503 100644 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/4-role-intern.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/security/4-role-intern.xml @@ -1,5 +1,17 @@ - ROLE_TEST_INTERN - role for ROLE_TEST_INTERN + ROLE_TEST_INTERN + role for ROLE_TEST_INTERN + + 4381 + 1-vocabularies-RL + vocabularies + RL + + + 4382 + 1-groups-RL + groups + RL + diff --git a/services/account/client/src/test/java/org/collectionspace/services/account/client/test/AccountRoleServiceTest.java b/services/account/client/src/test/java/org/collectionspace/services/account/client/test/AccountRoleServiceTest.java index 2fba8111e..a6b7b8a2f 100644 --- a/services/account/client/src/test/java/org/collectionspace/services/account/client/test/AccountRoleServiceTest.java +++ b/services/account/client/src/test/java/org/collectionspace/services/account/client/test/AccountRoleServiceTest.java @@ -573,7 +573,7 @@ public class AccountRoleServiceTest extends AbstractServiceTestImplorg.collectionspace.services.authorization.jaxb ${project.version} + + org.collectionspace.services + org.collectionspace.services.hyperjaxb + ${project.version} + org.collectionspace.services org.collectionspace.services.client diff --git a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionClient.java b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionClient.java index 9ff74c0ec..49d4f627b 100644 --- a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionClient.java +++ b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionClient.java @@ -31,8 +31,8 @@ import java.util.HashMap; import java.util.List; import javax.ws.rs.core.Response; - import org.apache.http.HttpStatus; + import org.collectionspace.services.authorization.perms.ActionType; import org.collectionspace.services.authorization.perms.Permission; import org.collectionspace.services.authorization.perms.PermissionAction; @@ -96,7 +96,6 @@ public class PermissionClient extends AbstractServiceClientImpl permsList = permsListElement.getPermission(); + if (permsList.size() == 1) { + result = permsList.get(0); + } + } + } + } finally { + res.close(); + } + + return result; + } /** * @param permission diff --git a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionProxy.java b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionProxy.java index 1341263df..a67f3270e 100644 --- a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionProxy.java +++ b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionProxy.java @@ -47,7 +47,8 @@ import org.collectionspace.services.authorization.perms.PermissionsList; @Consumes({"application/xml"}) public interface PermissionProxy extends CollectionSpaceProxy { - @GET + @Override + @GET @Produces({"application/xml"}) Response readList(); @@ -62,7 +63,11 @@ public interface PermissionProxy extends CollectionSpaceProxy { @GET @Path("/{csid}") Response read(@PathParam("csid") String csid); - + + //(R)read + @GET + Response read(@QueryParam("res") String resourceName, @QueryParam("actGrp") String actionGroup); + //(U)pdate @PUT @Path("/{csid}") diff --git a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionRoleFactory.java b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionRoleFactory.java index 94563b5f4..a04c5fe28 100644 --- a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionRoleFactory.java +++ b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/PermissionRoleFactory.java @@ -29,6 +29,7 @@ import java.util.List; import org.collectionspace.services.authorization.PermissionRole; import org.collectionspace.services.authorization.PermissionValue; import org.collectionspace.services.authorization.RoleValue; +import org.collectionspace.services.authorization.SubjectType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -84,18 +85,28 @@ public class PermissionRoleFactory { boolean useRoleId) { PermissionRole permRole = new PermissionRole(); - //service consume is not required to provide subject as it is determined - //from URI used -// permRole.setSubject(SubjectType.ROLE); if (useRoleId) { ArrayList rvs = new ArrayList(); rvs.add(rv); permRole.setRole(rvs); } + if (usePermId) { permRole.setPermission(pvs); } return permRole; } + + public static PermissionRole createPermissionRoleInstance(SubjectType subjectType, + RoleValue rv, + List pvs, + boolean usePermId, + boolean useRoleId) { + + PermissionRole permRole = createPermissionRoleInstance(rv, pvs, usePermId, useRoleId); + permRole.setSubject(subjectType); + return permRole; + } + } diff --git a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/RoleFactory.java b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/RoleFactory.java index 05a902886..d5f912823 100644 --- a/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/RoleFactory.java +++ b/services/authorization-mgt/client/src/main/java/org/collectionspace/services/client/RoleFactory.java @@ -50,7 +50,11 @@ package org.collectionspace.services.client; +import java.util.List; + +import org.collectionspace.services.authorization.PermissionValue; import org.collectionspace.services.authorization.Role; +import org.collectionspace.services.authorization.RoleValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,6 +65,9 @@ import org.slf4j.LoggerFactory; public class RoleFactory { static private final Logger logger = LoggerFactory.getLogger(RoleFactory.class); + + public static final List EMPTY_PERMVALUE_LIST = null; + /** * create role instance * @param roleName @@ -71,7 +78,8 @@ public class RoleFactory { public static Role createRoleInstance(String roleName, String displayName, String description, - boolean useRoleName) { + boolean useRoleName, + List permValueList) { Role role = new Role(); if (useRoleName == true) { @@ -79,7 +87,20 @@ public class RoleFactory { } role.setDisplayName(displayName); role.setDescription(description); + role.setPermission(permValueList); + return role; } + + public static RoleValue createRoleValueInstance(Role role) { + RoleValue result = new RoleValue(); + + result.setDisplayName(role.getDisplayName()); + result.setRoleId(role.getCsid()); + result.setRoleName(role.getRoleName()); + result.setTenantId(role.getTenantId()); + + return result; + } } diff --git a/services/authorization-mgt/client/src/test/java/org/collectionspace/services/authorization/client/test/PermissionRoleServiceTest.java b/services/authorization-mgt/client/src/test/java/org/collectionspace/services/authorization/client/test/PermissionRoleServiceTest.java index b2a81d262..d0c8f260a 100644 --- a/services/authorization-mgt/client/src/test/java/org/collectionspace/services/authorization/client/test/PermissionRoleServiceTest.java +++ b/services/authorization-mgt/client/src/test/java/org/collectionspace/services/authorization/client/test/PermissionRoleServiceTest.java @@ -650,7 +650,7 @@ public class PermissionRoleServiceTest extends AbstractServiceTestImpl allResourceIdsCreated = new ArrayList(); + // + // Permission values + // + private List permissionValues = RoleFactory.EMPTY_PERMVALUE_LIST; @Override public String getServiceName() { @@ -91,9 +108,87 @@ public class RoleServiceTest extends AbstractServiceTestImpl(); + permissionValues.add(createPermissionValueInstance(PERM_1_RL_RESOURCE, PERM_1_RL_ACTIONGROUP)); + permissionValues.add(createPermissionValueInstance(PERM_2_RL_RESOURCE, PERM_2_RL_ACTIONGROUP)); + permissionValues.add(createPermissionValueInstance(PERM_3_RL_RESOURCE, PERM_3_RL_ACTIONGROUP)); + } - /* (non-Javadoc) + private PermissionValue createPermissionValueInstance(String resource, String actionGroup) { + PermissionValue permValue = new PermissionValue(); + permValue.setResourceName(resource); + permValue.setActionGroup(actionGroup); + return permValue; + } + + /** + * Clean up. + * @throws Exception + */ + @AfterClass(alwaysRun = true) + @Override + public void cleanUp() throws Exception { + String noTest = System.getProperty("noTestCleanup"); + if (Boolean.TRUE.toString().equalsIgnoreCase(noTest)) { + if (logger.isDebugEnabled()) { + logger.debug("Skipping Cleanup phase ..."); + } + return; + } + if (logger.isDebugEnabled()) { + logger.debug("Cleaning up temporary resources created for testing ..."); + } + // + // Delete the permissions we indirectly created with when we created via the "createRoleWithPerms()" test + // + for (PermissionValue pv : permissionValues) { + deletePermission(pv); + } + + // + // Call our parent cleanup method. + // + super.cleanUp(); + } + + + /* + * Use a resource name and action group value to find and delete a permission record/resource. + */ + private void deletePermission(PermissionValue permissionValue) throws Exception { + int statusCode = Response.Status.OK.getStatusCode(); + PermissionClient client = new PermissionClient(); + Permission permission = client.read(permissionValue.getResourceName(), permissionValue.getActionGroup()); + if (permission != null) { + Response res = client.delete(permission.getCsid()); + try { + statusCode = res.getStatus(); + } finally { + res.close(); + } + } else { + // + // Something bad happened. + // + statusCode = Response.Status.BAD_REQUEST.getStatusCode(); + } + + if (statusCode != Response.Status.OK.getStatusCode()) { + String msg = String.format("Could not delete test Permission record: resource name='%s', actionGroup='%s'.", + permissionValue.getResourceName(), permissionValue.getActionGroup()); + logger.error(msg); + } + } + + /* (non-Javadoc) * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#readPaginatedList(java.lang.String) */ @Override @@ -116,7 +211,7 @@ public class RoleServiceTest extends AbstractServiceTestImpl permValueList) { Role role = RoleFactory.createRoleInstance(roleName, roleName, //the display name description, - useRoleName); + useRoleName, + permValueList); + if (logger.isDebugEnabled()) { logger.debug("to be created, role"); org.collectionspace.services.authorization.ObjectFactory objectFactory = new org.collectionspace.services.authorization.ObjectFactory(); logger.debug(objectAsXmlString(objectFactory.createRole(role), Role.class)); } + return role; - } - + + public Role createRoleInstance(String roleName, + String description, + boolean useRoleName) { + return this.createRoleInstance(roleName, description, useRoleName, RoleFactory.EMPTY_PERMVALUE_LIST); + } + /** * Prints the list. * diff --git a/services/authorization-mgt/service/src/main/java/org/collectionspace/services/authorization/storage/RoleDocumentHandler.java b/services/authorization-mgt/service/src/main/java/org/collectionspace/services/authorization/storage/RoleDocumentHandler.java index a7f2b2fc1..13637c652 100644 --- a/services/authorization-mgt/service/src/main/java/org/collectionspace/services/authorization/storage/RoleDocumentHandler.java +++ b/services/authorization-mgt/service/src/main/java/org/collectionspace/services/authorization/storage/RoleDocumentHandler.java @@ -27,10 +27,18 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.collectionspace.services.authorization.PermissionRole; +import org.collectionspace.services.authorization.PermissionRoleSubResource; +import org.collectionspace.services.authorization.PermissionValue; import org.collectionspace.services.authorization.Role; +import org.collectionspace.services.authorization.RoleValue; import org.collectionspace.services.authorization.RolesList; +import org.collectionspace.services.authorization.SubjectType; +import org.collectionspace.services.client.PermissionRoleFactory; import org.collectionspace.services.client.RoleClient; +import org.collectionspace.services.client.RoleFactory; + import org.collectionspace.services.common.document.BadRequestException; import org.collectionspace.services.common.document.DocumentFilter; import org.collectionspace.services.common.document.DocumentWrapper; @@ -73,6 +81,22 @@ public class RoleDocumentHandler role.setMetadataProtection(null); role.setPermsProtection(null); } + + @Override + public void completeCreate(DocumentWrapper wrapDoc) throws Exception { + Role role = wrapDoc.getWrappedObject(); + List permValueList = role.getPermission(); + if (permValueList != null && permValueList.size() > 0) { + // create and persist a permrole instance + // The caller of this method needs to ensure a valid and active EM (EntityManager) instance is in the Service context + RoleValue roleValue = RoleFactory.createRoleValueInstance(role); + PermissionRole permRole = PermissionRoleFactory.createPermissionRoleInstance(SubjectType.PERMISSION, roleValue, + permValueList, true, true); + PermissionRoleSubResource subResource = + new PermissionRoleSubResource(PermissionRoleSubResource.ROLE_PERMROLE_SERVICE); + String permrolecsid = subResource.createPermissionRole(permRole, SubjectType.PERMISSION); + } + } @Override public void handleUpdate(DocumentWrapper wrapDoc) throws Exception { diff --git a/services/authorization/jaxb/src/main/resources/roles.xsd b/services/authorization/jaxb/src/main/resources/roles.xsd index e9d9492ab..ddeffd3d3 100644 --- a/services/authorization/jaxb/src/main/resources/roles.xsd +++ b/services/authorization/jaxb/src/main/resources/roles.xsd @@ -13,6 +13,8 @@ jaxb:extensionBindingPrefixes="hj orm xjc" > + +