Skip to content

Commit de4ada4

Browse files
committed
adding user permission check
1 parent 4134f22 commit de4ada4

File tree

5 files changed

+51
-11
lines changed

5 files changed

+51
-11
lines changed

src/main/java/edu/harvard/iq/dataverse/dataverse/featured/DataverseFeaturedItemServiceBean.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.google.common.collect.Lists;
44
import edu.harvard.iq.dataverse.*;
5+
import edu.harvard.iq.dataverse.authorization.Permission;
6+
import edu.harvard.iq.dataverse.authorization.users.User;
7+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
58
import edu.harvard.iq.dataverse.settings.JvmSettings;
69
import edu.harvard.iq.dataverse.util.BundleUtil;
710
import edu.harvard.iq.dataverse.util.FileUtil;
@@ -10,6 +13,7 @@
1013
import jakarta.inject.Named;
1114
import jakarta.persistence.EntityManager;
1215
import jakarta.persistence.PersistenceContext;
16+
import jakarta.servlet.http.HttpServletRequest;
1317

1418
import java.io.File;
1519
import java.io.IOException;
@@ -18,6 +22,7 @@
1822
import java.nio.file.Files;
1923
import java.nio.file.Path;
2024
import java.nio.file.StandardCopyOption;
25+
import java.util.EnumSet;
2126
import java.util.List;
2227

