Project

General

Profile

1
package eu.dnetlib.openaire.usermanagement;
2

    
3
import com.unboundid.ldap.sdk.LDAPException;
4
import eu.dnetlib.openaire.user.utils.EmailSender;
5
import org.apache.commons.validator.routines.EmailValidator;
6
import eu.dnetlib.openaire.user.utils.LDAPActions;
7
import eu.dnetlib.openaire.user.utils.VerificationActions;
8
import eu.dnetlib.openaire.user.utils.VerifyRecaptcha;
9
import eu.dnetlib.openaire.usermanagement.utils.UrlConstructor;
10
import org.apache.log4j.Logger;
11
import org.springframework.beans.factory.annotation.Autowired;
12
import org.springframework.beans.factory.annotation.Value;
13
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
14

    
15
import javax.mail.MessagingException;
16
import javax.mail.internet.AddressException;
17
import javax.mail.internet.InternetAddress;
18
import javax.servlet.ServletConfig;
19
import javax.servlet.ServletException;
20
import javax.servlet.http.HttpServlet;
21
import javax.servlet.http.HttpServletRequest;
22
import javax.servlet.http.HttpServletResponse;
23
import java.io.IOException;
24
import java.io.PrintWriter;
25
import java.sql.Timestamp;
26
import java.util.Date;
27
import java.util.UUID;
28

    
29
/**
30
 * Created by sofia on 20/10/2017.
31
 */
32
public class RegisterServlet extends HttpServlet {
33

    
34
    @Autowired
35
    private VerificationActions verificationActions;
36

    
37
    @Autowired
38
    private EmailSender emailSender;
39

    
40
    @Autowired
41
    private LDAPActions ldapActions;
42

    
43
    @Value("${google.recaptcha.secret}")
44
    private String secret;
45

    
46
    @Value("${google.recaptcha.key}")
47
    private String sitekey;
48

    
49

    
50
    public void init(ServletConfig config) throws ServletException {
51
        super.init(config);
52
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
53
                config.getServletContext());
54
        config.getServletContext().setAttribute("sitekey", sitekey);
55
    }
56

    
57
    private static Logger logger = Logger.getLogger(RegisterServlet.class);
58

    
59
        @Override
60
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
61
        response.setContentType("text/html");
62
        PrintWriter printWriter = response.getWriter();
63

    
64
        String firstName = request.getParameter("first_name").trim();
65
        String lastName = request.getParameter("last_name").trim();
66
        String organization = request.getParameter("organization").trim();
67
        String username = request.getParameter("username").trim();
68
        String email =request.getParameter("email").trim();
69
        String confirmEmail = request.getParameter("email_conf").trim();
70
        String password = request.getParameter("password");
71
        String confirmPassword = request.getParameter("password_conf");
72

    
73
        String gRecaptchaResponse = request.getParameter("g-recaptcha-response");
74

    
75
        boolean isRecaptchaVerified = VerifyRecaptcha.verify(gRecaptchaResponse, secret);
76
        //System.out.println("RESPONSE " + gRecaptchaResponse);
77

    
78
        if (organization == null){
79
            logger.info("organization is null");
80
        }
