package io.loli.box.controller; import io.loli.box.AdminProperties; import io.loli.box.exception.UserExistsException; import io.loli.box.service.InvitationCodeService; import io.loli.box.service.impl.UserService; import io.loli.box.entity.Role; import io.loli.box.entity.User; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.validation.Valid; import javax.validation.constraints.NotNull; /** * @author choco */ @Controller public class LoginController { @Autowired private UserService userService; @Autowired private PasswordEncoder passwordEncoder; @Autowired private InvitationCodeService invitationCodeService; @Autowired private AdminProperties adminProperties; @RequestMapping("/signin") public String signin(Model model) { return "signin"; } @RequestMapping(value = "/signup", method = RequestMethod.GET) public String signup(RegisterDto registerDto) { return "signup"; } @RequestMapping(value = "/signup", method = RequestMethod.POST) public String signupSubmit(@Valid RegisterDto registerDto, BindingResult bindingResult, RedirectAttributes redirectAttrs, Model model) { if (bindingResult.hasErrors()) { return signup(registerDto); } if (adminProperties.isSignupInvitation()) { // validate invitation code try { if (!invitationCodeService.verify(registerDto.getEmail(), registerDto.getInvitationCode())) { bindingResult.rejectValue("invitationCode", "invitationCode.error"); return signup(registerDto); } } catch (Exception e) { bindingResult.rejectValue("invitationCode", "invitationCode.error"); return signup(registerDto); } } User registered = new User(); registered.setRole(Role.ROLE_USER); registered.setEmail(registerDto.getEmail()); registered.setUserName(registerDto.getUserName()); registered.setPassword(passwordEncoder.encode(registerDto.getPassword())); try { userService.registerNewUser(registered); } catch (UserExistsException e) { bindingResult.rejectValue("email", e.getMessage()); return signup(registerDto); } redirectAttrs.addAttribute("messages", "signup.success"); return "redirect:signin"; } } class RegisterDto { @NotEmpty @NotNull private String userName; @NotEmpty @Length(min = 6, max = 32) @NotNull private String password; @NotEmpty @NotNull @Email private String email; private String invitationCode; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getInvitationCode() { return invitationCode; } public void setInvitationCode(String invitationCode) { this.invitationCode = invitationCode; } }