Skip to content

Commit 4a54ed9

Browse files
committed
host dataverse - cherry picked IQSS/pull/11865
1 parent 27dabe2 commit 4a54ed9

File tree

4 files changed

+86
-37
lines changed

4 files changed

+86
-37
lines changed

src/main/java/edu/harvard/iq/dataverse/DatasetPage.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package edu.harvard.iq.dataverse;
22

3+
import edu.harvard.iq.dataverse.authorization.DataverseRole;
4+
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
5+
import edu.harvard.iq.dataverse.globus.Permissions;
36
import edu.harvard.iq.dataverse.provenance.ProvPopupFragmentBean;
47
import edu.harvard.iq.dataverse.api.AbstractApiBean;
58
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
@@ -332,6 +335,7 @@ public enum DisplayMode {
332335
private List<SelectItem> linkingDVSelectItems;
333336
private Dataverse linkingDataverse;
334337
private Dataverse selectedHostDataverse;
338+
private Boolean hasDataversesToChoose;
335339

336340
public Dataverse getSelectedHostDataverse() {
337341
return selectedHostDataverse;
@@ -1781,6 +1785,22 @@ public void setDataverseTemplates(List<Template> dataverseTemplates) {
17811785
this.dataverseTemplates = dataverseTemplates;
17821786
}
17831787

1788+
public boolean isHasDataversesToChoose() {
1789+
1790+
if (this.hasDataversesToChoose == null) {
1791+
var user = this.session.getUser();
1792+
if (!user.isAuthenticated()) {
1793+
this.hasDataversesToChoose = false;
1794+
} else {
1795+
var req = dvRequestService.getDataverseRequest();
1796+
var permissionBit = 1 << Permission.AddDataset.ordinal();
1797+
var authenticatedUser = (AuthenticatedUser) user;
1798+
this.hasDataversesToChoose = permissionService.hasMultiplePermittedCollections(req, authenticatedUser, permissionBit);
1799+
}
1800+
}
1801+
return this.hasDataversesToChoose;
1802+
}
1803+
17841804
public Template getDefaultTemplate() {
17851805
return defaultTemplate;
17861806
}

src/main/java/edu/harvard/iq/dataverse/DataverseConverter.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,34 @@
1313
import jakarta.faces.convert.Converter;
1414
import jakarta.faces.convert.FacesConverter;
1515

16+
import java.util.logging.Logger;
17+
1618
/**
1719
*
1820
* @author skraffmiller
1921
*/
2022
@FacesConverter("dataverseConverter")
2123
public class DataverseConverter implements Converter {
24+
private static final Logger logger = Logger.getLogger(DataverseConverter.class.getCanonicalName());
25+
2226

2327
//@EJB
2428
DataverseServiceBean dataverseService = CDI.current().select(DataverseServiceBean.class).get();
2529

2630
@Override
2731
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
28-
return dataverseService.find(new Long(submittedValue));
32+
if (submittedValue == null || !submittedValue.matches("[0-9]+")) {
33+
logger.fine("Submitted value is not a host dataverse number but: " + submittedValue);
34+
return CDI.current().select(DatasetPage.class).get().getSelectedHostDataverse();
35+
}
36+
else {
37+
try {
38+
return dataverseService.find(Long.parseLong(submittedValue));
39+
} catch (NumberFormatException e) {
40+
logger.warning("Submitted value is out of range for a Long: " + submittedValue);
41+
return CDI.current().select(DatasetPage.class).get().getSelectedHostDataverse();
42+
}
43+
}
2944
//return dataverseService.findByAlias(submittedValue);
3045
}
3146

src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -928,45 +928,59 @@ public List<Dataverse> findPermittedCollections(DataverseRequest request, Authen
928928

929929
public List<Dataverse> findPermittedCollections(DataverseRequest request, AuthenticatedUser user, int permissionBit) {
930930
if (user != null) {
931-
// IP Group - Only check IP if a User is calling for themself
932-
String ipRangeSQL = "FALSE";
933-
if (request != null
934-
&& request.getAuthenticatedUser() != null
935-
&& !request.getAuthenticatedUser().isSuperuser()
936-
&& request.getSourceAddress() != null
937-
&& request.getAuthenticatedUser().getUserIdentifier().equalsIgnoreCase(user.getUserIdentifier())) {
938-
IpAddress ip = request.getSourceAddress();
939-
if (ip instanceof IPv4Address) {
940-
IPv4Address ipv4 = (IPv4Address) ip;
941-
ipRangeSQL = ipv4.toBigInteger() + " BETWEEN ipv4range.bottomaslong AND ipv4range.topaslong";
942-
} else if (ip instanceof IPv6Address) {
943-
IPv6Address ipv6 = (IPv6Address) ip;
944-
long[] vals = ipv6.toLongArray();
945-
if (vals.length == 4) {
946-
ipRangeSQL = """
947-
(@0 BETWEEN ipv6range.bottoma AND ipv6range.topa
948-
AND @1 BETWEEN ipv6range.bottomb AND ipv6range.topb
949-
AND @2 BETWEEN ipv6range.bottomc AND ipv6range.topc
950-
AND @3 BETWEEN ipv6range.bottomd AND ipv6range.topd)
951-
""";
952-
for (int i = 0; i < vals.length; i++) {
953-
ipRangeSQL = ipRangeSQL.replace("@" + i, String.valueOf(vals[i]));
954-
}
931+
var sqlCode = getSqlCode(request, user, permissionBit);
932+
return em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
933+
}
934+
return null;
935+
}
936+
937+
public boolean hasMultiplePermittedCollections(DataverseRequest request, AuthenticatedUser user, int permissionBit) {
938+
if (user != null) {
939+
var sqlCode = getSqlCode(request, user, permissionBit) + " LIMIT 2";
940+
var resultList = em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
941+
return resultList.size() > 1;
942+
}
943+
return false;
944+
}
945+
946+
private String getSqlCode(DataverseRequest request, AuthenticatedUser user, int permissionBit) {
947+
// IP Group - Only check IP if a User is calling for themself
948+
String ipRangeSQL = "FALSE";
949+
if (request != null
950+
&& request.getAuthenticatedUser() != null
951+
&& !request.getAuthenticatedUser().isSuperuser()
952+
&& request.getSourceAddress() != null
953+
&& request.getAuthenticatedUser().getUserIdentifier().equalsIgnoreCase(user.getUserIdentifier())) {
954+
IpAddress ip = request.getSourceAddress();
955+
if (ip instanceof IPv4Address) {
956+
IPv4Address ipv4 = (IPv4Address) ip;
957+
ipRangeSQL = ipv4.toBigInteger() + " BETWEEN ipv4range.bottomaslong AND ipv4range.topaslong";
958+
} else if (ip instanceof IPv6Address) {
959+
IPv6Address ipv6 = (IPv6Address) ip;
960+
long[] vals = ipv6.toLongArray();
961+
if (vals.length == 4) {
962+
ipRangeSQL = """
963+
(@0 BETWEEN ipv6range.bottoma AND ipv6range.topa
964+
AND @1 BETWEEN ipv6range.bottomb AND ipv6range.topb
965+
AND @2 BETWEEN ipv6range.bottomc AND ipv6range.topc
966+
AND @3 BETWEEN ipv6range.bottomd AND ipv6range.topd)
967+
""";
968+
for (int i = 0; i < vals.length; i++) {
969+
ipRangeSQL = ipRangeSQL.replace("@" + i, String.valueOf(vals[i]));
955970
}
956971
}
957972
}
958-
String sqlCode;
959-
if (user.isSuperuser()) {
960-
sqlCode = LIST_ALL_DATAVERSES_SUPERUSER_HAS_PERMISSION;
961-
} else {
962-
sqlCode = LIST_ALL_DATAVERSES_USER_HAS_PERMISSION
963-
.replace("@USERID", String.valueOf(user.getId()))
964-
.replace("@PERMISSIONBIT", String.valueOf(permissionBit))
965-
.replace("@IPRANGESQL", ipRangeSQL);
966-
}
967-
return em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
968973
}
969-
return null;
974+
String sqlCode;
975+
if (user.isSuperuser()) {
976+
sqlCode = LIST_ALL_DATAVERSES_SUPERUSER_HAS_PERMISSION;
977+
} else {
978+
sqlCode = LIST_ALL_DATAVERSES_USER_HAS_PERMISSION
979+
.replace("@USERID", String.valueOf(user.getId()))
980+
.replace("@PERMISSIONBIT", String.valueOf(permissionBit))
981+
.replace("@IPRANGESQL", ipRangeSQL);
982+
}
983+
return sqlCode;
970984
}
971985

972986
/**

src/main/webapp/dataset.xhtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,7 @@
777777
<!-- Create/Edit editMode -->
778778
<ui:fragment rendered="#{DatasetPage.editMode == 'METADATA' or DatasetPage.editMode == 'CREATE'}">
779779
<p:focus context="datasetForm"/>
780-
<div class="form-group">
780+
<div class="form-group" jsf:rendered="#{DatasetPage.hasDataversesToChoose and DatasetPage.editMode == 'CREATE'}">
781781
<label jsf:for="#{DatasetPage.editMode == 'CREATE' ? 'selectHostDataverse_input' : 'select_HostDataverse_Static'}" class="col-md-3 control-label">
782782
#{bundle.hostDataverse}
783783
<span class="glyphicon glyphicon-question-sign tooltip-icon"

0 commit comments

Comments
 (0)