Skip to content

Commit

Permalink
#5514 update authenticated user to surviving account
Browse files Browse the repository at this point in the history
  • Loading branch information
sekmiller committed Feb 27, 2019
1 parent 07beafc commit 0b11059
Show file tree
Hide file tree
Showing 13 changed files with 139 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.authorization.AccessRequest;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter;
import edu.harvard.iq.dataverse.harvest.client.HarvestingClient;
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/edu/harvard/iq/dataverse/DatasetLock.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,12 @@
*/
@Entity
@Table(indexes = {@Index(columnList="user_id"), @Index(columnList="dataset_id")})
@NamedQueries(
@NamedQuery(name="DatasetLock.getLocksByDatasetId",
query="SELECT lock FROM DatasetLock lock WHERE lock.dataset.id=:datasetId")
@NamedQueries({
@NamedQuery(name = "DatasetLock.getLocksByDatasetId",
query = "SELECT lock FROM DatasetLock lock WHERE lock.dataset.id=:datasetId"),
@NamedQuery(name = "DatasetLock.getLocksByAuthenticatedUserId",
query = "SELECT lock FROM DatasetLock lock WHERE lock.authenticatedUser.id=:authenticatedUserId")
}
)
public class DatasetLock implements Serializable {

Expand Down
11 changes: 11 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,17 @@ public boolean checkDatasetLock(Long datasetId) {
return lock.size()>0;
}

public List<DatasetLock> getDatasetLocksByUser( AuthenticatedUser user) {

TypedQuery<DatasetLock> query = em.createNamedQuery("DatasetLock.getLocksByAuthenticatedUserId", DatasetLock.class);
query.setParameter("authenticatedUserId", user.getId());
try {
return query.getResultList();
} catch (javax.persistence.NoResultException e) {
return null;
}
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public DatasetLock addDatasetLock(Dataset dataset, DatasetLock lock) {
lock.setDataset(dataset);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,15 @@ public String getContributorsNames(DatasetVersion version) {
}
}
return contNames;
}
}

public List<DatasetVersionUser> getDatasetVersionUsersByAuthenticatedUser(AuthenticatedUser user){

TypedQuery<DatasetVersionUser> typedQuery = em.createQuery("SELECT u from DatasetVersionUser u where u.authenticatedUser.id = :authenticatedUserId r", DatasetVersionUser.class);
typedQuery.setParameter("authenticatedUserId", user.getId());
return typedQuery.getResultList();

}

/**
* Query to return the last Released DatasetVersion by Persistent ID
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/edu/harvard/iq/dataverse/DvObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
@NamedQuery(name = "DvObject.findByProtocolIdentifierAuthority",
query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol"),
@NamedQuery(name = "DvObject.findByOwnerId",
query = "SELECT o FROM DvObject o WHERE o.owner.id=:ownerId")
query = "SELECT o FROM DvObject o WHERE o.owner.id=:ownerId"),
@NamedQuery(name = "DvObject.findByAuthenticatedUserId",
query = "SELECT o FROM DvObject o WHERE o.creator.id=:ownerId or o.releaseUser.id=:releaseUserId")
})
@Entity
// Inheritance strategy "JOINED" will create 4 db tables -
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
Expand Down Expand Up @@ -64,6 +65,13 @@ public List<DvObject> findAll() {
public List<DvObject> findByOwnerId(Long ownerId) {
return em.createNamedQuery("DvObject.findByOwnerId").setParameter("ownerId", ownerId).getResultList();
}

public List<DvObject> findByAuthenticatedUserId(AuthenticatedUser user) {
Query query = em.createNamedQuery("DvObject.findByAuthenticatedUserId");
query.setParameter("ownerId", user.getId());
query.setParameter("releaseUser", user.getId());
return query.getResultList();
}

// FIXME This type-by-string has to go, in favor of passing a class parameter.
public DvObject findByGlobalId(String globalIdString, String typeString) {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
@Index(columnList = "datafile_id"),
@Index(columnList = "dataset_id")
})
@NamedQueries(
@NamedQuery(name = "GuestbookResponse.getGuestbookResponseByAuthenticatedUserId",
query = "SELECT gbr FROM GuestbookResponse gbr WHERE gbr.authenticatedUser.id=:authenticatedUserId")
)
public class GuestbookResponse implements Serializable {
private static final long serialVersionUID = 1L;
@Id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -941,4 +941,10 @@ public Long getCountOfAllGuestbookResponses() {
return (Long) query.getSingleResult();
}

public List<GuestbookResponse> findByAuthenticatedUserId(AuthenticatedUser user) {
Query query = em.createNamedQuery("GuestbookResponse.findByAuthenticatedUserId");
query.setParameter("authenticatedUser", user.getId());
return query.getResultList();
}

}
13 changes: 8 additions & 5 deletions src/main/java/edu/harvard/iq/dataverse/api/Admin.java
Original file line number Diff line number Diff line change
Expand Up @@ -316,15 +316,18 @@ public Response deleteAuthenticatedUser(@PathParam("identifier") String identifi
@PUT
@Path("authenticatedUsers/mergeIntoUser/{identifier}")
public Response mergeInAuthenticatedUser(@PathParam("identifier") String baseIdentifier, String consumedIdentifier) {

//TODO: Confirm the baseIdentifier is real before doing command...

if(null == baseIdentifier || baseIdentifier.isEmpty()) {
return error(Response.Status.BAD_REQUEST, "Base identifier provided to change is empty.");
} else if(null == consumedIdentifier || consumedIdentifier.isEmpty()) {
return error(Response.Status.BAD_REQUEST, "Identifier to merge in is empty.");
}


AuthenticatedUser baseAuthenticatedUser = authSvc.getAuthenticatedUser(baseIdentifier);
if (baseAuthenticatedUser == null) {
return error(Response.Status.BAD_REQUEST, "User " + baseIdentifier + " not found in AuthenticatedUser");
}

AuthenticatedUser consumedAuthenticatedUser = authSvc.getAuthenticatedUser(consumedIdentifier);
if (consumedAuthenticatedUser == null) {
return error(Response.Status.BAD_REQUEST, "User " + consumedIdentifier + " not found in AuthenticatedUser");
Expand All @@ -339,12 +342,12 @@ public Response mergeInAuthenticatedUser(@PathParam("identifier") String baseIde
List<RoleAssignment> consumedRAList = roleAssigneeSvc.getAssignmentsFor("@" + consumedIdentifier); //only AuthenticatedUser supported

try {
execCommand(new MergeInAccountCommand(createDataverseRequest(consumedAuthenticatedUser), baseIdentifier, consumedIdentifier, consumedAuthenticatedUser, consumedBuiltinUser, baseRAList, consumedRAList));
execCommand(new MergeInAccountCommand(createDataverseRequest(consumedAuthenticatedUser), baseIdentifier, consumedIdentifier, consumedAuthenticatedUser, consumedBuiltinUser, baseAuthenticatedUser, baseRAList, consumedRAList));
} catch (Exception e){
return error(Response.Status.BAD_REQUEST, "Error calling ChangeUserIdentifierCommand: " + e.getLocalizedMessage());
}

return ok("CHANGEME");
return ok("Role Assignements for " + consumedIdentifier + " have been merged into " + baseIdentifier + ".");
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import edu.harvard.iq.dataverse.passwordreset.PasswordResetServiceBean;
import edu.harvard.iq.dataverse.util.BundleUtil;
import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean;
import edu.harvard.iq.dataverse.workflows.WorkflowComment;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Calendar;
Expand All @@ -52,6 +53,7 @@
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
Expand Down Expand Up @@ -871,5 +873,11 @@ public List<String> getAuthenticationProviderIdsSorted() {
google.getId()
);
}

public List <WorkflowComment> getWorkflowCommentsByAuthenticatedUser(AuthenticatedUser user){
Query query = em.createQuery("SELECT wc FROM WorkflowComment wc WHERE wc.authenticatedUser.id = :auid");
query.setParameter(":auid", user.getId());
return query.getResultList();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@
*/
package edu.harvard.iq.dataverse.engine.command.impl;

import edu.harvard.iq.dataverse.Dataverse;
import edu.harvard.iq.dataverse.DatasetLock;
import edu.harvard.iq.dataverse.DatasetVersionUser;
import edu.harvard.iq.dataverse.DvObject;
import edu.harvard.iq.dataverse.GuestbookResponse;
import edu.harvard.iq.dataverse.RoleAssignment;
import edu.harvard.iq.dataverse.UserNotification;
import edu.harvard.iq.dataverse.authorization.AuthenticatedUserLookup;
import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
Expand All @@ -18,6 +21,8 @@
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch;
import edu.harvard.iq.dataverse.workflows.WorkflowComment;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -35,14 +40,16 @@
public class MergeInAccountCommand extends AbstractVoidCommand {
final AuthenticatedUser consumedAU;
final BuiltinUser consumedBU;
final AuthenticatedUser ongoingAU;
final String baseIdentifier;
final String consumedIdentifier;
final List<RoleAssignment> baseRAList;
final List<RoleAssignment> consumedRAList;

private static final Logger logger = Logger.getLogger(MergeInAccountCommand.class.getCanonicalName());

public MergeInAccountCommand(DataverseRequest createDataverseRequest, String baseIdentifier, String consumedIdentifier, AuthenticatedUser consumedAuthenticatedUser, BuiltinUser consumedBuiltinUser, List<RoleAssignment> baseRAList, List<RoleAssignment> consumedRAList) {
public MergeInAccountCommand(DataverseRequest createDataverseRequest, String baseIdentifier, String consumedIdentifier, AuthenticatedUser consumedAuthenticatedUser,
BuiltinUser consumedBuiltinUser, AuthenticatedUser ongoingAU, List<RoleAssignment> baseRAList, List<RoleAssignment> consumedRAList) {
super(
createDataverseRequest,
(DvObject) null
Expand All @@ -53,6 +60,7 @@ public MergeInAccountCommand(DataverseRequest createDataverseRequest, String bas
this.consumedRAList = consumedRAList;
this.baseIdentifier = baseIdentifier;
this.consumedIdentifier = consumedIdentifier;
this.ongoingAU = ongoingAU;
}

@Override
Expand Down Expand Up @@ -85,6 +93,56 @@ protected void executeImpl(CommandContext ctxt) throws CommandException {
.executeUpdate();
logger.log(Level.INFO, "Number of roles deleted : ({0})", resultCount);

// DatasetVersionUser
for (DatasetVersionUser user : ctxt.datasetVersion().getDatasetVersionUsersByAuthenticatedUser(consumedAU)) {
user.setAuthenticatedUser(ongoingAU);
ctxt.em().merge(user);
}

//DatasetLocks
for (DatasetLock lock : ctxt.datasets().getDatasetLocksByUser(consumedAU)) {
lock.setUser(ongoingAU);
ctxt.em().merge(lock);
}

//DVObjects creator and release
for (DvObject dvo : ctxt.dvObjects().findByAuthenticatedUserId(consumedAU)) {
if (dvo.getCreator().equals(consumedAU)){
dvo.setCreator(ongoingAU);
}
if (dvo.getReleaseUser().equals(consumedAU)){
dvo.setReleaseUser(ongoingAU);
}
ctxt.em().merge(dvo);
}

//GuestbookResponse
for (GuestbookResponse gbr : ctxt.responses().findByAuthenticatedUserId(consumedAU)) {
gbr.setAuthenticatedUser(ongoingAU);
ctxt.em().merge(gbr);
}

//UserNotification
for (UserNotification note : ctxt.notifications().findByUser(consumedAU.getId())) {
note.setUser(ongoingAU);
ctxt.em().merge(note);
}

//SavedSearch
for (SavedSearch search : ctxt.savedSearches().findByAuthenticatedUser(consumedAU)) {
search.setCreator(ongoingAU);
ctxt.em().merge(search);
}

//Workflow Comments
for (WorkflowComment wc : ctxt.authentication().getWorkflowCommentsByAuthenticatedUser(consumedAU)) {
wc.setAuthenticatedUser(ongoingAU);
ctxt.em().merge(wc);
}

//Access Request is not an entity. May have to update via sql?


//TODO: Change id or delete all the objects with foreign keys connected to the old identifier.
//Refer to the script in /scripts/migration/scrub_duplicate_emails.sql
//Those this may be doable via adding the objects to be altered in java and using cascade.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import edu.harvard.iq.dataverse.DvObject;
import edu.harvard.iq.dataverse.DvObjectServiceBean;
import edu.harvard.iq.dataverse.EjbDataverseEngine;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
import edu.harvard.iq.dataverse.search.SearchServiceBean;
import edu.harvard.iq.dataverse.search.SolrQueryResponse;
Expand Down Expand Up @@ -66,6 +67,16 @@ public SavedSearch find(long id) {
return null;
}
}

public List<SavedSearch> findByAuthenticatedUser(AuthenticatedUser user) {
TypedQuery<SavedSearch> typedQuery = em.createQuery("SELECT OBJECT(o) FROM SavedSearch AS o WHERE o.creator.id = :id", SavedSearch.class);
typedQuery.setParameter("id", user.getId());
try {
return typedQuery.getResultList();
} catch (NoResultException | NonUniqueResultException ex) {
return null;
}
}

public List<SavedSearch> findAll() {
TypedQuery<SavedSearch> typedQuery = em.createQuery("SELECT OBJECT(o) FROM SavedSearch AS o ORDER BY o.id", SavedSearch.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ public String getMessage() {
public AuthenticatedUser getAuthenticatedUser() {
return authenticatedUser;
}

public void setAuthenticatedUser(AuthenticatedUser authenticatedUser){
this.authenticatedUser = authenticatedUser;
}

public Timestamp getCreated() {
return created;
Expand Down

0 comments on commit 0b11059

Please sign in to comment.