mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-16 22:43:12 +00:00
76715: Bitstream format cannot be retrieved if you don't have read rights on the file
This commit is contained in:
@@ -34,7 +34,7 @@ public class BitstreamFormatLinkRepository extends AbstractDSpaceRestRepository
|
|||||||
@Autowired
|
@Autowired
|
||||||
BitstreamService bitstreamService;
|
BitstreamService bitstreamService;
|
||||||
|
|
||||||
@PreAuthorize("hasPermission(#bitstreamId, 'BITSTREAM', 'READ')")
|
@PreAuthorize("hasPermission(#bitstreamId, 'BITSTREAM', 'METADATA_READ')")
|
||||||
public BitstreamFormatRest getFormat(@Nullable HttpServletRequest request,
|
public BitstreamFormatRest getFormat(@Nullable HttpServletRequest request,
|
||||||
UUID bitstreamId,
|
UUID bitstreamId,
|
||||||
@Nullable Pageable optionalPageable,
|
@Nullable Pageable optionalPageable,
|
||||||
|
@@ -826,6 +826,7 @@ public class BitstreamRestControllerIT extends AbstractControllerIntegrationTest
|
|||||||
public void getBitstreamFormatUnauthorized() throws Exception {
|
public void getBitstreamFormatUnauthorized() throws Exception {
|
||||||
|
|
||||||
resourcePolicyService.removePolicies(context, bitstream, READ);
|
resourcePolicyService.removePolicies(context, bitstream, READ);
|
||||||
|
resourcePolicyService.removePolicies(context, bitstream.getBundles().get(0), READ);
|
||||||
|
|
||||||
getClient()
|
getClient()
|
||||||
.perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
.perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
@@ -836,6 +837,7 @@ public class BitstreamRestControllerIT extends AbstractControllerIntegrationTest
|
|||||||
public void getBitstreamFormatForbidden() throws Exception {
|
public void getBitstreamFormatForbidden() throws Exception {
|
||||||
|
|
||||||
resourcePolicyService.removePolicies(context, bitstream, READ);
|
resourcePolicyService.removePolicies(context, bitstream, READ);
|
||||||
|
resourcePolicyService.removePolicies(context, bitstream.getBundles().get(0), READ);
|
||||||
|
|
||||||
getClient(getAuthToken(eperson.getEmail(), password))
|
getClient(getAuthToken(eperson.getEmail(), password))
|
||||||
.perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
.perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
@@ -37,10 +37,12 @@ import org.dspace.builder.CommunityBuilder;
|
|||||||
import org.dspace.builder.ItemBuilder;
|
import org.dspace.builder.ItemBuilder;
|
||||||
import org.dspace.builder.ResourcePolicyBuilder;
|
import org.dspace.builder.ResourcePolicyBuilder;
|
||||||
import org.dspace.content.Bitstream;
|
import org.dspace.content.Bitstream;
|
||||||
|
import org.dspace.content.BitstreamFormat;
|
||||||
import org.dspace.content.Bundle;
|
import org.dspace.content.Bundle;
|
||||||
import org.dspace.content.Collection;
|
import org.dspace.content.Collection;
|
||||||
import org.dspace.content.Community;
|
import org.dspace.content.Community;
|
||||||
import org.dspace.content.Item;
|
import org.dspace.content.Item;
|
||||||
|
import org.dspace.content.service.BitstreamFormatService;
|
||||||
import org.dspace.content.service.BitstreamService;
|
import org.dspace.content.service.BitstreamService;
|
||||||
import org.dspace.core.Constants;
|
import org.dspace.core.Constants;
|
||||||
import org.dspace.eperson.EPerson;
|
import org.dspace.eperson.EPerson;
|
||||||
@@ -56,6 +58,9 @@ public class BitstreamRestRepositoryIT extends AbstractControllerIntegrationTest
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ResourcePolicyService resourcePolicyService;
|
private ResourcePolicyService resourcePolicyService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BitstreamFormatService bitstreamFormatService;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void findAllTest() throws Exception {
|
public void findAllTest() throws Exception {
|
||||||
//We turn off the authorization system in order to create the structure as defined below
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
@@ -289,6 +294,52 @@ public class BitstreamRestRepositoryIT extends AbstractControllerIntegrationTest
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void findOneBitstreamFormatTest_EmbargoedBitstream_Anon() throws Exception {
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, parentCommunity)
|
||||||
|
.withName("Collection 1")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// a public item with an embargoed bitstream
|
||||||
|
String bitstreamContent = "Embargoed!";
|
||||||
|
|
||||||
|
BitstreamFormat bitstreamFormat = bitstreamFormatService.findByMIMEType(context, "text/plain");
|
||||||
|
|
||||||
|
Item publicItem1;
|
||||||
|
Bitstream bitstream;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent, org.apache.commons.lang3.CharEncoding.UTF_8)) {
|
||||||
|
|
||||||
|
publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Public item 1")
|
||||||
|
.withIssueDate("2017-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
bitstream = BitstreamBuilder
|
||||||
|
.createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Test Embargoed Bitstream")
|
||||||
|
.withDescription("This bitstream is embargoed")
|
||||||
|
.withMimeType(bitstreamFormat.getMIMEType())
|
||||||
|
.withEmbargoPeriod("3 months")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
// Bitstream format should still be accessible by anonymous request
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$", BitstreamFormatMatcher.matchBitstreamFormat(
|
||||||
|
bitstreamFormat.getID(), bitstreamFormat.getMIMEType(), bitstreamFormat.getDescription())))
|
||||||
|
.andExpect(jsonPath("$", HalMatcher.matchNoEmbeds()))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void findOneBitstreamTest_NoReadPolicyOnBitstream_Anon() throws Exception {
|
public void findOneBitstreamTest_NoReadPolicyOnBitstream_Anon() throws Exception {
|
||||||
//We turn off the authorization system in order to create the structure as defined below
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
@@ -346,6 +397,58 @@ public class BitstreamRestRepositoryIT extends AbstractControllerIntegrationTest
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void findOneBitstreamFormatTest_NoReadPolicyOnBitstream_Anon() throws Exception {
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String bitstreamContent = "ThisIsSomeDummyText";
|
||||||
|
|
||||||
|
BitstreamFormat bitstreamFormat = bitstreamFormatService.findByMIMEType(context, "text/plain");
|
||||||
|
|
||||||
|
//Add a bitstream to an item
|
||||||
|
Bitstream bitstream = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) {
|
||||||
|
bitstream = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream")
|
||||||
|
.withDescription("Description")
|
||||||
|
.withMimeType(bitstreamFormat.getMIMEType())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove all READ policies on bitstream
|
||||||
|
resourcePolicyService.removePolicies(context, bitstream, Constants.READ);
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
// Bitstream format should still be accessible by anonymous request
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$", BitstreamFormatMatcher.matchBitstreamFormat(
|
||||||
|
bitstreamFormat.getID(), bitstreamFormat.getMIMEType(), bitstreamFormat.getDescription())))
|
||||||
|
.andExpect(jsonPath("$", HalMatcher.matchNoEmbeds()))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void findOneBitstreamTest_EmbargoedBitstream_NoREADRightsOnBundle() throws Exception {
|
public void findOneBitstreamTest_EmbargoedBitstream_NoREADRightsOnBundle() throws Exception {
|
||||||
context.turnOffAuthorisationSystem();
|
context.turnOffAuthorisationSystem();
|
||||||
@@ -404,6 +507,69 @@ public class BitstreamRestRepositoryIT extends AbstractControllerIntegrationTest
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void findOneBitstreamFormatTest_EmbargoedBitstream_NoREADRightsOnBundle() throws Exception {
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
context.setCurrentUser(eperson);
|
||||||
|
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, parentCommunity)
|
||||||
|
.withName("Collection 1")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// a public item with an embargoed bitstream
|
||||||
|
String bitstreamContent = "Embargoed!";
|
||||||
|
|
||||||
|
BitstreamFormat bitstreamFormat = bitstreamFormatService.findByMIMEType(context, "text/plain");
|
||||||
|
|
||||||
|
Item publicItem1;
|
||||||
|
Bitstream bitstream;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent, org.apache.commons.lang3.CharEncoding.UTF_8)) {
|
||||||
|
|
||||||
|
publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Public item 1")
|
||||||
|
.withIssueDate("2017-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
bitstream = BitstreamBuilder
|
||||||
|
.createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Test Embargoed Bitstream")
|
||||||
|
.withDescription("This bitstream is embargoed")
|
||||||
|
.withMimeType(bitstreamFormat.getMIMEType())
|
||||||
|
.withEmbargoPeriod("3 months")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove read policies on bundle of bitstream
|
||||||
|
resourcePolicyService.removePolicies(context, bitstream.getBundles().get(0), Constants.READ);
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
// Bitstream format should not be accessible by anonymous request
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isUnauthorized())
|
||||||
|
;
|
||||||
|
|
||||||
|
// Bitstream format should not be accessible by submitter
|
||||||
|
String submitterToken = getAuthToken(context.getCurrentUser().getEmail(), password);
|
||||||
|
getClient(submitterToken).perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isForbidden())
|
||||||
|
;
|
||||||
|
|
||||||
|
// Bitstream format should be accessible by admin
|
||||||
|
String adminToken = getAuthToken(admin.getEmail(), password);
|
||||||
|
getClient(adminToken).perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$", BitstreamFormatMatcher.matchBitstreamFormat(
|
||||||
|
bitstreamFormat.getID(), bitstreamFormat.getMIMEType(), bitstreamFormat.getDescription())))
|
||||||
|
.andExpect(jsonPath("$", HalMatcher.matchNoEmbeds()))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void findOneBitstreamTest_EmbargoedBitstream_ePersonREADRightsOnBundle() throws Exception {
|
public void findOneBitstreamTest_EmbargoedBitstream_ePersonREADRightsOnBundle() throws Exception {
|
||||||
context.turnOffAuthorisationSystem();
|
context.turnOffAuthorisationSystem();
|
||||||
@@ -465,6 +631,75 @@ public class BitstreamRestRepositoryIT extends AbstractControllerIntegrationTest
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void findOneBitstreamFormatTest_EmbargoedBitstream_ePersonREADRightsOnBundle() throws Exception {
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
context.setCurrentUser(eperson);
|
||||||
|
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, parentCommunity)
|
||||||
|
.withName("Collection 1")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// a public item with an embargoed bitstream
|
||||||
|
String bitstreamContent = "Embargoed!";
|
||||||
|
|
||||||
|
BitstreamFormat bitstreamFormat = bitstreamFormatService.findByMIMEType(context, "text/plain");
|
||||||
|
|
||||||
|
Item publicItem1;
|
||||||
|
Bitstream bitstream;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent, org.apache.commons.lang3.CharEncoding.UTF_8)) {
|
||||||
|
|
||||||
|
publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Public item 1")
|
||||||
|
.withIssueDate("2017-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
bitstream = BitstreamBuilder
|
||||||
|
.createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Test Embargoed Bitstream")
|
||||||
|
.withDescription("This bitstream is embargoed")
|
||||||
|
.withMimeType(bitstreamFormat.getMIMEType())
|
||||||
|
.withEmbargoPeriod("3 months")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace anon read policy on bundle of bitstream with ePerson READ policy
|
||||||
|
resourcePolicyService.removePolicies(context, bitstream.getBundles().get(0), Constants.READ);
|
||||||
|
ResourcePolicyBuilder.createResourcePolicy(context).withUser(eperson)
|
||||||
|
.withAction(Constants.READ)
|
||||||
|
.withDspaceObject(bitstream.getBundles().get(0)).build();
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
// Bitstream format should not be accessible by anonymous request
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isUnauthorized())
|
||||||
|
;
|
||||||
|
|
||||||
|
// Bitstream format should be accessible by eperson
|
||||||
|
String submitterToken = getAuthToken(context.getCurrentUser().getEmail(), password);
|
||||||
|
getClient(submitterToken).perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$", BitstreamFormatMatcher.matchBitstreamFormat(
|
||||||
|
bitstreamFormat.getID(), bitstreamFormat.getMIMEType(), bitstreamFormat.getDescription())))
|
||||||
|
.andExpect(jsonPath("$", HalMatcher.matchNoEmbeds()))
|
||||||
|
;
|
||||||
|
|
||||||
|
// Bitstream format should be accessible by admin
|
||||||
|
String adminToken = getAuthToken(admin.getEmail(), password);
|
||||||
|
getClient(adminToken).perform(get("/api/core/bitstreams/" + bitstream.getID() + "/format"))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$", BitstreamFormatMatcher.matchBitstreamFormat(
|
||||||
|
bitstreamFormat.getID(), bitstreamFormat.getMIMEType(), bitstreamFormat.getDescription())))
|
||||||
|
.andExpect(jsonPath("$", HalMatcher.matchNoEmbeds()))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void findOneBitstreamTest_EmbargoedBitstream_NoREADRightsOnItem() throws Exception {
|
public void findOneBitstreamTest_EmbargoedBitstream_NoREADRightsOnItem() throws Exception {
|
||||||
context.turnOffAuthorisationSystem();
|
context.turnOffAuthorisationSystem();
|
||||||
|
Reference in New Issue
Block a user