Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,6 @@ protected void createAdministrator(String email, String first, String last,
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setOrganization(organization);
clarinUserRegistration.setConfirmation(true);
clarinUserRegistration.setEmail(eperson.getEmail());
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistrationService.create(context, clarinUserRegistration);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
import org.dspace.authenticate.service.AuthenticationService;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.clarin.ClarinUserRegistration;
import org.dspace.content.factory.ClarinServiceFactory;
import org.dspace.content.service.clarin.ClarinUserRegistrationService;
import org.dspace.core.Context;
import org.dspace.core.LogHelper;
import org.dspace.eperson.EPerson;
Expand Down Expand Up @@ -80,6 +83,8 @@ public class LDAPAuthentication implements AuthenticationMethod {
= EPersonServiceFactory.getInstance().getEPersonService();
protected GroupService groupService
= EPersonServiceFactory.getInstance().getGroupService();
private ClarinUserRegistrationService clarinUserRegistrationService =
ClarinServiceFactory.getInstance().getClarinUserRegistration();
protected ConfigurationService configurationService
= DSpaceServicesFactory.getInstance().getConfigurationService();

Expand Down Expand Up @@ -344,6 +349,12 @@ public int authenticate(Context context,
authenticationService.initEPerson(context, request, eperson);
ePersonService.update(context, eperson);
context.dispatchEvents();
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(
ClarinUserRegistration.UNKNOWN_USER_REGISTRATION);
clarinUserRegistration.setConfirmation(false);
clarinUserRegistrationService.create(context, clarinUserRegistration);
context.setCurrentUser(eperson);
request.setAttribute(LDAP_AUTHENTICATED, true);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
import org.apache.commons.lang3.StringUtils;
import org.dspace.authenticate.oidc.OidcClient;
import org.dspace.authenticate.oidc.model.OidcTokenResponseDTO;
import org.dspace.content.clarin.ClarinUserRegistration;
import org.dspace.content.factory.ClarinServiceFactory;
import org.dspace.content.service.clarin.ClarinUserRegistrationService;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
Expand Down Expand Up @@ -64,6 +67,9 @@ public class OidcAuthenticationBean implements AuthenticationMethod {
@Autowired
private EPersonService ePersonService;

private ClarinUserRegistrationService clarinUserRegistrationService =
ClarinServiceFactory.getInstance().getClarinUserRegistration();

@Override
public boolean allowSetPassword(Context context, HttpServletRequest request, String username) throws SQLException {
return false;
Expand Down Expand Up @@ -221,6 +227,12 @@ private int registerNewEPerson(Context context, Map<String, Object> userInfo, St
context.setCurrentUser(eperson);
context.dispatchEvents();

ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(ClarinUserRegistration.UNKNOWN_USER_REGISTRATION);
clarinUserRegistration.setConfirmation(false);
clarinUserRegistrationService.create(context, clarinUserRegistration);

return SUCCESS;

} catch (Exception ex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.clarin.ClarinUserRegistration;
import org.dspace.content.factory.ClarinServiceFactory;
import org.dspace.content.service.clarin.ClarinUserRegistrationService;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
Expand Down Expand Up @@ -78,6 +81,9 @@ public class OrcidAuthenticationBean implements AuthenticationMethod {
@Autowired
private OrcidTokenService orcidTokenService;

private ClarinUserRegistrationService clarinUserRegistrationService =
ClarinServiceFactory.getInstance().getClarinUserRegistration();

@Override
public int authenticate(Context context, String username, String password, String realm, HttpServletRequest request)
throws SQLException {
Expand Down Expand Up @@ -245,6 +251,12 @@ private int registerNewEPerson(Context context, Person person, OrcidTokenRespons
context.setCurrentUser(eperson);
context.dispatchEvents();

ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(ClarinUserRegistration.UNKNOWN_USER_REGISTRATION);
clarinUserRegistration.setConfirmation(false);
clarinUserRegistrationService.create(context, clarinUserRegistration);

return SUCCESS;

} catch (Exception ex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -771,20 +771,17 @@ protected EPerson registerNewEPerson(Context context, HttpServletRequest request
* Register User in the CLARIN license database
*
*/
// if no email the registration is postponed after entering and confirming mail
if (Objects.nonNull(email)) {
try {
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setConfirmation(true);
clarinUserRegistration.setEmail(email);
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(netid);
clarinUserRegistrationService.create(context, clarinUserRegistration);
eperson.setCanLogIn(false);
ePersonService.update(context, eperson);
} catch (Exception e) {
throw new AuthorizeException("User has not been added among registred users!");
}
try {
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setConfirmation(true);
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(
Objects.nonNull(netid) ? netid : ClarinUserRegistration.UNKNOWN_USER_REGISTRATION);
clarinUserRegistrationService.create(context, clarinUserRegistration);
eperson.setCanLogIn(false);
ePersonService.update(context, eperson);
} catch (Exception e) {
throw new AuthorizeException("User has not been added among registred users!");
}

/* CLARIN */
Expand Down Expand Up @@ -905,6 +902,18 @@ protected void updateEPerson(Context context, HttpServletRequest request, EPerso
}
ePersonService.update(context, eperson);
context.dispatchEvents();

// Sync ClarinUserRegistration organization from the current Shibboleth netid
if (netid != null) {
List<ClarinUserRegistration> registrations =
clarinUserRegistrationService.findByEPersonUUID(context, eperson.getID());
if (!registrations.isEmpty()) {
ClarinUserRegistration reg = registrations.get(0);
reg.setOrganization(netid);
clarinUserRegistrationService.update(context, reg);
}
}

context.restoreAuthSystemState();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
import org.dspace.authenticate.service.AuthenticationService;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.clarin.ClarinUserRegistration;
import org.dspace.content.factory.ClarinServiceFactory;
import org.dspace.content.service.clarin.ClarinUserRegistrationService;
import org.dspace.core.Context;
import org.dspace.core.LogHelper;
import org.dspace.eperson.EPerson;
Expand Down Expand Up @@ -125,6 +128,8 @@ public class X509Authentication implements AuthenticationMethod {
.getAuthenticationService();
protected EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService();
protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService();
private ClarinUserRegistrationService clarinUserRegistrationService =
ClarinServiceFactory.getInstance().getClarinUserRegistration();
protected ConfigurationService configurationService =
DSpaceServicesFactory.getInstance().getConfigurationService();

Expand Down Expand Up @@ -544,6 +549,11 @@ && canSelfRegister(context, request, null)) {
eperson);
ePersonService.update(context, eperson);
context.dispatchEvents();
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(ClarinUserRegistration.UNKNOWN_USER_REGISTRATION);
clarinUserRegistration.setConfirmation(false);
clarinUserRegistrationService.create(context, clarinUserRegistration);
context.restoreAuthSystemState();
context.setCurrentUser(eperson);
request.setAttribute(X509_AUTHENTICATED, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -745,20 +745,17 @@ protected EPerson registerNewEPerson(Context context, HttpServletRequest request
* Register User in the CLARIN license database
*
*/
// if no email the registration is postponed after entering and confirming mail
if (Objects.nonNull(email)) {
try {
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setConfirmation(true);
clarinUserRegistration.setEmail(email);
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(org);
clarinUserRegistrationService.create(context, clarinUserRegistration);
eperson.setCanLogIn(false);
ePersonService.update(context, eperson);
} catch (Exception e) {
throw new AuthorizeException("User has not been added among registred users!") ;
}
try {
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setConfirmation(true);
clarinUserRegistration.setPersonID(eperson.getID());
clarinUserRegistration.setOrganization(
Objects.nonNull(org) ? org : ClarinUserRegistration.UNKNOWN_USER_REGISTRATION);
clarinUserRegistrationService.create(context, clarinUserRegistration);
eperson.setCanLogIn(false);
ePersonService.update(context, eperson);
} catch (Exception e) {
throw new AuthorizeException("User has not been added among registred users!") ;
}

/* CLARIN */
Expand Down Expand Up @@ -901,6 +898,19 @@ protected void updateEPerson(Context context, HttpServletRequest request, EPerso
}
ePersonService.update(context, eperson);
context.dispatchEvents();

// Sync ClarinUserRegistration organization from the current IdP
String currentOrg = shibheaders.get_idp();
if (currentOrg != null) {
List<ClarinUserRegistration> registrations =
clarinUserRegistrationService.findByEPersonUUID(context, eperson.getID());
if (!registrations.isEmpty()) {
ClarinUserRegistration reg = registrations.get(0);
reg.setOrganization(currentOrg);
clarinUserRegistrationService.update(context, reg);
}
}

context.restoreAuthSystemState();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,6 @@ public class ClarinUserRegistration implements ReloadableEntity<Integer> {
@Column(name = "eperson_id")
private UUID ePersonID = null;

@Column(name = "email")
private String email = null;

@Column(name = "organization")
private String organization = null;

Expand Down Expand Up @@ -86,14 +83,6 @@ public Integer getID() {
return id;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getOrganization() {
return organization;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,24 @@ public ClarinUserRegistration create(Context context,
"You must be an admin to create a CLARIN user registration");
}

// Prevent duplicate registrations for the same eperson_id.
// If a registration already exists for this EPerson, update it instead of creating a new one.
UUID epersonId = clarinUserRegistration.getPersonID();
if (Objects.nonNull(epersonId)) {
List<ClarinUserRegistration> existing = clarinUserRegistrationDAO.findByEPersonUUID(context, epersonId);
if (!CollectionUtils.isEmpty(existing)) {
ClarinUserRegistration existingRegistration = existing.get(0);
log.info("ClarinUserRegistration already exists for eperson_id={}. " +
"Updating existing registration (id={}) instead of creating a duplicate.",
epersonId, existingRegistration.getID());
// Update the existing registration with new values
existingRegistration.setOrganization(clarinUserRegistration.getOrganization());
existingRegistration.setConfirmation(clarinUserRegistration.isConfirmation());
clarinUserRegistrationDAO.save(context, existingRegistration);
return existingRegistration;
}
}

return clarinUserRegistrationDAO.create(context, clarinUserRegistration);
}

Expand Down Expand Up @@ -96,9 +114,9 @@ public List<ClarinUserRegistration> findByEPersonUUID(Context context, UUID eper
}

@Override
public List<ClarinUserRegistration> findByEmail(Context context, String email)
public List<ClarinUserRegistration> findByOrganization(Context context, String organization)
throws SQLException {
return clarinUserRegistrationDAO.findByEmail(context, email);
return clarinUserRegistrationDAO.findByOrganization(context, organization);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.content.Site;
import org.dspace.content.clarin.ClarinUserRegistration;
import org.dspace.content.dto.MetadataValueDTO;
import org.dspace.content.factory.ClarinServiceFactory;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.packager.DSpaceAIPIngester;
import org.dspace.content.packager.METSManifest;
Expand All @@ -31,6 +33,7 @@
import org.dspace.content.service.CollectionService;
import org.dspace.content.service.ItemService;
import org.dspace.content.service.SiteService;
import org.dspace.content.service.clarin.ClarinUserRegistrationService;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
Expand Down Expand Up @@ -89,6 +92,8 @@ public class AIPTechMDCrosswalk implements IngestionCrosswalk, DisseminationCros
protected final HandleService handleService = HandleServiceFactory.getInstance().getHandleService();
protected final ConfigurationService configurationService
= DSpaceServicesFactory.getInstance().getConfigurationService();
private final ClarinUserRegistrationService clarinUserRegistrationService =
ClarinServiceFactory.getInstance().getClarinUserRegistration();

/**
* Get XML namespaces of the elements this crosswalk may return.
Expand Down Expand Up @@ -405,6 +410,16 @@ public void ingest(Context context, DSpaceObject dso, List<Element> dimList, boo
sub.setEmail(value);
sub.setCanLogIn(false);
ePersonService.update(context, sub);
ClarinUserRegistration clarinUserRegistration = new ClarinUserRegistration();
clarinUserRegistration.setPersonID(sub.getID());
clarinUserRegistration.setOrganization(
ClarinUserRegistration.UNKNOWN_USER_REGISTRATION);
clarinUserRegistration.setConfirmation(false);
try {
clarinUserRegistrationService.create(context, clarinUserRegistration);
} catch (AuthorizeException e) {
log.warn("Failed to create ClarinUserRegistration for submitter {}", value, e);
}
} else {
log.warn(
"Ignoring unknown Submitter=" + value + " in AIP Tech MD, no matching EPerson" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ public interface ClarinUserRegistrationDAO extends GenericDAO<ClarinUserRegistra

List<ClarinUserRegistration> findByEPersonUUID(Context context, UUID epersonUUID) throws SQLException;

List<ClarinUserRegistration> findByEmail(Context context, String email) throws SQLException;
List<ClarinUserRegistration> findByOrganization(Context context, String organization) throws SQLException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,12 @@ public List<ClarinUserRegistration> findByEPersonUUID(Context context, UUID eper
}

@Override
public List<ClarinUserRegistration> findByEmail(Context context, String email) throws SQLException {
public List<ClarinUserRegistration> findByOrganization(Context context, String organization)
throws SQLException {
Query query = createQuery(context, "SELECT cur FROM ClarinUserRegistration as cur " +
"WHERE cur.email = :email");
"WHERE cur.organization = :organization");

query.setParameter("email", email);
query.setParameter("organization", organization);
query.setHint("org.hibernate.cacheable", Boolean.TRUE);

return list(query);
Expand Down
Loading
Loading