01d24ac68473770951b816b4109a6775dfac4d22
[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 @Controller
28 public class UserController {
29
30         @Autowired
31         ContextSource contextSource;
32
33         // JavaMailSender mailSender;
34         private final Pattern EMAIL = Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
35
36         @RequestMapping(value = "/register/query", method = RequestMethod.GET)
37         public String RegisterForm(ModelMap model) {
38                 User user = new User();
39                 model.addAttribute(user);
40                 return "Register";
41         }
42
43         @RequestMapping(value = "/register/edit/query", method = RequestMethod.GET)
44         public String AccountForm(ModelMap model) {
45                 /*
46                 User user = new User();
47                 user.setFullName("Sasha Sherstnev");
48                 user.setEmail("admin@admin.com");
49                 user.setOrganisation("UoD");
50                 user.setPosition("cleaner");
51                 user.setUpdateByEmail(true);
52                 model.addAttribute("u", user);
53                 return "Edit";
54                 */
55                 return "support/Notimplemented";
56         }
57
58         @RequestMapping(value = "/register/do", method = RequestMethod.POST)
59         public String addUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
60
61                 if (bindingResult.hasErrors()) {
62                         return "Register";
63                 }
64
65                 int fullName = user.getFullName().length();
66                 if (fullName < 6 || 50 < fullName) {
67                         bindingResult.addError(new FieldError("user", "fullName", "Your full name must be between 3 and 50 symbols long!"));
68                         model.addAttribute("error", "wrong password");
69                         return "Register";
70                 }
71
72                 if (!EMAIL.matcher(user.getEmail()).find()) {
73                         bindingResult.addError(new FieldError("user", "email", "Email is empty or in a wrong form!"));
74                         model.addAttribute("error", "wrong email");
75                         return "Register";
76                 }
77
78                 int password = user.getPassword().length();
79                 if (password < 6 || 20 < password) {
80                         bindingResult.addError(new FieldError("user", "password", "The password must be at least 6 symbols long!"));
81                         model.addAttribute("error", "wrong password");
82                         return "Register";
83                 }
84
85                 int organisation = 0;
86                 if (null != user.getOrganisation())
87                         organisation = user.getOrganisation().length();
88                 if (organisation < 3 || 250 < organisation) {
89                         bindingResult.addError(new FieldError("user", "organisation", "The organisation must be between 3 and 250 symbols long!"));
90                         model.addAttribute("error", "wrong organisation name");
91                         return "Register";
92                 }
93
94                 user.setRegistrationDate(new Date());
95                 CassandraUserManager cm = new CassandraUserManager();
96                 try {
97                         cm.addUser(user);
98                 } catch (DataIntegrityViolationException e) {
99                         bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
100                         model.addAttribute("error", "used email");
101                         return "Register";
102                 }
103                 if (user.isUpdateByEmail()) {
104                         subscribeToList(user.getEmail());
105                 }
106                 /*
107                  * Account.autoLogin(user, request, authenticationManager);
108                  */
109                 return "redirect:/index";
110         }
111
112         @RequestMapping(value = "/register/edit/do", method = RequestMethod.POST)
113         public String editUser(Model model, @ModelAttribute("user") User user, BindingResult bindingResult) {
114
115                 if (bindingResult.hasErrors()) {
116                         return "Register";
117                 }
118
119                 user.setRegistrationDate(new Date());
120                 UserManager cm = new CassandraUserManager();
121                 try {
122                         cm.addUser(user);
123                 } catch (DataIntegrityViolationException e) {
124                         bindingResult.addError(new FieldError("user", "email", "This email (username) is already in use!"));
125                         return "Register";
126                 }
127                 if (user.isUpdateByEmail()) {
128                         subscribeToList(user.getEmail());
129                 }
130
131                 return "redirect:/index";
132         }
133
134         private void subscribeToList(String email) {
135                 SimpleMailMessage message = new SimpleMailMessage();
136                 message.setFrom(email);
137                 message.setTo("proteocache-discuss-subscribe@compbio.dundee.ac.uk");
138                 message.setSubject("ProteoCache mailing list subscription");
139                 message.setText("testing " + email);
140                 // mailSender.send(message);
141         }
142
143         private boolean authenticate(String userDn, String credentials) {
144                 DirContext ctx = null;
145                 try {
146                         ctx = contextSource.getContext(userDn, credentials);
147                         return true;
148                 } catch (Exception e) {
149                         // Context creation failed - authentication did not succeed
150                         System.out.println("LDAP Login failed");
151                         return false;
152                 } finally {
153                         // It is imperative that the created DirContext instance is always
154                         // closed
155                         LdapUtils.closeContext(ctx);
156                 }
157         }
158
159         @RequestMapping(value = "/ldaplogindo", method = RequestMethod.POST)
160         public String LDAPlogin(Model model, @RequestParam("j_username") String username, @RequestParam("j_password") String credentials) {
161                 System.out.println("Try to authenticate with LDAP: username: " + username + ", credentials: " + credentials);
162                 if (authenticate(username, credentials)) {
163                         return "/home";
164                 }
165                 return "/public";
166         }
167
168 }