Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/release-notes/11865-suppress-host-dataverse-field.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### Suppression of the Host Dataverse field

When creating a dataset, the _host dataverse_ field is not shown when the user can only add datasets to one collection.
20 changes: 20 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/DatasetPage.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.authorization.DataverseRole;
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
import edu.harvard.iq.dataverse.globus.Permissions;
import edu.harvard.iq.dataverse.provenance.ProvPopupFragmentBean;
import edu.harvard.iq.dataverse.api.AbstractApiBean;
import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
Expand Down Expand Up @@ -332,6 +335,7 @@ public enum DisplayMode {
private List<SelectItem> linkingDVSelectItems;
private Dataverse linkingDataverse;
private Dataverse selectedHostDataverse;
private Boolean hasDataversesToChoose;

public Dataverse getSelectedHostDataverse() {
return selectedHostDataverse;
Expand Down Expand Up @@ -1781,6 +1785,22 @@ public void setDataverseTemplates(List<Template> dataverseTemplates) {
this.dataverseTemplates = dataverseTemplates;
}

public boolean isHasDataversesToChoose() {

if (this.hasDataversesToChoose == null) {
var user = this.session.getUser();
if (!user.isAuthenticated()) {
this.hasDataversesToChoose = false;
} else {
var req = dvRequestService.getDataverseRequest();
var permissionBit = 1 << Permission.AddDataset.ordinal();
var authenticatedUser = (AuthenticatedUser) user;
this.hasDataversesToChoose = permissionService.hasMultiplePermittedCollections(req, authenticatedUser, permissionBit);
}
}
Comment thread
qqmyers marked this conversation as resolved.
return this.hasDataversesToChoose;
}

public Template getDefaultTemplate() {
return defaultTemplate;
}
Expand Down
17 changes: 16 additions & 1 deletion src/main/java/edu/harvard/iq/dataverse/DataverseConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,34 @@
import jakarta.faces.convert.Converter;
import jakarta.faces.convert.FacesConverter;

import java.util.logging.Logger;

/**
*
* @author skraffmiller
*/
@FacesConverter("dataverseConverter")
public class DataverseConverter implements Converter {
private static final Logger logger = Logger.getLogger(DataverseConverter.class.getCanonicalName());


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

@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
return dataverseService.find(new Long(submittedValue));
if (submittedValue == null || !submittedValue.matches("[0-9]+")) {
logger.fine("Submitted value is not a host dataverse number but: " + submittedValue);
return CDI.current().select(DatasetPage.class).get().getSelectedHostDataverse();
}
else {
try {
return dataverseService.find(Long.parseLong(submittedValue));
} catch (NumberFormatException e) {
logger.warning("Submitted value is out of range for a Long: " + submittedValue);
return CDI.current().select(DatasetPage.class).get().getSelectedHostDataverse();
}
}
//return dataverseService.findByAlias(submittedValue);
}

Expand Down
158 changes: 76 additions & 82 deletions src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -953,96 +953,90 @@ public List<Dataverse> findPermittedCollections(DataverseRequest request, Authen

public List<Dataverse> findPermittedCollections(DataverseRequest request, AuthenticatedUser user, int permissionBit, String searchTerm) {
if (user != null) {
// IP Group - Only check IP if a User is calling for themself
String ipRangeSQL = "FALSE";
if (request != null
&& request.getAuthenticatedUser() != null
&& !request.getAuthenticatedUser().isSuperuser()
&& request.getSourceAddress() != null
&& request.getAuthenticatedUser().getUserIdentifier().equalsIgnoreCase(user.getUserIdentifier())) {
IpAddress ip = request.getSourceAddress();
if (ip instanceof IPv4Address) {
IPv4Address ipv4 = (IPv4Address) ip;
ipRangeSQL = ipv4.toBigInteger() + " BETWEEN ipv4range.bottomaslong AND ipv4range.topaslong";
} else if (ip instanceof IPv6Address) {
IPv6Address ipv6 = (IPv6Address) ip;
long[] vals = ipv6.toLongArray();
if (vals.length == 4) {
ipRangeSQL = """
(@0 BETWEEN ipv6range.bottoma AND ipv6range.topa
AND @1 BETWEEN ipv6range.bottomb AND ipv6range.topb
AND @2 BETWEEN ipv6range.bottomc AND ipv6range.topc
AND @3 BETWEEN ipv6range.bottomd AND ipv6range.topd)
""";
for (int i = 0; i < vals.length; i++) {
ipRangeSQL = ipRangeSQL.replace("@" + i, String.valueOf(vals[i]));
}
}
}
var sqlCode = getBaseQueryForAllPermittedDataverses(request, user, permissionBit);
if (searchTerm == null || searchTerm.isEmpty()) {
return em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
} else if (user.isSuperuser()) {
Query query = em.createNativeQuery(sqlCode.concat(WHERE).concat(SEARCH_PARAMS), Dataverse.class);
setSearchParamValues(searchTerm, query);
return query.getResultList();
}
String sqlCode;
if (user.isSuperuser()) {
sqlCode = LIST_ALL_DATAVERSES_SUPERUSER_HAS_PERMISSION;

if (searchTerm == null || searchTerm.isEmpty()) {
return em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
} else {
sqlCode = LIST_ALL_DATAVERSES_SUPERUSER_HAS_PERMISSION.concat(WHERE).concat(SEARCH_PARAMS);
else {
Query query = em.createNativeQuery(sqlCode.concat(AND).concat(SEARCH_PARAMS), Dataverse.class);
setSearchParamValues(searchTerm, query);
return query.getResultList();
}
}
return null;
}
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm puzzled how to assemble the URL for testing linkingDataverses with the API.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Weird, Intellij does not blame me for the code inside getIpRange and setSearchParamValues but github does blame me.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The following command looks more like the intellij result

 git blame -w -M -C --minimal -L 954,1040 PermissionServiceBean.java


String pattern = searchTerm.toLowerCase();
String pattern1 = pattern + "%";
String pattern2 = "% " + pattern + "%";
public boolean hasMultiplePermittedCollections(DataverseRequest request, AuthenticatedUser user, int permissionBit) {
if (user != null) {
var sqlCode = getBaseQueryForAllPermittedDataverses(request, user, permissionBit) + " LIMIT 2";
var resultList = em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
return resultList.size() > 1;
}
return false;
}

// Adjust the queries for very short, 1
if (pattern.length() == 1) {
pattern1 = pattern;
pattern2 = pattern + " %";
}
Query query = em.createNativeQuery(sqlCode, Dataverse.class);
query.setParameter(1, "%dataverse");
query.setParameter(2, pattern1);
query.setParameter(3, pattern2);
query.setParameter(4, "%dataverse");
query.setParameter(5, pattern1);
query.setParameter(6, pattern2);
return query.getResultList();
private String getBaseQueryForAllPermittedDataverses(DataverseRequest request, AuthenticatedUser user, int permissionBit) {
if (user.isSuperuser()) {
return LIST_ALL_DATAVERSES_SUPERUSER_HAS_PERMISSION;
} else {
return LIST_ALL_DATAVERSES_USER_HAS_PERMISSION
.replace("@USERID", String.valueOf(user.getId()))
.replace("@PERMISSIONBIT", String.valueOf(permissionBit))
.replace("@IPRANGESQL", getIpRange(request, user));
}
}

}
} else {
if (searchTerm == null || searchTerm.isEmpty()) {
sqlCode = LIST_ALL_DATAVERSES_USER_HAS_PERMISSION
.replace("@USERID", String.valueOf(user.getId()))
.replace("@PERMISSIONBIT", String.valueOf(permissionBit))
.replace("@IPRANGESQL", ipRangeSQL);
return em.createNativeQuery(sqlCode, Dataverse.class).getResultList();
} else {
String pattern = searchTerm.toLowerCase();
String pattern1 = pattern + "%";
String pattern2 = "% " + pattern + "%";

// Adjust the queries for very short, 1
if (pattern.length() == 1) {
pattern1 = pattern;
pattern2 = pattern + " %";
private String getIpRange(DataverseRequest request, AuthenticatedUser user) {
// IP Group - Only check IP if a User is calling for themself
String ipRangeSQL = "FALSE";
if (request != null
&& request.getAuthenticatedUser() != null
&& !request.getAuthenticatedUser().isSuperuser()
&& request.getSourceAddress() != null
&& request.getAuthenticatedUser().getUserIdentifier().equalsIgnoreCase(user.getUserIdentifier())) {
IpAddress ip = request.getSourceAddress();
if (ip instanceof IPv4Address) {
IPv4Address ipv4 = (IPv4Address) ip;
ipRangeSQL = ipv4.toBigInteger() + " BETWEEN ipv4range.bottomaslong AND ipv4range.topaslong";
} else if (ip instanceof IPv6Address) {
IPv6Address ipv6 = (IPv6Address) ip;
long[] vals = ipv6.toLongArray();
if (vals.length == 4) {
ipRangeSQL = """
(@0 BETWEEN ipv6range.bottoma AND ipv6range.topa
AND @1 BETWEEN ipv6range.bottomb AND ipv6range.topb
AND @2 BETWEEN ipv6range.bottomc AND ipv6range.topc
AND @3 BETWEEN ipv6range.bottomd AND ipv6range.topd)
""";
for (int i = 0; i < vals.length; i++) {
ipRangeSQL = ipRangeSQL.replace("@" + i, String.valueOf(vals[i]));
}

sqlCode = LIST_ALL_DATAVERSES_USER_HAS_PERMISSION.concat(AND).concat(SEARCH_PARAMS)
.replace("@USERID", String.valueOf(user.getId()))
.replace("@PERMISSIONBIT", String.valueOf(permissionBit))
.replace("@IPRANGESQL", ipRangeSQL);

Query query = em.createNativeQuery(sqlCode, Dataverse.class);
query.setParameter(1, "%dataverse");
query.setParameter(2, pattern1);
query.setParameter(3, pattern2);
query.setParameter(4, "%dataverse");
query.setParameter(5, pattern1);
query.setParameter(6, pattern2);
return query.getResultList();
}
}
}
return null;
return ipRangeSQL;
}

private void setSearchParamValues(String searchTerm, Query query) {
String pattern = searchTerm.toLowerCase();
String pattern1 = pattern + "%";
String pattern2 = "% " + pattern + "%";

// Adjust the queries for very short, 1
if (pattern.length() == 1) {
pattern1 = pattern;
pattern2 = pattern + " %";
}
query.setParameter(1, "%dataverse");
query.setParameter(2, pattern1);
query.setParameter(3, pattern2);
query.setParameter(4, "%dataverse");
query.setParameter(5, pattern1);
query.setParameter(6, pattern2);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/main/webapp/dataset.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -777,7 +777,7 @@
<!-- Create/Edit editMode -->
<ui:fragment rendered="#{DatasetPage.editMode == 'METADATA' or DatasetPage.editMode == 'CREATE'}">
<p:focus context="datasetForm"/>
<div class="form-group">
<div class="form-group" jsf:rendered="#{DatasetPage.hasDataversesToChoose and DatasetPage.editMode == 'CREATE'}">
Comment thread
qqmyers marked this conversation as resolved.
<label jsf:for="#{DatasetPage.editMode == 'CREATE' ? 'selectHostDataverse_input' : 'select_HostDataverse_Static'}" class="col-md-3 control-label">
#{bundle.hostDataverse}
<span class="glyphicon glyphicon-question-sign tooltip-icon"
Expand Down