|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright [2020] [MaxKey of copyright http://www.maxkey.top]
|
|
|
+ * Copyright [2022] [MaxKey of copyright http://www.maxkey.top]
|
|
|
*
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
* you may not use this file except in compliance with the License.
|
|
@@ -19,22 +19,26 @@ package org.maxkey.web.contorller;
|
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.maxkey.authn.jwt.AuthJwtService;
|
|
|
import org.maxkey.configuration.EmailConfig;
|
|
|
+import org.maxkey.entity.ChangePassword;
|
|
|
+import org.maxkey.entity.Message;
|
|
|
import org.maxkey.entity.UserInfo;
|
|
|
import org.maxkey.password.onetimepwd.AbstractOtpAuthn;
|
|
|
import org.maxkey.password.onetimepwd.OtpAuthnService;
|
|
|
-import org.maxkey.persistence.repository.PasswordPolicyValidator;
|
|
|
import org.maxkey.persistence.service.UserInfoService;
|
|
|
-import org.maxkey.web.WebConstants;
|
|
|
-import org.maxkey.web.WebContext;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.stereotype.Controller;
|
|
|
+import org.springframework.web.bind.annotation.ModelAttribute;
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
|
-import org.springframework.web.servlet.ModelAndView;
|
|
|
+import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
|
|
|
@Controller
|
|
|
@RequestMapping(value = { "/forgotpassword" })
|
|
@@ -45,7 +49,7 @@ public class ForgotPasswordContorller {
|
|
|
"^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$");
|
|
|
|
|
|
Pattern mobileRegex = Pattern.compile(
|
|
|
- "^(13[4,5,6,7,8,9]|15[0,8,9,1,7]|188|187)\\\\d{8}$");
|
|
|
+ "^[1][3,4,5,7,8][0-9]{9}$");
|
|
|
|
|
|
@Autowired
|
|
|
EmailConfig emailConfig;
|
|
@@ -64,101 +68,107 @@ public class ForgotPasswordContorller {
|
|
|
}
|
|
|
|
|
|
@Autowired
|
|
|
- private UserInfoService userInfoService;
|
|
|
-
|
|
|
+ AuthJwtService authJwtService;
|
|
|
+
|
|
|
@Autowired
|
|
|
- @Qualifier("mailOtpAuthn")
|
|
|
- protected AbstractOtpAuthn mailOtpAuthn;
|
|
|
+ UserInfoService userInfoService;
|
|
|
|
|
|
@Autowired
|
|
|
@Qualifier("otpAuthnService")
|
|
|
OtpAuthnService otpAuthnService;
|
|
|
|
|
|
-
|
|
|
- @RequestMapping(value = { "/forward" })
|
|
|
- public ModelAndView forwardreg() {
|
|
|
- _logger.debug("forgotpassword /forgotpassword/forward.");
|
|
|
- return new ModelAndView("forgotpassword/findpwd");
|
|
|
- }
|
|
|
-
|
|
|
- @RequestMapping(value = { "/emailmobile" })
|
|
|
- public ModelAndView email(@RequestParam String emailMobile,@RequestParam String captcha) {
|
|
|
- _logger.debug("forgotpassword /forgotpassword/emailmobile.");
|
|
|
- _logger.debug("emailMobile : " + emailMobile);
|
|
|
- int forgotType = ForgotType.NOTFOUND;
|
|
|
- UserInfo userInfo = null;
|
|
|
- if (captcha != null && captcha
|
|
|
- .equals(WebContext.getSession().getAttribute(
|
|
|
- WebConstants.KAPTCHA_SESSION_KEY).toString())) {
|
|
|
- if(mobileRegex.matcher(emailMobile).matches()) {
|
|
|
- forgotType = ForgotType.MOBILE;
|
|
|
- }else if(emailRegex.matcher(emailMobile).matches()) {
|
|
|
- forgotType = ForgotType.EMAIL;
|
|
|
- }else {
|
|
|
- forgotType = ForgotType.EMAIL;
|
|
|
- emailMobile =emailMobile + "@" + emailConfig.getSmtpHost().substring(emailConfig.getSmtpHost().indexOf(".")+1);
|
|
|
- }
|
|
|
-
|
|
|
- userInfo = userInfoService.findByEmailMobile(emailMobile);
|
|
|
-
|
|
|
- if(null != userInfo) {
|
|
|
- if (forgotType == ForgotType.EMAIL ) {
|
|
|
- mailOtpAuthn.produce(userInfo);
|
|
|
- }else if (forgotType == ForgotType.MOBILE) {
|
|
|
- AbstractOtpAuthn smsOtpAuthn = otpAuthnService.getByInstId(userInfo.getInstId());
|
|
|
- smsOtpAuthn.produce(userInfo);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }else {
|
|
|
- _logger.debug("login captcha valid error.");
|
|
|
- forgotType = ForgotType.CAPTCHAERROR;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @ResponseBody
|
|
|
+ @RequestMapping(value = { "/produceOtp" }, produces = {MediaType.APPLICATION_JSON_VALUE})
|
|
|
+ public ResponseEntity<?> produceOtp(
|
|
|
+ @RequestParam String mobile,
|
|
|
+ @RequestParam String state,
|
|
|
+ @RequestParam String captcha) {
|
|
|
+ _logger.debug("forgotpassword /forgotpassword/produceOtp.");
|
|
|
+ _logger.debug(" Mobile {}: " ,mobile);
|
|
|
+ if (!authJwtService.validateCaptcha(state,captcha)) {
|
|
|
+ _logger.debug("login captcha valid error.");
|
|
|
+ return new Message<ChangePassword>(Message.FAIL).buildResponse();
|
|
|
}
|
|
|
|
|
|
- ModelAndView modelAndView = new ModelAndView("forgotpassword/resetpwd");
|
|
|
- modelAndView.addObject("userId", userInfo==null ?"":userInfo.getId());
|
|
|
- modelAndView.addObject("username", userInfo==null ?"":userInfo.getUsername());
|
|
|
- modelAndView.addObject("emailMobile", emailMobile);
|
|
|
- modelAndView.addObject("forgotType", forgotType);
|
|
|
+ ChangePassword change = null;
|
|
|
+ _logger.debug("Mobile Regex matches {}",mobileRegex.matcher(mobile).matches());
|
|
|
+ if(StringUtils.isNotBlank(mobile) && mobileRegex.matcher(mobile).matches()) {
|
|
|
+ UserInfo userInfo = userInfoService.findByEmailMobile(mobile);
|
|
|
+ if(userInfo != null) {
|
|
|
+ change = new ChangePassword(userInfo);
|
|
|
+ change.clearPassword();
|
|
|
+ AbstractOtpAuthn smsOtpAuthn = otpAuthnService.getByInstId(userInfo.getInstId());
|
|
|
+ smsOtpAuthn.produce(userInfo);
|
|
|
+ return new Message<ChangePassword>(change).buildResponse();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return new Message<ChangePassword>(Message.FAIL).buildResponse();
|
|
|
+ }
|
|
|
+
|
|
|
+ @ResponseBody
|
|
|
+ @RequestMapping(value = { "/produceEmailOtp" }, produces = {MediaType.APPLICATION_JSON_VALUE})
|
|
|
+ public ResponseEntity<?> produceEmailOtp(
|
|
|
+ @RequestParam String email,
|
|
|
+ @RequestParam String state,
|
|
|
+ @RequestParam String captcha) {
|
|
|
+ _logger.debug("forgotpassword /forgotpassword/produceEmailOtp.");
|
|
|
+ _logger.debug("Email {} : " , email);
|
|
|
+ if (!authJwtService.validateCaptcha(state,captcha)) {
|
|
|
+ _logger.debug("login captcha valid error.");
|
|
|
+ return new Message<ChangePassword>(Message.FAIL).buildResponse();
|
|
|
+ }
|
|
|
|
|
|
- return modelAndView;
|
|
|
+ ChangePassword change = null;
|
|
|
+ if(StringUtils.isNotBlank(email) && emailRegex.matcher(email).matches()) {
|
|
|
+ UserInfo userInfo = userInfoService.findByEmailMobile(email);
|
|
|
+ if(userInfo != null) {
|
|
|
+ change = new ChangePassword(userInfo);
|
|
|
+ change.clearPassword();
|
|
|
+ AbstractOtpAuthn mailOtpAuthn = otpAuthnService.getMailOtpAuthn(userInfo.getInstId());
|
|
|
+ mailOtpAuthn.produce(userInfo);
|
|
|
+ return new Message<ChangePassword>(change).buildResponse();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new Message<ChangePassword>(Message.FAIL).buildResponse();
|
|
|
}
|
|
|
|
|
|
@RequestMapping(value = { "/setpassword" })
|
|
|
- public ModelAndView setPassWord(
|
|
|
- @RequestParam String userId,
|
|
|
- @RequestParam String username,
|
|
|
- @RequestParam int forgotType,
|
|
|
- @RequestParam String password,
|
|
|
- @RequestParam String confirmpassword,
|
|
|
- @RequestParam String captcha) {
|
|
|
- _logger.debug("forgotPassword /forgotpassword/pwdreseted.");
|
|
|
- ModelAndView modelAndView = new ModelAndView("forgotpassword/pwdreseted");
|
|
|
- if (null != password && password.equals(confirmpassword)) {
|
|
|
- UserInfo userInfo = new UserInfo();
|
|
|
- userInfo.setId(userId);
|
|
|
- userInfo.setUsername(username);
|
|
|
- userInfo.setPassword(password);
|
|
|
- userInfo.setDecipherable(password);
|
|
|
- UserInfo loadedUserInfo = userInfoService.findByUsername(username);
|
|
|
- AbstractOtpAuthn smsOtpAuthn = otpAuthnService.getByInstId(loadedUserInfo.getInstId());
|
|
|
- if ((forgotType == ForgotType.EMAIL && mailOtpAuthn.validate(userInfo, captcha)) ||
|
|
|
- (forgotType == ForgotType.MOBILE && smsOtpAuthn.validate(userInfo, captcha))
|
|
|
- ) {
|
|
|
- /**
|
|
|
- if(userInfoService.changePassword(userInfo,true)) {
|
|
|
- modelAndView.addObject("passwordResetResult", PasswordResetResult.SUCCESS);
|
|
|
- }else {
|
|
|
- ;
|
|
|
- modelAndView.addObject("validate_result", WebContext.getAttribute(PasswordPolicyValidator.PASSWORD_POLICY_VALIDATE_RESULT));
|
|
|
- modelAndView.addObject("passwordResetResult", PasswordResetResult.PASSWORDERROR);
|
|
|
- }*/
|
|
|
- } else {
|
|
|
- modelAndView.addObject("passwordResetResult", PasswordResetResult.CAPTCHAERROR);
|
|
|
- }
|
|
|
- } else {
|
|
|
- modelAndView.addObject("passwordResetResult", PasswordResetResult.PASSWORDERROR);
|
|
|
+ public ResponseEntity<?> setPassWord(
|
|
|
+ @ModelAttribute ChangePassword changePassword,
|
|
|
+ @RequestParam String forgotType,
|
|
|
+ @RequestParam String otpCaptcha,
|
|
|
+ @RequestParam String state) {
|
|
|
+ _logger.debug("forgotPassword /forgotpassword/setpassword.");
|
|
|
+ if (StringUtils.isNotBlank(changePassword.getPassword() )
|
|
|
+ && changePassword.getPassword().equals(changePassword.getConfirmPassword())) {
|
|
|
+ UserInfo loadedUserInfo = userInfoService.get(changePassword.getUserId());
|
|
|
+ if(loadedUserInfo != null) {
|
|
|
+ AbstractOtpAuthn smsOtpAuthn = otpAuthnService.getByInstId(loadedUserInfo.getInstId());
|
|
|
+ AbstractOtpAuthn mailOtpAuthn = otpAuthnService.getMailOtpAuthn(loadedUserInfo.getInstId());
|
|
|
+ if (
|
|
|
+ (forgotType.equalsIgnoreCase("email")
|
|
|
+ && mailOtpAuthn !=null
|
|
|
+ && mailOtpAuthn.validate(loadedUserInfo, otpCaptcha))
|
|
|
+ ||
|
|
|
+ (forgotType.equalsIgnoreCase("mobile")
|
|
|
+ && smsOtpAuthn !=null
|
|
|
+ && smsOtpAuthn.validate(loadedUserInfo, otpCaptcha))
|
|
|
+ ) {
|
|
|
+
|
|
|
+ if(userInfoService.changePassword(changePassword,true)) {
|
|
|
+ return new Message<ChangePassword>(Message.SUCCESS).buildResponse();
|
|
|
+ }else {
|
|
|
+ return new Message<ChangePassword>(Message.FAIL).buildResponse();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return new Message<ChangePassword>(Message.FAIL).buildResponse();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- return modelAndView;
|
|
|
+ return new Message<ChangePassword>(Message.FAIL).buildResponse();
|
|
|
}
|
|
|
}
|