diff --git a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java index e1f29d519c..0420e5e691 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java @@ -508,9 +508,10 @@ public class AuthorizeServiceImpl implements AuthorizeService { List policies = getPolicies(c, src); //Only inherit non-ADMIN policies (since ADMIN policies are automatically inherited) + //and non-custom policies as these are manually applied when appropriate List nonAdminPolicies = new ArrayList<>(); for (ResourcePolicy rp : policies) { - if (rp.getAction() != Constants.ADMIN) { + if (rp.getAction() != Constants.ADMIN && !ResourcePolicy.TYPE_CUSTOM.contentEquals(rp.getRpType())) { nonAdminPolicies.add(rp); } } diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java index b93d33a559..96dac1a4df 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java @@ -850,6 +850,8 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It List defaultCollectionPolicies = authorizeService .getPoliciesActionFilter(context, collection, Constants.DEFAULT_BITSTREAM_READ); + List defaultItemPolicies = authorizeService.findPoliciesByDSOAndType(context, item, + ResourcePolicy.TYPE_CUSTOM); if (defaultCollectionPolicies.size() < 1) { throw new SQLException("Collection " + collection.getID() + " (" + collection.getHandle() + ")" @@ -864,12 +866,14 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It // if come from InstallItem: remove all submission/workflow policies authorizeService.removeAllPoliciesByDSOAndType(context, mybundle, ResourcePolicy.TYPE_SUBMISSION); authorizeService.removeAllPoliciesByDSOAndType(context, mybundle, ResourcePolicy.TYPE_WORKFLOW); + addCustomPoliciesNotInPlace(context, mybundle, defaultItemPolicies); addDefaultPoliciesNotInPlace(context, mybundle, defaultCollectionPolicies); for (Bitstream bitstream : mybundle.getBitstreams()) { // if come from InstallItem: remove all submission/workflow policies authorizeService.removeAllPoliciesByDSOAndType(context, bitstream, ResourcePolicy.TYPE_SUBMISSION); authorizeService.removeAllPoliciesByDSOAndType(context, bitstream, ResourcePolicy.TYPE_WORKFLOW); + addCustomPoliciesNotInPlace(context, bitstream, defaultItemPolicies); addDefaultPoliciesNotInPlace(context, bitstream, defaultCollectionPolicies); } } @@ -1064,6 +1068,15 @@ prevent the generation of resource policy entry values with null dspace_object a } } + private void addCustomPoliciesNotInPlace(Context context, DSpaceObject dso, List customPolicies) + throws SQLException, AuthorizeException { + boolean customPoliciesAlreadyInPlace = authorizeService + .findPoliciesByDSOAndType(context, dso, ResourcePolicy.TYPE_CUSTOM).size() > 0; + if (!customPoliciesAlreadyInPlace) { + authorizeService.addPolicies(context, customPolicies, dso); + } + } + /** * Check whether or not there is already an RP on the given dso, which has actionId={@link Constants.READ} and * resourceTypeId={@link ResourcePolicy.TYPE_CUSTOM}