81

    
82
        if (firstName != null && lastName != null &&  username != null && email!= null &&
83
                email.equals(confirmEmail) && password!= null && password.equals(confirmPassword) &&
84
                EmailValidator.getInstance().isValid(email) && isValidPassword(password) && isRecaptchaVerified) {
85
            try {
86

    
87
                 if (username.matches("^[a-zA-Z0-9][a-zA-Z0-9\\.\\_\\-]{4,150}") && !ldapActions.usernameExists(username) && !ldapActions.emailExists(email)
88
                         && !ldapActions.isZombieUsersEmail(email) && !ldapActions.isZombieUsersUsername(username) && EmailValidator.getInstance().isValid(email)) {
89

    
90
                     ldapActions.createZombieUser(username, email, firstName, lastName, organization, password);
91
                     logger.info("Zombie user successfully created");
92

    
93
                     UUID verificationCode = UUID.randomUUID();
94
                     Date creationDate = new Date();
95
                     String vCode = verificationCode.toString();
96

    
97
                     Timestamp timestamp = new Timestamp(creationDate.getTime());
98

    
99
                     if (!verificationActions.verificationEntryExists(username)) {
100
                         verificationActions.addVerificationEntry(username, vCode, timestamp);
101

    
102
                     } else {
103
                         verificationActions.updateVerificationEntry(username, vCode, timestamp);
104
                     }
105

    
106
                     String resultPath = UrlConstructor.getRedirectUrl(request, "activate.jsp");
107
                     String resultPathWithVCode = UrlConstructor.getVerificationLink(resultPath, vCode);
108

    
109
                     String verificationCodeMsg = "<p>Hello " + username + ",</p>" +
110
                             "<p> A request has been made to verify your email and activate your OpenAIRE account. To activate your " +
111
                             "account, you will need to submit your username and this activation code in order to verify that the" +
112
                             "request was legitimate.</p>" +
113
                             "<p>" +
114
                             "The activation code is " + vCode +
115
                             "</p>" +
116
                             "Click the URL below and proceed with activating your password." +
117
                             "<p><a href=" + resultPathWithVCode + ">" + resultPathWithVCode + "</a></p>" +
118
                             "<p>Thank you</p>";
119

    
120
                     String verificationCodeSubject = "Activate your OpenAIRE account";
121

    
122
                     emailSender.sendEmail(email, verificationCodeSubject, verificationCodeMsg);
123

    
124
                     response.sendRedirect("./activate.jsp");
125

    
126
                 } else {
127

    
128
                     validateUsername(request, username);
129

    
130
                     if (ldapActions.usernameExists(username) || ldapActions.isZombieUsersUsername(username)) {
131
                        request.getSession().setAttribute("username_message", "Username already exists! Choose another one.");
132
                        logger.info("Username already exists");
133
                     }
134

    
135
                     if (!EmailValidator.getInstance().isValid(email)) {
136
                         request.getSession().setAttribute("email_message", "Please enter a valid email.");
137
                         logger.info("Invalid email.");
138
                     }
139

    
140
                     if (ldapActions.emailExists(email)) {
141
                         request.getSession().setAttribute("email_message", "There is another user with this email.");
142
                         logger.info("There is another user with this email");
143
                     }
144

    
145
                     if (ldapActions.isZombieUsersEmail(email)) {
146
                         request.getSession().setAttribute("email_message", "You have already registered with this email address! Please check your email to activate your account or contact OpenAIRE <a href=\"https://www.openaire.eu/support/helpdesk\">helpdesk</a>.");
147
                         logger.info("There is another user with this email");
148
                     }
149

    
150
                     request.getSession().setAttribute("first_name", firstName);
151
                     request.getSession().setAttribute("msg_first_name_error_display", "display:none");
152

    
153
                     request.getSession().setAttribute("last_name", lastName);
154
                     request.getSession().setAttribute("msg_last_name_error_display", "display:none");
155

    
156
                     request.getSession().setAttribute("organization", organization);
157
                     request.getSession().setAttribute("username", username);
158
                     request.getSession().setAttribute("email", email);
159
                     request.getSession().setAttribute("msg_email_error_display", "display:none" );
160

    
161
                     request.getSession().setAttribute("email_conf", confirmEmail);
162
                     request.getSession().setAttribute("msg_email_conf_error_display", "display:none");
163
                     request.getSession().setAttribute("msg_email_validation_error_display", "display:none");
164

    
165
                     request.getSession().setAttribute("msg_password_error_display", "display:none" );
166
                     request.getSession().setAttribute("msg_pass_conf_error_display", "display:none" );
167
                     request.getSession().setAttribute("msg_invalid_password_display", "display:none");
168

    
169
                     request.getSession().setAttribute("recaptcha_error_display", "display:none");
170

    
171
                     response.sendRedirect("./register.jsp");
172
                 }
173

    
174

    
175
            } catch (MessagingException e) {
176
                logger.error("Error in sending email", e);
177
                request.getSession().setAttribute("message","Error sending email");
178
                response.sendRedirect(UrlConstructor.getRedirectUrl(request, "./register.jsp"));
179
                //response.sendRedirect("./error.jsp");
180

    
181
                //TODO better handling of these exceprions
182
            }catch (Exception e) {
183
                logger.error("LDAP error in creating user", e);
184
                response.sendRedirect(UrlConstructor.getRedirectUrl(request, "error.jsp"));
185
                //response.sendRedirect("./error.jsp");
186
            }
187

    
188
        } else {
189

    
190
            request.getSession().setAttribute("first_name", firstName);
191
            request.getSession().setAttribute("last_name", lastName);
192
            request.getSession().setAttribute("organization", organization);
193
            request.getSession().setAttribute("username", username);
194
            request.getSession().setAttribute("email", email);
195
            request.getSession().setAttribute("email_conf", confirmEmail);
196

    
197
            if (firstName == null || firstName.isEmpty()) {
198
                logger.info("No first name");
199
                request.getSession().setAttribute("msg_first_name_error_display", "display:block" );
200
            }
201

    
202
            if (lastName == null || lastName.isEmpty()) {
203
                logger.info("No last name");
204
                request.getSession().setAttribute("msg_last_name_error_display", "display:block" );
205
            }
206

    
207
            if (username == null || username.isEmpty()) {
208
                request.getSession().setAttribute("username_message", "Minimum username length 5 characters.");
209
                logger.info("No username");
210

    
211
            } else {
212
                validateUsername(request, username);
213
            }
214

    
215
            if (password == null || password.isEmpty()) {
216
                logger.info("No valid password");
217
                request.getSession().setAttribute("msg_password_error_display", "display:block" );
218
            }
219

    
220
            if(!EmailValidator.getInstance().isValid(email)) {
221
                logger.info("No valid e-mail");
222
                request.getSession().setAttribute("msg_email_validation_error_display", "display:block");
223
            }
224

    
225
            if (!email.equals(confirmEmail)) {
226
                logger.info("No matching e-mails");
227
                request.getSession().setAttribute("msg_email_conf_error_display", "display:block" );
228
            }
229

    
230
            if(!isValidPassword(password)) {
231
                logger.info("No valid password");
232
                request.getSession().setAttribute("msg_invalid_password_display", "display:block");
233
            }
234

    
235
            if (!password.equals(confirmPassword)){
236
                logger.info("No matching passwords");
237
                request.getSession().setAttribute("msg_pass_conf_error_display", "display:block" );
238
            }
239

    
240
            if (!isRecaptchaVerified) {
241
                logger.info("No valid recaptcha");
242
                request.getSession().setAttribute("recaptcha_error_display", "display:block" );
243
            }
244

    
245
            response.sendRedirect("./register.jsp");
246

    
247
        }
