Skip to content

Commit d49a5f2

Browse files
authored
Merge pull request #7007 from ORCID/9120-qa-sign-in-with-deactivated-orcid-id
feature: Update claim and reactivate methods to receive orcid and send email to associated email
2 parents fa9dd3e + 997b708 commit d49a5f2

3 files changed

Lines changed: 76 additions & 31 deletions

File tree

orcid-web/src/main/java/org/orcid/frontend/web/controllers/ClaimController.java

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
import java.util.Locale;
77

88
import javax.annotation.Resource;
9+
import javax.persistence.NoResultException;
910
import javax.servlet.http.HttpServletRequest;
1011
import javax.servlet.http.HttpServletResponse;
1112

1213
import org.apache.commons.codec.binary.Base64;
14+
import org.apache.jena.sparql.function.library.e;
1315
import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
1416
import org.orcid.core.exception.OrcidBadRequestException;
1517
import org.orcid.core.manager.EncryptionManager;
@@ -27,6 +29,7 @@
2729
import org.slf4j.Logger;
2830
import org.slf4j.LoggerFactory;
2931
import org.springframework.beans.factory.annotation.Value;
32+
import org.springframework.http.ResponseEntity;
3033
import org.springframework.security.authentication.AuthenticationManager;
3134
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
3235
import org.springframework.security.core.Authentication;
@@ -201,23 +204,35 @@ public ModelAndView viewResendClaimEmail(@RequestParam(value = "email", required
201204
String email = resendClaimRequest.getEmail();
202205
List<String> errors = new ArrayList<>();
203206
resendClaimRequest.setErrors(errors);
204-
205-
if (!OrcidStringUtils.isEmailValid(email)) {
206-
errors.add(getMessage("Email.resetPasswordForm.invalidEmail"));
207-
return resendClaimRequest;
208-
}
209207

210-
if (!emailManager.emailExists(email)) {
211-
String message = getMessage("orcid.frontend.reset.password.email_not_found_1") + " " + email + " " + getMessage("orcid.frontend.reset.password.email_not_found_2");
212-
message += "<a href=\"https://support.orcid.org/\">";
213-
message += getMessage("orcid.frontend.reset.password.email_not_found_3");
214-
message += "</a>";
215-
message += getMessage("orcid.frontend.reset.password.email_not_found_4");
216-
errors.add(message);
217-
return resendClaimRequest;
208+
String orcid = null;
209+
if (OrcidStringUtils.isValidOrcid(email)) {
210+
try{
211+
orcid = email;
212+
email = emailManager.findPrimaryEmail(orcid).getEmail();
213+
} catch(NoResultException nre) {
214+
errors.add(getMessage("Email.resetPasswordForm.error"));
215+
return resendClaimRequest;
216+
}
217+
} else {
218+
if (!OrcidStringUtils.isEmailValid(email)) {
219+
errors.add(getMessage("Email.resetPasswordForm.invalidEmail"));
220+
return resendClaimRequest;
221+
}
222+
223+
if (!emailManager.emailExists(email)) {
224+
String message = getMessage("orcid.frontend.reset.password.email_not_found_1") + " " + email + " " + getMessage("orcid.frontend.reset.password.email_not_found_2");
225+
message += "<a href=\"https://support.orcid.org/\">";
226+
message += getMessage("orcid.frontend.reset.password.email_not_found_3");
227+
message += "</a>";
228+
message += getMessage("orcid.frontend.reset.password.email_not_found_4");
229+
errors.add(message);
230+
return resendClaimRequest;
231+
}
232+
233+
orcid = emailManager.findOrcidIdByEmail(email);
218234
}
219-
220-
String orcid = emailManager.findOrcidIdByEmail(email);
235+
221236
ProfileEntity profile = profileEntityCacheManager.retrieve(orcid);
222237

223238
if (profile != null && profile.getClaimed()) {

orcid-web/src/main/java/org/orcid/frontend/web/controllers/PasswordResetController.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.orcid.frontend.spring.web.social.config.SocialSignInUtils;
3333
import org.orcid.frontend.web.forms.OneTimeResetPasswordForm;
3434
import org.orcid.frontend.web.util.CommonPasswords;
35+
import org.orcid.jaxb.model.v3.release.record.Email;
3536
import org.orcid.jaxb.model.v3.release.record.Emails;
3637
import org.orcid.persistence.jpa.entities.ProfileEntity;
3738
import org.orcid.pojo.EmailRequest;
@@ -343,24 +344,37 @@ private boolean isTokenExpired(PasswordResetToken passwordResetToken) {
343344
}
344345

345346
@RequestMapping(value = "/sendReactivation.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON)
346-
public ResponseEntity<?> sendReactivation(@RequestParam("email") String email) throws UnsupportedEncodingException {
347+
public ResponseEntity<?> sendReactivation(@RequestParam(name="email", required=false) String email, @RequestParam(name="orcid", required=false) String orcid) throws UnsupportedEncodingException {
347348

348-
if (!email.contains("@")) {
349-
email = URLDecoder.decode(email, "UTF-8");
350-
}
351-
352-
email = OrcidStringUtils.filterEmailAddress(email);
353-
String orcid = null;
354-
355-
if (!validateEmailAddress(email)) {
356-
String error = getMessage("Email.personalInfoForm.email");
357-
return ResponseEntity.ok("{\"sent\":false, \"error\":\"" + error + "\"}");
349+
if (email != null) {
350+
if (!email.contains("@")) {
351+
email = URLDecoder.decode(email, "UTF-8");
352+
}
353+
354+
email = OrcidStringUtils.filterEmailAddress(email);
355+
356+
if (!validateEmailAddress(email)) {
357+
String error = getMessage("Email.personalInfoForm.email");
358+
return ResponseEntity.ok("{\"sent\":false, \"error\":\"" + error + "\"}");
359+
} else {
360+
try{
361+
orcid = emailManager.findOrcidIdByEmail(email);
362+
} catch(NoResultException nre) {
363+
String error = getMessage("Email.resendClaim.invalidEmail");
364+
return ResponseEntity.ok("{\"sent\":false, \"error\":\"" + error + "\"}");
365+
}
366+
}
358367
} else {
359-
try{
360-
orcid = emailManager.findOrcidIdByEmail(email);
361-
} catch(NoResultException nre) {
362-
String error = getMessage("Email.resendClaim.invalidEmail");
363-
return ResponseEntity.ok("{\"sent\":false, \"error\":\"" + error + "\"}");
368+
if (!OrcidStringUtils.isValidOrcid(orcid)) {
369+
String error = getMessage("Email.resetPasswordForm.error");
370+
return ResponseEntity.ok("{\"sent\":false, \"error\":\"" + error + "\"}");
371+
} else {
372+
try{
373+
email = emailManager.findPrimaryEmail(orcid).getEmail();
374+
} catch(NoResultException nre) {
375+
String error = getMessage("Email.resetPasswordForm.error");
376+
return ResponseEntity.ok("{\"sent\":false, \"error\":\"" + error + "\"}");
377+
}
364378
}
365379
}
366380

orcid-web/src/test/java/org/orcid/frontend/web/controllers/ClaimControllerTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.orcid.frontend.email.RecordEmailSender;
3030
import org.orcid.jaxb.model.common.AvailableLocales;
3131
import org.orcid.jaxb.model.v3.release.common.Visibility;
32+
import org.orcid.jaxb.model.v3.release.record.Email;
3233
import org.orcid.persistence.jpa.entities.ProfileEntity;
3334
import org.orcid.pojo.EmailRequest;
3435
import org.orcid.pojo.ajaxForm.Checkbox;
@@ -96,6 +97,21 @@ public void testResendEmailFailIfTheProfileIsAlreadyClaimed() {
9697
assertFalse(emailRequest.getErrors().isEmpty());
9798
}
9899

100+
@Test
101+
public void testResendClaimEmailByOrcid() {
102+
BindingResult bindingResult = mock(BindingResult.class);
103+
when(bindingResult.hasErrors()).thenReturn(false);
104+
Email email = new Email();
105+
email.setEmail("billie@holiday.com");
106+
when(emailManager.findPrimaryEmail("0000-0000-0000-0000")).thenReturn(email);
107+
when(profileEntityCacheManager.retrieve(Mockito.anyString())).thenReturn(getProfileEntityToTestClaimResend(false));
108+
EmailRequest emailRequest = new EmailRequest();
109+
emailRequest.setEmail("0000-0000-0000-0000");
110+
emailRequest = claimController.resendClaimEmail(emailRequest);
111+
assertNotNull(emailRequest);
112+
assertNotNull(emailRequest.getSuccessMessage());
113+
}
114+
99115
@Test
100116
public void testResendClaimEmail() {
101117
BindingResult bindingResult = mock(BindingResult.class);

0 commit comments

Comments
 (0)