1 package compbio.controllers;
4 import java.util.regex.Pattern;
6 import javax.naming.directory.DirContext;
8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.dao.DataIntegrityViolationException;
10 import org.springframework.mail.SimpleMailMessage;
11 import org.springframework.security.ldap.LdapUtils;
12 import org.springframework.ldap.core.ContextSource;
13 import org.springframework.stereotype.Controller;
14 import org.springframework.ui.Model;
15 import org.springframework.ui.ModelMap;
16 import org.springframework.validation.BindingResult;
17 import org.springframework.validation.FieldError;
18 import org.springframework.web.bind.annotation.ModelAttribute;
19 import org.springframework.web.bind.annotation.RequestMapping;
20 import org.springframework.web.bind.annotation.RequestMethod;
21 import org.springframework.web.bind.annotation.RequestParam;
23 import compbio.proteocache.users.User;
24 import compbio.proteocache.users.UserManager;
25 import compbio.cassandra.CassandraUserManager;
28 * @author Alexander Sherstnev
29 * @author Natasha Sherstneva
30 * @version 1.0 Dec 2013
33 public class UserController extends BasicController {
36 ContextSource contextSource;
38 // JavaMailSender mailSender;
39 private final Pattern EMAIL = Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
41 @RequestMapping(value = "/register/query", method = RequestMethod.GET)
42 public String RegisterForm(ModelMap model) {
43 User user = new User();
44 model.addAttribute(user);
48 @RequestMapping(value = "/register/edit/query", method = RequestMethod.GET)
49 public String AccountForm(ModelMap model) {
50 model.put("username", getPrincipalName());
52 * User user = new User(); user.setFullName("Sasha Sherstnev");
53 * user.setEmail("admin@admin.com"); user.setOrganisation("UoD");
54 * user.setPosition("cleaner"); user.setUpdateByEmail(true);
55 * model.addAttribute("u", user); return "Edit";
57 return "support/Notimplemented";
60 @RequestMapping(value = "/register/do", method = RequestMethod.POST)
61 public String addUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
63 if (bindingResult.hasErrors()) {
67 int fullName = user.getFullName().length();
68 if (fullName < 6 || 50 < fullName) {
69 bindingResult.addError(new FieldError("user", "fullName", "Your full name must be between 3 and 50 symbols long!"));
70 model.addAttribute("error", "wrong password");
74 if (!EMAIL.matcher(user.getEmail()).find()) {
75 bindingResult.addError(new FieldError("user", "email", "Email is empty or in a wrong form!"));
76 model.addAttribute("error", "wrong email");
80 int password = user.getPassword().length();
81 if (password < 6 || 20 < password) {
82 bindingResult.addError(new FieldError("user", "password", "The password must be at least 6 symbols long!"));
83 model.addAttribute("error", "wrong password");
88 if (null != user.getOrganisation())
89 organisation = user.getOrganisation().length();
90 if (organisation < 3 || 250 < organisation) {
91 bindingResult.addError(new FieldError("user", "organisation", "The organisation must be between 3 and 250 symbols long!"));
92 model.addAttribute("error", "wrong organisation name");
96 user.setRegistrationDate(new Date());
97 CassandraUserManager cm = new CassandraUserManager();
100 } catch (DataIntegrityViolationException e) {
101 bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
102 model.addAttribute("error", "used email");
105 if (user.isUpdateByEmail()) {
106 subscribeToList(user.getEmail());
109 * Account.autoLogin(user, request, authenticationManager);
111 return "redirect:/index";
114 @RequestMapping(value = "/register/edit/do", method = RequestMethod.POST)
115 public String editUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
117 if (bindingResult.hasErrors()) {
121 user.setRegistrationDate(new Date());
122 UserManager cm = new CassandraUserManager();
125 } catch (DataIntegrityViolationException e) {
126 bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
129 if (user.isUpdateByEmail()) {
130 subscribeToList(user.getEmail());
133 return "redirect:/index";
136 private void subscribeToList(String email) {
137 SimpleMailMessage message = new SimpleMailMessage();
138 message.setFrom(email);
139 message.setTo("proteocache-discuss-subscribe@compbio.dundee.ac.uk");
140 message.setSubject("ProteoCache mailing list subscription");
141 message.setText("testing " + email);
142 // mailSender.send(message);
145 private boolean authenticate(String userDn, String credentials) {
146 DirContext ctx = null;
148 ctx = contextSource.getContext(userDn, credentials);
150 } catch (Exception e) {
151 // Context creation failed - authentication did not succeed
152 System.out.println("LDAP Login failed");
155 // It is imperative that the created DirContext instance is always
157 LdapUtils.closeContext(ctx);
161 @RequestMapping(value = "/ldaplogindo", method = RequestMethod.POST)
162 public String LDAPlogin(Model model, @RequestParam("j_username") String username, @RequestParam("j_password") String credentials) {
163 System.out.println("Try to authenticate with LDAP: username: " + username + ", credentials: " + credentials);
164 if (authenticate(username, credentials)) {