]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/main/Signup.java
Add the "password strength" check
[gigi.git] / src / org / cacert / gigi / pages / main / Signup.java
1 package org.cacert.gigi.pages.main;
2
3 import java.io.IOException;
4 import java.io.InputStreamReader;
5 import java.io.PrintWriter;
6 import java.io.UnsupportedEncodingException;
7 import java.sql.PreparedStatement;
8 import java.sql.ResultSet;
9 import java.sql.SQLException;
10 import java.util.Date;
11 import java.util.HashMap;
12
13 import javax.servlet.ServletRequest;
14 import javax.servlet.http.HttpServletRequest;
15
16 import org.cacert.gigi.Language;
17 import org.cacert.gigi.User;
18 import org.cacert.gigi.database.DatabaseConnection;
19 import org.cacert.gigi.output.DateSelector;
20 import org.cacert.gigi.output.Template;
21 import org.cacert.gigi.pages.Page;
22 import org.cacert.gigi.util.EmailChecker;
23 import org.cacert.gigi.util.HTMLEncoder;
24 import org.cacert.gigi.util.PasswordStrengthChecker;
25
26 public class Signup {
27         User buildup = new User();
28         String password;
29         String password2;
30         Template t;
31         boolean general = true, country = true, regional = true, radius = true;
32         public Signup() {
33                 try {
34                         t = new Template(new InputStreamReader(
35                                         Signup.class.getResourceAsStream("Signup.templ"), "UTF-8"));
36                 } catch (UnsupportedEncodingException e) {
37                         e.printStackTrace();
38                 }
39                 buildup.setFname("");
40                 buildup.setMname("");
41                 buildup.setLname("");
42                 buildup.setSuffix("");
43                 buildup.setEmail("");
44                 buildup.setDob(new Date(0));
45         }
46         DateSelector myDoB = new DateSelector("day", "month", "year");
47
48         public void writeForm(PrintWriter out, Language l) {
49                 HashMap<String, Object> vars = new HashMap<String, Object>();
50                 vars.put("fname", HTMLEncoder.encodeHTML(buildup.getFname()));
51                 vars.put("mname", HTMLEncoder.encodeHTML(buildup.getMname()));
52                 vars.put("lname", HTMLEncoder.encodeHTML(buildup.getLname()));
53                 vars.put("suffix", HTMLEncoder.encodeHTML(buildup.getSuffix()));
54                 vars.put("dob", myDoB);
55                 vars.put("email", HTMLEncoder.encodeHTML(buildup.getEmail()));
56                 vars.put("general", general ? " checked=\"checked\"" : "");
57                 vars.put("country", country ? " checked=\"checked\"" : "");
58                 vars.put("regional", regional ? " checked=\"checked\"" : "");
59                 vars.put("radius", radius ? " checked=\"checked\"" : "");
60                 vars.put(
61                                 "helpOnNames",
62                                 String.format(
63                                                 l.getTranslation("Help on Names %sin the wiki%s"),
64                                                 "<a href=\"//wiki.cacert.org/FAQ/HowToEnterNamesInJoinForm\" target=\"_blank\">",
65                                                 "</a>"));
66                 t.output(out, l, vars);
67         }
68         private void update(HttpServletRequest r) {
69                 if (r.getParameter("fname") != null) {
70                         buildup.setFname(r.getParameter("fname"));
71                 }
72                 if (r.getParameter("lname") != null) {
73                         buildup.setLname(r.getParameter("lname"));
74                 }
75                 if (r.getParameter("mname") != null) {
76                         buildup.setMname(r.getParameter("mname"));
77                 }
78                 if (r.getParameter("suffix") != null) {
79                         buildup.setSuffix(r.getParameter("suffix"));
80                 }
81                 if (r.getParameter("email") != null) {
82                         buildup.setEmail(r.getParameter("email"));
83                 }
84                 general = "1".equals(r.getParameter("general"));
85                 country = "1".equals(r.getParameter("country"));
86                 regional = "1".equals(r.getParameter("regional"));
87                 radius = "1".equals(r.getParameter("radius"));
88                 myDoB.update(r);
89         }
90
91         public boolean submit(PrintWriter out, HttpServletRequest req) {
92                 update(req);
93                 boolean failed = false;
94                 out.println("<div class='formError'>");
95                 if (buildup.getFname().equals("") || buildup.getLname().equals("")) {
96                         outputError(out, req, "First and/or last names were blank.");
97                         failed = true;
98                 }
99                 if (!myDoB.isValid()) {
100                         outputError(out, req, "Invalid date of birth");
101                         failed = true;
102                 }
103                 if (!"1".equals(req.getParameter("cca_agree"))) {
104                         outputError(out, req,
105                                         "You have to agree to the CAcert Community agreement.");
106                         failed = true;
107                 }
108                 if (buildup.getEmail().equals("")) {
109                         outputError(out, req, "Email Address was blank");
110                         failed = true;
111                 }
112                 String pw1 = req.getParameter("pword1");
113                 String pw2 = req.getParameter("pword2");
114                 if (pw1 == null || pw1.equals("")) {
115                         outputError(out, req, "Pass Phrases were blank");
116                         failed = true;
117                 } else if (!pw1.equals(pw2)) {
118                         outputError(out, req, "Pass Phrases don't match");
119                         failed = true;
120                 }
121                 int pwpoints = PasswordStrengthChecker.checkpw(pw1, buildup);
122                 if (pwpoints < 3) {
123                         outputError(
124                                         out,
125                                         req,
126                                         "The Pass Phrase you submitted failed to contain enough"
127                                                         + " differing characters and/or contained words from"
128                                                         + " your name and/or email address.");
129                 }
130                 if (failed) {
131                         out.println("</div>");
132                         return false;
133                 }
134                 try {
135                         PreparedStatement q1 = DatabaseConnection.getInstance().prepare(
136                                         "select * from `email` where `email`=? and `deleted`=0");
137                         PreparedStatement q2 = DatabaseConnection.getInstance().prepare(
138                                         "select * from `users` where `email`=? and `deleted`=0");
139                         q1.setString(1, buildup.getEmail());
140                         q2.setString(1, buildup.getEmail());
141                         ResultSet r1 = q1.executeQuery();
142                         ResultSet r2 = q2.executeQuery();
143                         if (r1.next() || r2.next()) {
144                                 outputError(out, req,
145                                                 "This email address is currently valid in the system.");
146                                 failed = true;
147                         }
148                         r1.close();
149                         r2.close();
150                         PreparedStatement q3 = DatabaseConnection
151                                         .getInstance()
152                                         .prepare(
153                                                         "select `domain` from `baddomains` where `domain`=RIGHT(?, LENGTH(`domain`))");
154                         q3.setString(1, buildup.getEmail());
155
156                         ResultSet r3 = q3.executeQuery();
157                         if (r3.next()) {
158                                 String domain = r3.getString(1);
159                                 out.print("<div>");
160                                 out.print(String.format(
161                                                 Page.translate(req,
162                                                                 "We don't allow signups from people using email addresses from %s"),
163                                                 domain));
164                                 out.println("</div>");
165                                 failed = true;
166                         }
167                         r3.close();
168                 } catch (SQLException e) {
169                         e.printStackTrace();
170                         failed = true;
171                 }
172                 String mailResult = EmailChecker.FAIL;
173                 try {
174                         mailResult = EmailChecker.checkEmailServer(0, buildup.getEmail());
175                 } catch (IOException e) {
176                 }
177                 if (!mailResult.equals(EmailChecker.OK)) {
178                         if (mailResult.startsWith("4")) {
179                                 outputError(
180                                                 out,
181                                                 req,
182                                                 "The mail server responsible for your domain indicated"
183                                                                 + " a temporary failure. This may be due to anti-SPAM measures, such"
184                                                                 + " as greylisting. Please try again in a few minutes.");
185                         } else {
186                                 outputError(
187                                                 out,
188                                                 req,
189                                                 "Email Address given was invalid, or a test connection"
190                                                                 + " couldn't be made to your server, or the server"
191                                                                 + " rejected the email address as invalid");
192                         }
193                         if (mailResult.equals(EmailChecker.FAIL)) {
194                                 outputError(out, req,
195                                                 "Failed to make a connection to the mail server");
196                         } else {
197                                 out.print("<div>");
198                                 out.print(mailResult);
199                                 out.println("</div>");
200                         }
201                         failed = true;
202                 }
203
204                 out.println("</div>");
205                 if (failed) {
206                         return false;
207                 }
208                 // TODO start getting to work
209                 return true;
210         }
211         private void outputError(PrintWriter out, ServletRequest req, String text) {
212                 out.print("<div>");
213                 out.print(Page.translate(req, text));
214                 out.println("</div>");
215         }
216 }