package action; import com.opensymphony.xwork2.ActionSupport; import org.apache.commons.mail.EmailException; import org.apache.struts2.ServletActionContext; import pojo.Register; import pojo.SiteUser; import service.SiteUserService; import util.EmailUtil; import util.MD5Util; import util.captcha.reCaptcha.ValidatereCaptchaUtil; import javax.servlet.http.HttpServletRequest; import java.io.Serializable; import java.sql.Timestamp; import java.util.Date; /** * User: yumingzhe * Date: 5/19/12 * Time: 11:11 PM */ public class RegisterAction extends ActionSupport { private String username; private String password; private String repassword; private String email; private String instituteId; private String recaptcha_challenge_field; private String recaptcha_response_field; private SiteUserService siteUserService; public SiteUserService getSiteUserService() { return siteUserService; } public void setSiteUserService(SiteUserService siteUserService) { this.siteUserService = siteUserService; } public String getRepassword() { return repassword; } public void setRepassword(String repassword) { this.repassword = repassword; } public String getInstituteId() { return instituteId; } public void setInstituteId(String instituteId) { this.instituteId = instituteId; } public String getRecaptcha_challenge_field() { return recaptcha_challenge_field; } public void setRecaptcha_challenge_field(String recaptcha_challenge_field) { this.recaptcha_challenge_field = recaptcha_challenge_field; } public String getRecaptcha_response_field() { return recaptcha_response_field; } public void setRecaptcha_response_field(String recaptcha_response_field) { this.recaptcha_response_field = recaptcha_response_field; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public void validate() { if (this.username == null) this.addFieldError(username, "you must enter username"); if (this.password == null) this.addFieldError(password, "you must set a password"); if (this.repassword == null) this.addFieldError(repassword, "you must input confirm password"); if (this.password != null && this.repassword != null) { if (!this.password.equals(this.repassword)) this.addFieldError(repassword, "confirm password is different from original password"); } //TODO: determine whether the instituteId is consist of number(0~9) and length is 10 if (!this.email.contains("@")) this.addFieldError(email, "Invalid email formatl"); //validate reCaptcha /* if (!ValidatereCaptchaUtil.validateCaptcha(recaptcha_challenge_field, recaptcha_response_field, ServletActionContext.getRequest().getRemoteAddr())) this.addFieldError(recaptcha_challenge_field, "captcha invalid");*/ } @Override public String execute() throws Exception { SiteUser user = siteUserService.getSiteUserByEmail(this.email); String secret = MD5Util.generateArbitraryString(32); if (user != null) { if (!user.getActive()) {//current user has not activated by email String registerEmailTTL = (String) ServletActionContext.getServletContext().getAttribute("registerEmailTTL"); if (registerEmailTTL == null) //default register email must be validated in 24 hours registerEmailTTL = "24"; int ttl = Integer.parseInt(registerEmailTTL); //register email timeout if (user.getRegister().getRegisterTime().before(new Timestamp(new Date().getTime() - ttl * 1000 * 60 * 60))) { String msg = "你好 " + "'" + username + "'" + ",\n" + "\n" + "你请求在researchzilla网站获取账号,并指定此邮箱地址 (" + this.email + ") 为你的联系地址。\n" + "\n" + "如果你没有发过该请求,请忽视本邮件。输入你邮箱地址者的IP地址为" + ServletActionContext.getRequest().getRemoteAddr() + "。请勿回复本邮件。\n" + "\n" + "如果你的确发过该请求,请点击以下链接来通过验证: \n" + "http://localhost/confirm?uid=" + user.getUid() + "&secret=" + secret + "\n" + "\n" + "在通过验证后,你就可以使用新账号了。\n" + "\n" + "如果你在" + ttl + "小时内没有通过验证,你的账号将被删除。\n" + "\n"; EmailUtil.sendEmail("smtp.gmail.com", 465, "yumingzhe.pt@gmail.com", "YMZ7565092", "admin@researchzilla", "researchzilla 网站用户注册验证‏", msg, this.email); return SUCCESS; } //user has registered, but has not activated his account return "resource"; } else { this.addActionError("You have registered an account with this email"); return INPUT; } } user = siteUserService.getSiteUserByInstituteId(this.instituteId); if (user != null) { this.addActionError("You have registered an account with this instituteId"); return INPUT; } Boolean enableEmailActivate = (Boolean) ServletActionContext.getContext().getApplication().get("enableEmailActivate"); if (enableEmailActivate == null)//by default, after registeration user must activate their account by email enableEmailActivate = true; SiteUser siteUser = new SiteUser(); siteUser.setBanned(false); siteUser.setUsername(username); siteUser.setEmail(email); siteUser.setInstituteId(this.instituteId); String salt = MD5Util.generateArbitraryString(8); siteUser.setPassword(MD5Util.hashString(password + salt)); siteUser.setSalt(salt); siteUser.setActive(false); if (enableEmailActivate) { Register register = new Register(); register.setRegisterSequence(secret); register.setRegisterTime(new Timestamp(new Date().getTime())); siteUser.setRegister(register); register.setSiteUser(siteUser); } Serializable id = siteUserService.saveSiteUser(siteUser); try { EmailUtil.sendActivateEmailString("smtp.gmail.com", 465, "yumingzhe.pt@gmail.com", "YMZ7565092", username, "admin@researchzilla", "researchzilla 网站用户注册验证", email, ServletActionContext.getRequest().getRemoteAddr(), id, secret, 24); } catch (EmailException e) { this.addActionError("Send activate email exception, please contact administrator to activate your account"); return ERROR; } return SUCCESS; } }