2328
@Stateless
@@ -36,6 +41,8 @@ public InvalidImageFileException(String message) {
3641
protected DataFileServiceBean fileService;
3742
@EJB
3843
protected DatasetServiceBean datasetService;
44+
@EJB
45+
protected PermissionServiceBean permissionService;
3946

4047
public DataverseFeaturedItem findById(Long id) {
4148
return em.find(DataverseFeaturedItem.class, id);
@@ -57,7 +64,7 @@ public void delete(Long id) {
5764
.executeUpdate();
5865
}
5966

60-
public List<DataverseFeaturedItem> findAllByDataverseOrdered(Dataverse dataverse, boolean filter) {
67+
public List<DataverseFeaturedItem> findAllByDataverseOrdered(User user, Dataverse dataverse, boolean filter) {
6168
List<DataverseFeaturedItem> items = em
6269
.createNamedQuery("DataverseFeaturedItem.findByDataverseOrderedByDisplayOrder", DataverseFeaturedItem.class)
6370
.setParameter("dataverse", dataverse)
@@ -68,14 +75,15 @@ public List<DataverseFeaturedItem> findAllByDataverseOrdered(Dataverse dataverse
6875
// filter the list by removing any items with dvObjects that should not be shown
6976
for (DataverseFeaturedItem item : items) {
7077
if (item.getDvObject() != null) {
78+
DataverseRequest req = new DataverseRequest(user, (HttpServletRequest) null);
7179
if ("datafile".equals(item.getType())) {
7280
final DataFile datafile = fileService.find(item.getDvObject().getId());
73-
if (datafile == null || datafile.isRestricted()) {
81+
if (datafile == null || (datafile.isRestricted() && !userHasPermission(req, datafile, Permission.DownloadFile))) {
7482
filteredList.remove(item);
7583
}
7684
} else if ("dataset".equals(item.getType())) {
7785
final Dataset dataset = datasetService.find(item.getDvObject().getId());
78-
if (dataset == null || dataset.isDeaccessioned()) {
86+
if (dataset == null || (dataset.isDeaccessioned() && !userHasPermission(req, dataset, Permission.ViewUnpublishedDataset))) {
7987
filteredList.remove(item);
8088
}
8189
}
@@ -84,6 +92,9 @@ public List<DataverseFeaturedItem> findAllByDataverseOrdered(Dataverse dataverse
8492
}
8593
return filteredList;
8694
}
95+
private boolean userHasPermission(DataverseRequest req, DvObject dvObject, Permission permission) {
96+
return req.getUser() == null || dvObject == null ? false : permissionService.hasPermissionsFor(req, dvObject, EnumSet.of(permission));
97+
}
8798

8899
public InputStream getImageFileAsInputStream(DataverseFeaturedItem dataverseFeaturedItem) throws IOException {
89100
Path imagePath = Path.of(JvmSettings.DOCROOT_DIRECTORY.lookup(),

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DeleteDataverseCommand.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package edu.harvard.iq.dataverse.engine.command.impl;
22

33
import edu.harvard.iq.dataverse.Dataverse;
4+
import edu.harvard.iq.dataverse.authorization.users.User;
45
import edu.harvard.iq.dataverse.dataverse.featured.DataverseFeaturedItem;
56
import edu.harvard.iq.dataverse.DataverseFieldTypeInputLevel;
67
import edu.harvard.iq.dataverse.authorization.DataverseRole;
@@ -43,7 +44,7 @@ protected void executeImpl(CommandContext ctxt) throws CommandException {
4344
throw new IllegalCommandException("Cannot delete the root dataverse", this);
4445
}
4546

46-
// make sure the dataverse is emptyw
47+
// make sure the dataverse is empty
4748
if (ctxt.dvObjects().hasData(doomed)) {
4849
throw new IllegalCommandException("Cannot delete non-empty dataverses", this);
4950
}
@@ -78,10 +79,12 @@ protected void executeImpl(CommandContext ctxt) throws CommandException {
7879
DataverseFieldTypeInputLevel merged = ctxt.em().merge(inputLevel);
7980
ctxt.em().remove(merged);
8081
}
82+
83+
User user = getUser();
8184
doomed.setDataverseFieldTypeInputLevels(new ArrayList<>());
8285

8386
// Featured Items
84-
for (DataverseFeaturedItem featuredItem : ctxt.dataverseFeaturedItems().findAllByDataverseOrdered(doomed, false) ) {
87+
for (DataverseFeaturedItem featuredItem : ctxt.dataverseFeaturedItems().findAllByDataverseOrdered(user, doomed, false) ) {
8588
DataverseFeaturedItem merged = ctxt.em().merge(featuredItem);
8689
ctxt.em().remove(merged);
8790
}

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListDataverseFeaturedItemsCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public ListDataverseFeaturedItemsCommand(DataverseRequest request, Dataverse dat
2424

2525
@Override
2626
public List<DataverseFeaturedItem> execute(CommandContext ctxt) throws CommandException {
27-
return ctxt.dataverseFeaturedItems().findAllByDataverseOrdered(dataverse, true);
27+
return ctxt.dataverseFeaturedItems().findAllByDataverseOrdered(getUser(), dataverse, true);
2828
}
2929

3030
@Override

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseFeaturedItemsCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public List<DataverseFeaturedItem> execute(CommandContext ctxt) throws CommandEx
4444

4545
private List<DataverseFeaturedItem> updateOrDeleteExistingFeaturedItems(CommandContext ctxt) throws CommandException {
4646
List<DataverseFeaturedItem> updatedFeaturedItems = new ArrayList<>();
47-
List<DataverseFeaturedItem> featuredItemsToDelete = ctxt.dataverseFeaturedItems().findAllByDataverseOrdered(dataverse, false);
47+
List<DataverseFeaturedItem> featuredItemsToDelete = ctxt.dataverseFeaturedItems().findAllByDataverseOrdered(getUser(), dataverse, false);
4848

4949
for (Map.Entry<DataverseFeaturedItem, UpdatedDataverseFeaturedItemDTO> entry : dataverseFeaturedItemsToUpdate.entrySet()) {
5050
DataverseFeaturedItem featuredItem = entry.getKey();

src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,17 +1988,25 @@ public void testDeleteFeaturedItemWithDvObject() {
19881988

19891989
@Test
19901990
public void testFilteredFeaturedItemWithDvObject() {
1991-
String userToken = UtilIT.createRandomUserGetToken();
1992-
// test when featuring a datafile and the file is either deleted or restricted
1993-
Response createUserResponse = UtilIT.createRandomUser();
1994-
String apiToken = UtilIT.getApiTokenFromResponse(createUserResponse);
1991+
// first create a superuser
1992+
Response createResponse = UtilIT.createRandomUser();
1993+
String adminApiToken = UtilIT.getApiTokenFromResponse(createResponse);
1994+
String username = UtilIT.getUsernameFromResponse(createResponse);
1995+
UtilIT.makeSuperUser(username);
1996+
1997+
// Create the owner of the dataverse/dataset/datafile
1998+
createResponse = UtilIT.createRandomUser();
1999+
String apiToken = UtilIT.getApiTokenFromResponse(createResponse);
2000+
19952001
Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken);
19962002
createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode());
19972003
String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse);
19982004
UtilIT.publishDataverseViaNativeApi(dataverseAlias, apiToken).prettyPrint();
19992005

20002006
Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken);
2007+
createDatasetResponse.prettyPrint();
20012008
Integer datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse);
2009+
String datasetPersistentId = UtilIT.getDatasetPersistentIdFromResponse(createDatasetResponse);
20022010

20032011
// Upload a file
20042012
String pathToFile1 = "src/main/webapp/resources/images/cc0.png";
@@ -2011,6 +2019,12 @@ public void testFilteredFeaturedItemWithDvObject() {
20112019
Response createDatafileResponse = UtilIT.createDataverseFeaturedItem(dataverseAlias, apiToken, "My File", 0, pathToFile1, "datafile", String.valueOf(datafileId));
20122020
createDatafileResponse.prettyPrint();
20132021

2022+
// test when featuring a datafile and the file is either deleted or restricted
2023+
Response createUserResponse = UtilIT.createRandomUser();
2024+
createUserResponse.prettyPrint();
2025+
String userToken = UtilIT.getApiTokenFromResponse(createUserResponse);
2026+
username = UtilIT.getUsernameFromResponse(createUserResponse);
2027+
20142028
// Test restrict datafile
20152029
UtilIT.restrictFile(String.valueOf(datafileId), true, apiToken);
20162030
UtilIT.publishDatasetViaNativeApi(datasetId, "minor", apiToken);
@@ -2051,6 +2065,18 @@ public void testFilteredFeaturedItemWithDvObject() {
20512065
.body("data.size()", equalTo(1))
20522066
.body("data[0].type", equalTo("datafile"))
20532067
.assertThat().statusCode(OK.getStatusCode());
2068+
2069+
// Test giving permissions to Permission.ViewUnpublishedDataset will un-hide deassessioned datasets, Permission.DownloadFile will un-hide restricted datafiles
2070+
Response giveRandoPermission = UtilIT.grantRoleOnDataset(datasetPersistentId, "curator", "@" + username, adminApiToken);
2071+
giveRandoPermission.prettyPrint();
2072+
2073+
// permission to view deassessioned datasets and restricted files results in both featured items being returned
2074+
listFeaturedItemsResponse = UtilIT.listDataverseFeaturedItems(dataverseAlias, userToken);
2075+
listFeaturedItemsResponse.prettyPrint();
2076+
listFeaturedItemsResponse.then()
2077+
.body("data.size()", equalTo(2))
2078+
.body("data[0].type", equalTo("datafile"))
2079+
.assertThat().statusCode(OK.getStatusCode());
20542080
}
20552081

20562082
@Test

0 commit comments

Comments
 (0)