Fix problm with username
[proteocache.git] / server / compbio / controllers / UserController.java
1 package compbio.controllers;
2
3 import java.util.Date;
4 import java.util.regex.Pattern;
5
6 import javax.naming.directory.DirContext;
7
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;
22
23 import compbio.proteocache.users.User;
24 import compbio.proteocache.users.UserManager;
25 import compbio.cassandra.CassandraUserManager;
26
27 /**
28  * @author Alexander Sherstnev
29  * @author Natasha Sherstneva
30  * @version 1.0 Dec 2013
31  */
32 @Controller
33 public class UserController extends BasicController {
34
35         @Autowired
36         ContextSource contextSource;
37
38         // JavaMailSender mailSender;
39         private final Pattern EMAIL = Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
40
41         @RequestMapping(value = "/register/query", method = RequestMethod.GET)
42         public String RegisterForm(ModelMap model) {
43                 User user = new User();
44                 model.addAttribute(user);
45                 return "Register";
46         }
47
48         @RequestMapping(value = "/register/edit/query", method = RequestMethod.GET)
49         public String AccountForm(ModelMap model) {
50                 model.put("username", getPrincipalName());
51                 /*
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";
56                  */
57                 return "support/Notimplemented";
58         }
59
60         @RequestMapping(value = "/register/do", method = RequestMethod.POST)
61         public String addUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
62
63                 if (bindingResult.hasErrors()) {
64                         return "Register";
65                 }
66
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");
71                         return "Register";
72                 }
73
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");
77                         return "Register";
78                 }
79
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");
84                         return "Register";
85                 }
86
87                 int organisation = 0;
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");
93                         return "Register";
94                 }
95
96                 user.setRegistrationDate(new Date());
97                 CassandraUserManager cm = new CassandraUserManager();
98                 try {
99                         cm.addUser(user);
100                 } catch (DataIntegrityViolationException e) {
101                         bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
102                         model.addAttribute("error", "used email");
103                         return "Register";
104                 }
105                 if (user.isUpdateByEmail()) {
106                         subscribeToList(user.getEmail());
107                 }
108                 /*
109                  * Account.autoLogin(user, request, authenticationManager);
110                  */
111                 return "redirect:/index";
112         }
113
114         @RequestMapping(value = "/register/edit/do", method = RequestMethod.POST)
115         public String editUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
116
117                 if (bindingResult.hasErrors()) {
118                         return "Register";
119                 }
120
121                 user.setRegistrationDate(new Date());
122                 UserManager cm = new CassandraUserManager();
123                 try {
124                         cm.addUser(user);
125                 } catch (DataIntegrityViolationException e) {
126                         bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
127                         return "Register";
128                 }
129                 if (user.isUpdateByEmail()) {
130                         subscribeToList(user.getEmail());
131                 }
132
133                 return "redirect:/index";
134         }
135
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);
143         }
144
145         private boolean authenticate(String userDn, String credentials) {
146                 DirContext ctx = null;
147                 try {
148                         ctx = contextSource.getContext(userDn, credentials);
149                         return true;
150                 } catch (Exception e) {
151                         // Context creation failed - authentication did not succeed
152                         System.out.println("LDAP Login failed");
153                         return false;
154                 } finally {
155                         // It is imperative that the created DirContext instance is always
156                         // closed
157                         LdapUtils.closeContext(ctx);
158                 }
159         }
160
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)) {
165                         return "/home";
166                 }
167                 return "/public";
168         }
169
170 }