1 package compbio.controllers;
4 import java.util.regex.Pattern;
6 import javax.naming.directory.DirContext;
8 import org.springframework.ldap.core.LdapTemplate;
9 import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.dao.DataIntegrityViolationException;
12 import org.springframework.mail.SimpleMailMessage;
13 import org.springframework.security.ldap.LdapUtils;
14 import org.springframework.ldap.core.ContextSource;
15 import org.springframework.stereotype.Controller;
16 import org.springframework.ui.Model;
17 import org.springframework.ui.ModelMap;
18 import org.springframework.validation.BindingResult;
19 import org.springframework.validation.FieldError;
20 import org.springframework.web.bind.annotation.ModelAttribute;
21 import org.springframework.web.bind.annotation.RequestMapping;
22 import org.springframework.web.bind.annotation.RequestMethod;
23 import org.springframework.web.bind.annotation.RequestParam;
25 import compbio.proteocache.users.User;
26 import compbio.proteocache.users.UserManager;
27 import compbio.cassandra.CassandraUserManager;
30 public class UserController {
33 ContextSource contextSource;
35 // JavaMailSender mailSender;
36 private final Pattern EMAIL = Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
38 @RequestMapping(value = "/register/query", method = RequestMethod.GET)
39 public String RegisterForm(ModelMap model) {
40 User user = new User();
41 model.addAttribute(user);
45 @RequestMapping(value = "/register/edit/query", method = RequestMethod.GET)
46 public String AccountForm(ModelMap model) {
47 User user = new User();
48 user.setFullName("Sasha Sherstnev");
49 user.setEmail("admin@admin.com");
50 user.setOrganisation("UoD");
51 user.setPosition("cleaner");
52 user.setUpdateByEmail(true);
53 model.addAttribute("u", user);
57 @RequestMapping(value = "/register/do", method = RequestMethod.POST)
58 public String addUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
60 if (bindingResult.hasErrors()) {
64 int fullName = user.getFullName().length();
65 if (fullName < 6 || 50 < fullName) {
66 bindingResult.addError(new FieldError("user", "fullName", "Your full name must be between 3 and 50 symbols long!"));
67 model.addAttribute("error", "wrong password");
71 if (!EMAIL.matcher(user.getEmail()).find()) {
72 bindingResult.addError(new FieldError("user", "email", "Email is empty or in a wrong form!"));
73 model.addAttribute("error", "wrong email");
77 int password = user.getPassword().length();
78 if (password < 6 || 20 < password) {
79 bindingResult.addError(new FieldError("user", "password", "The password must be at least 6 symbols long!"));
80 model.addAttribute("error", "wrong password");
85 if (null != user.getOrganisation())
86 organisation = user.getOrganisation().length();
87 if (organisation < 3 || 250 < organisation) {
88 bindingResult.addError(new FieldError("user", "organisation", "The organisation must be between 3 and 250 symbols long!"));
89 model.addAttribute("error", "wrong organisation name");
93 user.setRegistrationDate(new Date());
94 CassandraUserManager cm = new CassandraUserManager();
97 } catch (DataIntegrityViolationException e) {
98 bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
99 model.addAttribute("error", "used email");
102 if (user.isUpdateByEmail()) {
103 subscribeToList(user.getEmail());
106 * Account.autoLogin(user, request, authenticationManager);
108 return "redirect:/index";
111 @RequestMapping(value = "/register/edit/do", method = RequestMethod.POST)
112 public String editUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
114 if (bindingResult.hasErrors()) {
118 user.setRegistrationDate(new Date());
119 UserManager cm = new CassandraUserManager();
122 } catch (DataIntegrityViolationException e) {
123 bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
126 if (user.isUpdateByEmail()) {
127 subscribeToList(user.getEmail());
130 return "redirect:/index";
133 private void subscribeToList(String email) {
134 SimpleMailMessage message = new SimpleMailMessage();
135 message.setFrom(email);
136 message.setTo("proteocache-discuss-subscribe@compbio.dundee.ac.uk");
137 message.setSubject("ProteoCache mailing list subscription");
138 message.setText("testing " + email);
139 // mailSender.send(message);
142 private boolean authenticate(String userDn, String credentials) {
143 DirContext ctx = null;
145 ctx = contextSource.getContext(userDn, credentials);
147 } catch (Exception e) {
148 // Context creation failed - authentication did not succeed
149 System.out.println("LDAP Login failed");
152 // It is imperative that the created DirContext instance is always
154 LdapUtils.closeContext(ctx);
158 @RequestMapping(value = "/ldaplogindo", method = RequestMethod.POST)
159 public String LDAPlogin(Model model, @RequestParam("j_username") String username, @RequestParam("j_password") String credentials) {
160 System.out.println("Try to authenticate with LDAP: username: " + username + ", credentials: " + credentials);
161 if (authenticate(username, credentials)) {