248

    
249
        printWriter.close();
250

    
251
    }
252

    
253
    private void validateUsername(HttpServletRequest request, String username) {
254

    
255
            if(!username.matches("^[a-zA-Z0-9][a-zA-Z0-9\\.\\_\\-]{4,150}")) {
256

    
257
                logger.info("No valid username");
258
                if (username.length() < 5) {
259
                    request.getSession().setAttribute("username_message", "Minimum username length 5 characters.");
260
                    logger.info("Minimum username length 5 characters.");
261
                }
262

    
263
                if (username.length() > 150) {
264
                    request.getSession().setAttribute("username_message", "Maximum username length 150 characters.");
265
                    logger.info("Maximum username length 150 characters.");
266
                }
267

    
268
                if (!username.matches("^[a-zA-Z0-9\\.\\_\\-]")) {
269
                    request.getSession().setAttribute("username_allowed_chars_message", "You can use letters, numbers, underscores, hyphens and periods.");
270
                    logger.info("Only letters, numbers, underscores, hyphens and periods.");
271
                }
272

    
273
                if (!username.matches("^[a-zA-Z0-9].*")) {
274
                    request.getSession().setAttribute("username_first_char_message", "The username must start with letter or digit.");
275
                    logger.info("The username must start with letter or digit.");
276
                }
277
            }
278
    }
279

    
280
    public static boolean isValidPassword(String password) {
281
        /*
282
             ^                 # start-of-string
283
            (?=.*[0-9])       # a digit must occur at least once
284
            (?=.*[a-z])       # a lower case letter must occur at least once
285
            (?=.*[A-Z])       # an upper case letter must occur at least once
286
            (?=.*[@#$%^&+=])  # a special character must occur at least once. This has been removed.
287
                              # Please add if special character is needed.
288
            (?=\S+$)          # no whitespace allowed in the entire string
289
            .{8,}             # anything, at least eight places though
290
            $                 # end-of-string
291
         */
292

    
293
        if (password.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=\\S+$).{6,}$")) {
294
            logger.info("Valid password!");
295
            return true;
296
        }
297

    
298
        logger.info("Not valid password!");
299
        return false;
300
    }
301
}
302

    
(4-4/7)